Creating Offers and Generating Documents
Prerequisites
- You have received your API Key (for stable and production environment)
Creating Offers for New Customers
Option 1: Download Application Document
If you already have information about the customer within your internal system, you can directly create an offer using the Partner Platform API mutation createOffer. This will:
- Create the customer in our system
- Generate a
Contract ID - Allow you to request the application form PDF
Wait approximately 30 seconds before requesting documents after creating an offer. This allows our systems to sync with the insurance system.
Option 2: Partner Life Integration
You can also view the offer in Partner Life by using:
- The
Contract IDas a redirect parameter - A magic link generated using
createPartnerLifeMagicLinkmutation
The URL format will be:
https://partner.life.li/en/magic-link/<Magic Link Token>?redirect=%2Fmy%2Foffers%2F<Contract ID>
This will automatically log in the partner and redirect them to the offer page.
The same redirect parameter can send the advisor to the customer instead, or to the product catalogue scoped to them — so the offer is configured in Partner Life rather than assembled through createOffer, and nothing is created until they pick a product. See Deep Linking for every destination.
Option 3: End-to-End Submission via API
If you want to own the entire offer lifecycle inside your own software — collecting the signed application form, uploading identity documents, and submitting the offer for issuance — use the upload + submit mutations on top of Option 1. Nothing about Option 1 changes; this option simply continues from the downloaded PDF.
- Create the offer with
createOfferand download the application form PDF (Option 1) - Get the customer to sign the application form
- Upload the signed form and the customer's identity document with
uploadDocument - Submit the offer for issuance with
submitOffer - (Optional) Track the offer lifecycle with
offerStatusand respond to anyopenReworks
See the Uploading Required Documents and Submitting the Offer sections below for the full mutation reference.
Creating Offers for Existing Customers
For customers who already have a policy or offer where you are the broker, you can:
- Use their customer ID (from our system)
- Use their email address linked to existing policies
A customer you registered through createCustomer counts as an existing customer from the moment it returns, before any offer exists.
We will soon provide a way to fetch the list of customers associated with your Partner account (including sub-brokers) using the customers query with filters.
API Reference
Creating a New Offer
The createOffer mutation handles both new and existing customers. The operation includes comprehensive error handling:
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on ErrorInterface {
__typename
message
}
... on CreatedOffer {
contractID
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
Preview prompt
I need to create a Liechtenstein Life Invest offer via the Prosperity Partner Platform GraphQL API. This is a unit-linked life insurance product for the German market.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"liechtensteinLifeInvest": {
"associatedPersons": [
{
"role": ["MAILING", "INSURED_PERSON", "POLICY_HOLDER", "PAYER", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "customer@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "2000-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [{ "country": "DE", "id": "96618720548" }]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "Berlin",
"street": "Frankfurter Allee",
"zip": "10367",
"houseNumber": "23A"
},
"identification": {
"birthPlace": "Tokyo",
"documentNumber": "AR12333323232",
"documentType": "PASSPORT",
"issueDate": "2025-01-01",
"issuedBy": "Govt of Japan",
"validUntil": "2026-01-01"
}
}
}
}
],
"productConfiguration": {
"premiumDynamicPercentage": 10,
"ageUntilPremiumIsPaid": 73,
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 82,
"monthlyPremium": 10000,
"startDate": "2025-05-01",
"language": "DE_DE",
"deathCoveragePercentage": 100,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "IE0004766675", "percentage": 100 }],
"goals": { "taxBenefit": false, "flexibility": true, "longTerm": true },
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
}
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": { "wireTransfer": true },
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"weight": 47,
"height": 156
}
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""
Different products can support different roles.
"""
enum LiechtensteinLifeInvestPolicyPersonRole {
POLICY_HOLDER
INSURED_PERSON
PAYER
MAILING
ECONOMIC_INTEREST
}
"""
Input to associated persons for the policy
"""
input LiechtensteinLifeInvestAssociatedPersonInput {
"""
The roles of the person in the policy.
"""
role: [LiechtensteinLifeInvestPolicyPersonRole!]!
"""
Information about the person associated with the policy.
"""
person: CreateOfferCustomerByInput!
}
"""
Information about the policy beneficiaries for both death and policy maturity.
"""
input LiechtensteinLifeInvestBeneficiariesInput {
"""
Information about the nominated beneficiaries in case of maturity of the policy and the insured person is alive.
"""
lifeBeneficiary: LifeBeneficiaryInput
"""
Information about the nominated beneficiaries in case of death of the insured person.
"""
deathBeneficiary: DeathBeneficiaryInput
"""
Indicates if the death beneficiary is irrevocable.
If set to true, the death beneficiary cannot be changed after the policy is issued.
Default is false.
"""
isDeathBeneficiaryIrrevocable: Boolean
}
"""
Information about the customer's current financial state.
"""
input LiechtensteinLifeInvestFinancialStatusInput {
"""
The reason the customer is applying for a policy.
"""
policyReason: PolicyReason!
"""
The custom reason the customer is applying for a policy when the `PolicyReason` does not cover the use-case.
The value needs to be set when the `policyReason` is set as `OTHER`.
"""
policyReasonOtherText: String
"""
The origin of the money that the customer is using to pay the premiums with.
"""
moneyOrigin: MoneyOrigin!
"""
The custom source of customer's current income when the `moneyOrigin` does not cover the use-case.
The value needs to be set when the `moneyOrigin` is set as `OTHER`.
"""
moneyOriginOtherText: String
"""
Monthly net income of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Total monthly expenses of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Payment method to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
}
"""
Input to provide the medical history of the customer.
**Important**: We only support entry of one critical illness. If the customer has/had more than one
critical illness, the policy application will be rejected.
Weight and height are REQUIRED when ALL of the following conditions are met:
1. The insured person is 75 years or younger at the policy start date
2. No individual death benefit has been selected
3. Total premiums meet either:
- For death benefit option 1: Total premiums until year 6 do not exceed €1 million
- For death benefit option 2: Total premiums until policy end do not exceed €10 million
"""
input LiechtensteinLifeInvestHealthInput {
"""
Indicates if the customer has a critical illness.
Set to false to mark the Health topic as completed in the insurance system.
"""
hasCriticalIllness: Boolean!
"""
Details about the critical illness.
Required if `hasCriticalIllness` is true.
**Note**: If the customer has multiple critical illnesses, the application cannot be accepted.
"""
criticalIllnessDetails: CriticalIllnessDetailsInput
"""
Insured person's weight in kilograms.
Required based on conditions described in the input type documentation.
"""
weight: Int @constraint(min: 1)
"""
Insured person's height in centimeters.
Required based on conditions described in the input type documentation.
"""
height: Int @constraint(min: 1)
}
enum LiechtensteinLifeInvestContractLanguage {
"""
German
"""
DE_DE
"""
English
"""
EN_US
"""
Swiss German
"""
DE_CH
}
"""
Configuration for creating an offer for the Liechtenstein Life Invest insurance product.
"""
input LiechtensteinLifeInvestProductConfigurationInput {
"""
When would the customer like to start the payment for the policy.
We recommend to use the first of the current month as the default value if there is no specific desired start date.
"""
startDate: Date!
"""
Age at which the policy ends and the customer can withdraw funds.
Constraints:
- Minimum: 62 years
- Maximum: 85 years
- Must be greater than the customer's age at start date
"""
ageWhenPolicyEnds: Int! @constraint(min: 62, max: 85)
"""
Age until which the customer will pay premiums.
Constraints:
- Minimum: 18 years
- Maximum: 85 years
- Must be greater than start date age
- Must be at least 5 years from policy start
Default: Same as policy end age
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 85)
"""
Monthly premium amount.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 10000 represents €100.00
"""
monthlyPremium: MonetaryFractionalAmount!
"""
Premium payment frequency.
Valid values:
- 0: Single premium
- 1: Annual
- 2: Semi-annual
- 4: Quarterly
- 12: Monthly (default)
"""
premiumMode: Int @constraint(pattern: "^(0|1|2|4|12)$")
"""
Annual premium increase percentage.
Constraints:
- Minimum: 1%
- Maximum: 10%
Omit this field for no annual adjustment.
"""
premiumDynamicPercentage: Int @constraint(min: 1, max: 10)
"""
One-time payment the customer would like to pay in when the policy starts.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 1000000 represents €10,000.00
"""
additionalPayment: MonetaryFractionalAmount!
"""
Investment strategy configuration including fund selection, risk level,
and sustainability preferences.
"""
investmentStrategy: LiechtensteinLifeInvestInvestmentStrategyInput!
"""
Death benefit percentage above the standard coverage.
The actual payout will be the higher of:
1. Selected percentage of policy value
2. Minimum taxable death benefit:
- First 5 years: 100% of NAV
- After 5 years: 100% NAV + 10% of paid premiums (decreasing linearly to 0% at policy end)
"""
deathCoveragePercentage: Percentage!
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: LiechtensteinLifeInvestContractLanguage
"""
The reduction of the fund administration cost that the customer will have to pay to the broker.
The value is between 0 and 1.
"""
absoluteReductionFundAdministrationCost: Float @constraint(min: 0, max: 1)
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input LiechtensteinLifeInvestInvestmentStrategyInput {
"""
The reasons why the customer is making this investment choice.
"""
goals: InvestmentGoalsInput!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: LiechtensteinLifeInvestSustainabilityDetailsInput!
"""
The funds that the customer/broker selected to invest in.
If `sustainabilityDetails.productConfiguration` is set`, funds selection must be in accordance to the customer's `sustainabilityDetails.productConfiguration`.
e.g. If `percentage` is 50 and `aims` is `ECOLOGICAL`, the `investmentStrategy.fundSelection` should contain at least 50% funds that have a low carbon footprint.
Funds selection should also be in accordance to `riskLevel`: If `riskLevel` is set to `MEDIUM`, fund selection shouldn't contain high risk funds.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
Please talk to our support team if you need more information on the correct fund selection.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
It does not validate sustainability and risk related rules, these are validated by the insurance company and might prevent the policy from being issued.
"""
fundSelection: [FundSelectionInput!]!
"""
Maximum risk level the customer is willing to take with their investment.
In case you are using our broker license and the selected value is `LOW`, a `ConsultationTopic` `RISK_LEVEL` is attached to the offer on creation which needs to be resolved before the customer can submit the offer.
"""
riskLevel: RiskLevel!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
}
"""
Input about the user's knowledge of sustainable investing and sustainable investment choices.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input LiechtensteinLifeInvestSustainabilityDetailsInput {
"""
The current state of user's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
The configuration is in accordance to 2023 standards for ESG investing. The customer is allowed to divert investments on certain topics and also opt to exclude certain topics.
Indicates the various ESG topics that the customer want to invest their funds in.
These topics are used to filter the funds that can be selected for the investment strategy and the percentage of the funds is calculated from the total % of investment in ESG and the level of focus on environmental and social goals.
These topics contribute in being sustainable in environment, social or governance areas.
If none is selected, we assume that the customer is does not want to focus on certain ESG topics and want to invest in funds that are not ESG focused.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
"""
The configuration is in accordance to 2023 standards for ESG investing. The customer is allowed to divert investments on certain topics and also opt to exclude certain topics.
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the user does not want a sustainable product.
"""
percentage: Int!
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in the smallest currency unit (cents for EUR). Example: 10000 = EUR 100.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## What I need
Build the integration to create Liechtenstein Life Invest offers. Map my customer data to the input shape above. Use the stable environment for testing. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Liechtenstein Life Invest
beneficiaries.deathBeneficiary.beneficiaryType accepts PARTNER, HEIRS or POLICY_HOLDER, or supply customBeneficiaries to name the beneficiaries yourself.
POLICY_HOLDER is only accepted when the policy holder and the insured person are two different people. On an offer where one person holds both roles the death benefit would fall due to the person whose death triggers it, so the request returns InputValidationError with invalidInput: BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED.
{
"input": {
"liechtensteinLifeInvest": {
"associatedPersons": [
{
"role": [
"MAILING",
"INSURED_PERSON",
"POLICY_HOLDER",
"PAYER",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "sampleEmailAddress@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "2000-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "DE",
"id": "96618720548"
}
]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "berlin",
"street": "Frankfuter-Alle",
"zip": "10367",
"houseNumber": "23A",
"streetAppendix": "8th Cross"
},
"identification": {
"birthPlace": "Tokyo",
"documentNumber": "AR12333323232",
"documentType": "PASSPORT",
"issueDate": "2025-01-01",
"issuedBy": "Govt of Japan",
"validUntil": "2026-01-01"
}
}
}
}
],
"productConfiguration": {
"premiumDynamicPercentage": 10,
"ageUntilPremiumIsPaid": 73,
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 82,
"monthlyPremium": 10000,
"startDate": "2025-05-01",
"language": "DE_DE",
"deathCoveragePercentage": 100,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "IE0004766675",
"percentage": 100
}
],
"goals": {
"taxBenefit": false,
"flexibility": true,
"longTerm": true
},
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
}
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": {
"wireTransfer": true
},
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"criticalIllnessDetails": null,
"weight": 47,
"height": 156
}
}
}
}
Preview prompt
I need to create a Liechtenstein Life Wealth offer via the Prosperity Partner Platform GraphQL API. This is a premium wealth management life insurance product for the German market. It supports multiple associated persons (additional insured persons and additional policy holders).
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"liechtensteinLifeWealth": {
"associatedPersons": [
{
"role": ["POLICY_HOLDER", "INSURED_PERSON", "PAYER", "MAILING", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "policyholder@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "1976-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [{ "country": "DE", "id": "96618720548" }]
},
"phoneNumber": "+4900000000",
"address": { "country": "DE", "city": "Berlin", "street": "Frankfurter Allee", "zip": "10367", "houseNumber": "23A" },
"identification": { "birthPlace": "Tokyo", "documentNumber": "AR12333323232", "documentType": "PASSPORT", "issueDate": "2025-01-01", "issuedBy": "Govt of Japan", "validUntil": "2026-01-01" }
}
}
},
{
"role": ["ADDITIONAL_INSURED_PERSON"],
"person": {
"newCustomer": {
"email": "insured@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "2000-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": { "taxLiableInUSA": false, "residencies": [{ "country": "DE", "id": "96618720548" }] },
"phoneNumber": "+4900000000",
"address": { "country": "DE", "city": "Berlin", "street": "Frankfurter Allee", "zip": "10367", "houseNumber": "23A" }
}
}
}
],
"productConfiguration": {
"premiumDynamicPercentage": 10,
"ageUntilPremiumIsPaid": 73,
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 73,
"regularPremium": 50000,
"startDate": "2025-07-01",
"language": "DE_DE",
"minimumDeathBenefit": "TAX_MINIMUM",
"additionalDeathBenefit": 150,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "IE0004766675", "percentage": 100 }],
"goals": { "taxBenefit": false, "flexibility": true, "longTerm": true },
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
},
"maturityManagement": true,
"deathCoveragePayout": "FIRST_TO_DIE",
"additionalPolicyHolderPercentage": 50
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": { "wireTransfer": true },
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000
},
"insuredPersonsHealthStatus": { "hasCriticalIllness": false, "hasNoMedicalConditions": true, "hasNoMedicalConsultation": true, "weight": 47, "height": 156 },
"additionalInsuredPersonsHealthStatus": { "hasCriticalIllness": false, "hasNoMedicalConditions": true, "hasNoMedicalConsultation": true, "weight": 47, "height": 156 },
"beneficiaries": {
"lifeBeneficiary": { "beneficiaryType": "POLICY_HOLDER" },
"deathBeneficiary": { "beneficiaryType": "PARTNER" },
"isDeathBeneficiaryIrrevocable": true,
"beneficiaryRights": "REVOCABLE",
"termFixRights": "REVOCABLE"
}
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""
Different products can support different roles.
"""
enum LiechtensteinLifeWealthPolicyPersonRole {
POLICY_HOLDER
INSURED_PERSON
PAYER
MAILING
ECONOMIC_INTEREST
ADDITIONAL_POLICY_HOLDER
ADDITIONAL_INSURED_PERSON
}
"""
Input to associated persons for the policy
"""
input LiechtensteinLifeWealthAssociatedPersonInput {
"""
The roles of the person in the policy.
"""
role: [LiechtensteinLifeWealthPolicyPersonRole!]!
"""
Information about the person associated with the policy.
"""
person: CreateOfferCustomerByInput!
"""
Input to provide details about a persons legal representatives
"""
legalRepresentatives: [LegalRepresentativeInput!]
}
"""
Information about the policy beneficiaries for both death and policy maturity.
"""
input LiechtensteinLifeWealthBeneficiariesInput {
"""
Information about the nominated beneficiaries in case of maturity of the policy and the insured person is alive.
"""
lifeBeneficiary: LifeBeneficiaryInput
"""
Information about the nominated beneficiaries in case of death of the insured person.
"""
deathBeneficiary: LiechtensteinLifeWealthDeathBeneficiaryInput
"""
Indicates if the death beneficiary is irrevocable.
If set to true, the death beneficiary cannot be changed after the policy is issued.
Default is false.
"""
isDeathBeneficiaryIrrevocable: Boolean
"""
Beneficiary rights (“Bezugsrecht”) for the contract when one of two policyholders dies.
"""
beneficiaryRights: BeneficiaryRightsAndTermFixRightsOption
"""
Rights for adjust the termfix of the contract when one of two policyholders dies.
"""
termFixRights: BeneficiaryRightsAndTermFixRightsOption
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum LiechtensteinLifeWealthDeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
Only when the policyholder is not the insured person.
"""
POLICY_HOLDER
}
"""
Enum for death beneficiary rights and termfix rights options for beneficiary.
"""
enum BeneficiaryRightsAndTermFixRightsOption {
"""
Non-revocable rights for the first policyholder after death of the first policyholder.
"""
NON_REVOCABLE_POLICYHOLDER_AFTER_DEATH_OF_FIRST_POLICYHOLDER
"""
Non-revocable rights for the second policyholder after death of the second policyholder (only if there are 2 policyholders).
"""
NON_REVOCABLE_POLICYHOLDER_AFTER_DEATH_OF_SECOND_POLICYHOLDER
"""
Non-revocable rights for both policyholders after death of both policyholders (only if there are 2 policyholders).
"""
NON_REVOCABLE_POLICYHOLDERS_AFTER_DEATH_OF_BOTH_POLICYHOLDERS
"""
Revocable rights.
"""
REVOCABLE
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input LiechtensteinLifeWealthDeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: LiechtensteinLifeWealthDeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners, or policyholder) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryRankInput!]
"""
The information regarding the document which beneficiaries should be managed by.
"""
customDocumentBeneficiary: CustomDocumentBeneficiaryInput
}
"""
Input to provide the medical history of the customer.
Currently, we support entry of one critical illness because if the customer has/had more than one critical illness the policy application will be rejected.
Weight and height are only required when:
- The insured person is no older than 75 years at the start of the policy
- No individual death benefit has been selected
- The total premiums paid until the beginning of the 6th year do not exceed EUR 1 million (for death benefit option 1),
- The total premiums paid until the end of the policy do not exceed EUR 10 million (for death benefit option 2).
"""
input LiechtensteinLifeWealthHealthInput {
"""
Indicates if the insured person has had medical consultations in the last 2 years.
"""
hasNoMedicalConsultation: Boolean!
"""
Indicates if the insured person has had medical conditions in the last 2 years.
"""
hasNoMedicalConditions: Boolean!
"""
Indicates if the customer has a critical illness. Setting this as false will mark the Health topic as completed in the underlying insurance system and the customer won't have to answer the question to submit their application.
"""
hasCriticalIllness: Boolean!
"""
Details about the critical illness.
The information needs to be provided if `hasCriticalIllness` is set to `true`.
If the customer has more than one critical illness, the application request cannot be accepted.
"""
criticalIllnessDetails: CriticalIllnessDetailsInput
"""
Insured person's weight in kilograms at the time of the policy application.
Mandatory if either no_medical_conditions or no_medical_consultation are set to false
"""
weight: Int @constraint(min: 1)
"""
Insured person's height in centimeters at the time of the policy application.
Mandatory if either no_medical_conditions or no_medical_consultation are set to false
"""
height: Int @constraint(min: 1)
"""
The insured person's smoking history. Omit it when the question was not asked — it is never
answered on the customer's behalf, because this is a health declaration on a signed application.
"""
smoking: LiechtensteinLifeWealthSmokingInput
}
"""
Smoking history for a Liechtenstein Life Wealth insured person.
"""
input LiechtensteinLifeWealthSmokingInput {
"""
Whether the insured person has smoked cigarettes, cigars, or similar substances in the last 12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when `hasSmoked` is true, and rejected when it is false.
"""
smokingDetails: String
}
"""
Information about the customer's current financial state.
"""
input LiechtensteinLifeWealthFinancialStatusInput {
"""
The reason the customer is applying for a policy.
"""
policyReason: PolicyReason!
"""
The custom reason the customer is applying for a policy when the `PolicyReason` does not cover the use-case.
The value needs to be set when the `policyReason` is set as `OTHER`.
"""
policyReasonOtherText: String
"""
The origin of the money that the customer is using to pay the premiums with.
"""
moneyOrigin: MoneyOrigin!
"""
The custom source of customer's current income when the `moneyOrigin` does not cover the use-case.
The value needs to be set when the `moneyOrigin` is set as `OTHER`.
"""
moneyOriginOtherText: String
"""
Monthly net income of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Total monthly expenses of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Payment method to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
}
enum LiechtensteinLifeWealthContractLanguage {
"""
German
"""
DE_DE
"""
English
"""
EN_US
"""
Swiss German
"""
DE_CH
}
"""
Configuration for creating an offer for the Liechtenstein Life Invest insurance product.
"""
input LiechtensteinLifeWealthProductConfigurationInput {
"""
When would the customer like to start the payment for the policy.
We recommend to use the first of the current month as the default value if there is no specific desired start date.
"""
startDate: Date!
"""
At what age would the customer like to stop paying for the policy / withdraw the money.
The age needs to be greater than the age of the customer at the start date.
The age value can be between 62 and 120 years.
"""
ageWhenPolicyEnds: Int! @constraint(min: 62, max: 120)
"""
At what age would the customer like to stop paying premiums.
The age value can be between 5 and the policy end age (it needs to be greater than the start date age).
The default value is the policy end age.
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 120)
"""
The amount the customer would like to pay into the policy each term.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
regularPremium: MonetaryFractionalAmount!
"""
The mode of the policy. The mode defines how often the customer would like to pay into the policy.
Options: 0, 1, 2, 4, 12 - Default is 12.
"""
premiumMode: Int @constraint(pattern: "^(0|1|2|4|12)$")
"""
The amount the customer would like to pay in as a one-time payment when the policy starts.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
additionalPayment: MonetaryFractionalAmount!
"""
Indicates how much the premium amount is adjusted annually.
When no amount is provided, the premium is not adjusted annually (set to 0).
"""
premiumDynamicPercentage: Int @constraint(min: 3, max: 10)
"""
Specifics on how the money needs to be invested in the policy.
"""
investmentStrategy: LiechtensteinLifeWealthInvestmentStrategyInput!
"""
The minimum death benefit for the policy.
Default is `TAX_MINIMUM`.
"""
minimumDeathBenefit: MinimumDeathBenefit
"""
Additional death benefit for the policy.
Default is 0.
"""
additionalDeathBenefit: Int @constraint(min: 0, max: 200)
"""
Indicates if the customer wants to have a different death coverage percentage than the default one.
In the case of death, either the minimum taxable death benefit or the selected percentage is paid out, depending on which amount is higher.
"""
deathCoveragePercentage: Percentage
@deprecated(reason: "Use `additionalDeathBenefit` and `minimumDeathBenefit` instead.")
"""
Option that insurance company checks with the age of 55 of the customer, they may have all assets moved to more secure funds.
"""
maturityManagement: Boolean @deprecated(reason: "Not supported for this product.")
"""
Indicates when the death_coverage is paid out: when the… FIRST_TO_DIE", or "LAST_TO_DIE"
Default: LAST_TO_DIE
"""
deathCoveragePayout: DeathCoveragePayoutType
"""
Details of payout
Default: No payout plan
"""
payoutPlan: PayoutPlanInput
"""
Indicates how many % of the contract entitles the additional policyholder.
Mandatory when there is an additional policyholder.
"""
additionalPolicyHolderPercentage: Percentage
"""
Preferred Language of the contract and documents. Default `DE_DE`
"""
language: LiechtensteinLifeWealthContractLanguage
"""
The waiting period for premium in death case
If not provided, the default is no waiting period.
"""
termFix: TermFixInput
"""
The reduction of the fund administration cost that the customer will have to pay to the broker.
The value is between 0 and 1.
"""
absoluteReductionFundAdministrationCost: Float @constraint(min: 0, max: 1)
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input LiechtensteinLifeWealthInvestmentStrategyInput {
"""
The reasons why the customer is making this investment choice.
"""
goals: InvestmentGoalsInput!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: LiechtensteinLifeWealthSustainabilityDetailsInput!
"""
The funds that the customer/broker selected to invest in.
If `sustainabilityDetails.productConfiguration` is set`, funds selection must be in accordance to the customer's `sustainabilityDetails.productConfiguration`.
e.g. If `percentage` is 50 and `aims` is `ECOLOGICAL`, the `investmentStrategy.fundSelection` should contain at least 50% funds that have a low carbon footprint.
Funds selection should also be in accordance to `riskLevel`: If `riskLevel` is set to `MEDIUM`, fund selection shouldn't contain high risk funds.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
Please talk to our support team if you need more information on the correct fund selection.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
It does not validate sustainability and risk related rules, these are validated by the insurance company and might prevent the policy from being issued.
"""
fundSelection: [FundSelectionInput!]!
"""
Maximum risk level the customer is willing to take with their investment.
In case you are using our broker license and the selected value is `LOW`, a `ConsultationTopic` `RISK_LEVEL` is attached to the offer on creation which needs to be resolved before the customer can submit the offer.
"""
riskLevel: RiskLevel!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
"""
The customer's declaration that they want to invest temporarily in low-risk assets: that
minimising value fluctuation matters more to them than return for now, and that they intend
to move to a higher expected return within their risk class later.
This is the customer's own statement of intent, not a restatement of `riskLevel` — a customer
can hold a `HIGH` risk level and still want a low-risk start. Printed as its own question on
the application form.
Omitting it records `false`. The question did not exist before the 2026 tariff, so `false` is
what an integration that never asked it has always implicitly answered.
"""
lowRiskInvestment: Boolean
"""
The customer's declaration that they want to be able to pass the policy to the next generation
of heirs, closing provision gaps across the family (spouse, life partner, children), and that
they are aware of the tax and inheritance-law risks and opportunities that may follow.
Omitting it records `false`, on the same terms as `lowRiskInvestment`.
"""
transferability: Boolean
}
"""
Input about the customer's knowledge of sustainable investing and sustainable investment choices.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input LiechtensteinLifeWealthSustainabilityDetailsInput {
"""
The current state of user's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
The configuration is in accordance to 2023 standards for ESG investing. The customer is allowed to divert investments on certain topics and also opt to exclude certain topics.
Indicates the various ESG topics that the customer want to invest their funds in.
These topics are used to filter the funds that can be selected for the investment strategy and the percentage of the funds is calculated from the total % of investment in ESG and the level of focus on environmental and social goals.
These topics contribute in being sustainable in environment, social or governance areas.
If none is selected, we assume that the customer is does not want to focus on certain ESG topics and want to invest in funds that are not ESG focused.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
"""
The configuration is in accordance to 2023 standards for ESG investing. The customer is allowed to divert investments on certain topics and also opt to exclude certain topics.
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the user does not want a sustainable product.
"""
percentage: Int!
}
"""
Wealth CH choices for a single premium or regular premiums. The holder is also the insured person.
"""
input LiechtensteinLifeWealthCHProductConfigurationInput {
"""
End age: 60–100 for a single premium, or 60–85 for regular premiums. Policy term is at least ten years.
"""
ageWhenPolicyEnds: Int! @constraint(min: 60, max: 100)
"""
Minimum fiscal cover or a chosen amount. Lifeware also validates the applicable cover minimum.
"""
coverage: WealthCHCoverageInput!
"""
Select the single-premium or regular-premium variant.
"""
premium: WealthCHPremiumInput!
"""
Omit or choose NO_GUARANTEE for no guarantee. Single-premium guarantees need ten years.
"""
guarantee: SwissSavingsGuarantee
"""
Customer investment choices, including an explicit low-risk declaration.
"""
investmentStrategy: SwissSavingsInvestmentStrategyInput!
"""
Document language. Omit for DE_CH.
"""
language: SwissSavingsContractLanguage
"""
Omit for false. Must be explicitly true with a premium guarantee.
"""
maturityManagement: Boolean
"""
Whether to request postal delivery. Omit for false.
"""
postDelivery: Boolean
"""
Daily policy start, from today through three calendar months ahead. Backdating is not supported.
"""
startDate: Date!
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in the smallest currency unit (cents for EUR). Example: 10000 = EUR 100.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## Key differences from LL Invest
- Uses `regularPremium` instead of `monthlyPremium`
- Supports multiple associated persons (ADDITIONAL_INSURED_PERSON, ADDITIONAL_POLICY_HOLDER)
- Has `minimumDeathBenefit`, `additionalDeathBenefit`, `deathCoveragePayout`
- Requires `beneficiaries` block
- Requires health status for both primary and additional insured persons
## What I need
Build the integration to create Liechtenstein Life Wealth offers. Map my customer data to the input shape above. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Liechtenstein Life Wealth
{
"input": {
"liechtensteinLifeWealth": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"INSURED_PERSON",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "policyHolder@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "1976-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "DE",
"id": "96618720548"
}
]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "berlin",
"street": "Frankfuter-Alle",
"zip": "10367",
"houseNumber": "23A",
"streetAppendix": "8th Cross"
},
"identification": {
"birthPlace": "Tokyo",
"documentNumber": "AR12333323232",
"documentType": "PASSPORT",
"issueDate": "2025-01-01",
"issuedBy": "Govt of Japan",
"validUntil": "2026-01-01"
}
}
}
},
{
"role": ["ADDITIONAL_INSURED_PERSON"],
"person": {
"newCustomer": {
"email": "additionalInduredPerson@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "2000-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "DE",
"id": "96618720548"
}
]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "berlin",
"street": "Frankfuter-Alle",
"zip": "10367",
"houseNumber": "23A",
"streetAppendix": "8th Cross"
}
}
}
},
{
"role": ["ADDITIONAL_POLICY_HOLDER"],
"person": {
"newCustomer": {
"email": "additionalPolicyHolder@example.com",
"firstName": "Jane",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "1978-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "DE",
"id": "96618720548"
}
]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "berlin",
"street": "Frankfuter-Alle",
"zip": "10367",
"houseNumber": "23A",
"streetAppendix": "8th Cross"
}
}
}
}
],
"productConfiguration": {
"premiumDynamicPercentage": 10,
"ageUntilPremiumIsPaid": 73,
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 73,
"regularPremium": 50000,
"startDate": "2025-07-01",
"language": "DE_DE",
"minimumDeathBenefit": "TAX_MINIMUM",
"additionalDeathBenefit": 150,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "IE0004766675",
"percentage": 100
}
],
"goals": {
"taxBenefit": false,
"flexibility": true,
"longTerm": true
},
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
},
"termFix": {
"events": "BIRTH_OF_CHILD",
"term": "2031-01-01",
"funds": [
{
"id": "IE0004766675",
"percentage": 100
}
]
},
"premiumMode": null,
"payoutPlan": {
"schedules": [
{
"start": "2030-09-01",
"end": "2034-09-01",
"amount": 100000,
"frequency": "MONTHLY"
},
{
"start": "2035-09-01",
"end": "2037-09-01",
"amount": 100000,
"frequency": "MONTHLY"
}
],
"iban": "DE75512108001245126199",
"accountHolder": "John Doe"
},
"maturityManagement": true,
"deathCoveragePayout": "FIRST_TO_DIE",
"additionalPolicyHolderPercentage": 50
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": {
"wireTransfer": true
},
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"hasNoMedicalConditions": true,
"hasNoMedicalConsultation": true,
"criticalIllnessDetails": null,
"weight": 47,
"height": 156
},
"additionalInsuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"hasNoMedicalConditions": true,
"hasNoMedicalConsultation": true,
"criticalIllnessDetails": null,
"weight": 47,
"height": 156
},
"beneficiaries": {
"lifeBeneficiary": {
"beneficiaryType": "POLICY_HOLDER"
},
"deathBeneficiary": {
"beneficiaryType": "PARTNER"
},
"isDeathBeneficiaryIrrevocable": true,
"beneficiaryRights": "REVOCABLE",
"termFixRights": "REVOCABLE"
}
}
}
}
Preview prompt
I need to create a Prosperity Plus Germany offer via the Prosperity Partner Platform GraphQL API. This is an investment-linked pension product for the German market.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"prosperityPlusGermany": {
"associatedPersons": [
{
"role": ["MAILING", "INSURED_PERSON", "POLICY_HOLDER", "PAYER", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "customer@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "2000-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": { "taxLiableInUSA": false, "residencies": [{ "country": "DE", "id": "96618720548" }] },
"phoneNumber": "+4900000000",
"address": { "country": "DE", "city": "Berlin", "street": "Frankfurter Allee", "zip": "10367", "houseNumber": "23A" },
"identification": { "birthPlace": "Tokyo", "documentNumber": "AR12333323232", "documentType": "PASSPORT", "issueDate": "2025-01-01", "issuedBy": "Govt of Japan", "validUntil": "2026-01-01" }
}
}
}
],
"productConfiguration": {
"premiumDynamicPercentage": 10,
"ageUntilPremiumIsPaid": 73,
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 82,
"monthlyPremium": 10000,
"maturityManagement": true,
"premiumWaiver": true,
"startDate": "2025-08-01",
"language": "DE_DE",
"deathCoveragePercentage": 100,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "IE0004766675", "percentage": 100 }],
"goals": { "taxBenefit": false, "flexibility": true, "longTerm": true },
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
},
"brokerageFeePayoutMethod": "GROSS"
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": { "wireTransfer": true },
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000
},
"insuredPersonsHealthStatus": { "hasCriticalIllness": false, "weight": 47, "height": 156 }
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
input ProsperityPlusGermanyDeathBeneficiaryInput @oneOf {
"""
The beneficiary type.
"""
beneficiaryType: ProsperityPlusGermanyDeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners, or policyholder) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryRankInput!]
}
enum ProsperityPlusGermanyDeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Different products can support different roles.
"""
enum ProsperityPlusGermanyPolicyPersonRole {
POLICY_HOLDER
INSURED_PERSON
PAYER
MAILING
ECONOMIC_INTEREST
}
"""
Input to associated persons for the policy
"""
input ProsperityPlusGermanyAssociatedPersonInput {
"""
The roles of the person in the policy.
"""
role: [ProsperityPlusGermanyPolicyPersonRole!]!
"""
Information about the person associated with the policy.
"""
person: CreateOfferCustomerByInput!
}
"""
Information about the policy beneficiaries for both death and policy maturity.
"""
input ProsperityPlusGermanyBeneficiariesInput {
"""
Information about the nominated beneficiaries in case of maturity of the policy and the insured person is alive.
"""
lifeBeneficiary: LifeBeneficiaryInput
"""
Information about the nominated beneficiaries in case of death of the insured person.
"""
deathBeneficiary: ProsperityPlusGermanyDeathBeneficiaryInput
"""
Indicates if the death beneficiary is irrevocable.
If set to true, the death beneficiary cannot be changed after the policy is issued.
Default is false.
"""
isDeathBeneficiaryIrrevocable: Boolean
}
"""
Information about the customer's current financial state.
"""
input ProsperityPlusGermanyFinancialStatusInput {
"""
The reason the customer is applying for a policy.
"""
policyReason: PolicyReason!
"""
The custom reason the customer is applying for a policy when the `PolicyReason` does not cover the use-case.
The value needs to be set when the `policyReason` is set as `OTHER`.
"""
policyReasonOtherText: String
"""
The origin of the money that the customer is using to pay the premiums with.
"""
moneyOrigin: MoneyOrigin!
"""
The custom source of customer's current income when the `moneyOrigin` does not cover the use-case.
The value needs to be set when the `moneyOrigin` is set as `OTHER`.
"""
moneyOriginOtherText: String
"""
Monthly net income of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Total monthly expenses of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Payment method to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
}
"""
Input to provide the medical history of the customer.
**Important**: We only support entry of one critical illness. If the customer has/had more than one
critical illness, the policy application will be rejected.
Weight and height are REQUIRED when ALL of the following conditions are met:
1. The insured person is 75 years or younger at the policy start date
2. No individual death benefit has been selected
3. Total premiums meet either:
- For death benefit option 1: Total premiums until year 6 do not exceed €1 million
- For death benefit option 2: Total premiums until policy end do not exceed €10 million
"""
input ProsperityPlusGermanyHealthInput {
"""
Indicates if the customer has a critical illness.
Set to false to mark the Health topic as completed in the insurance system.
"""
hasCriticalIllness: Boolean!
"""
Details about the critical illness.
Required if `hasCriticalIllness` is true.
**Note**: If the customer has multiple critical illnesses, the application cannot be accepted.
"""
criticalIllnessDetails: CriticalIllnessDetailsInput
"""
Insured person's weight in kilograms.
Required based on conditions described in the input type documentation.
"""
weight: Int @constraint(min: 1)
"""
Insured person's height in centimeters.
Required based on conditions described in the input type documentation.
"""
height: Int @constraint(min: 1)
}
"""
Language options for contract documents.
"""
enum ProsperityPlusGermanyContractLanguage {
"""
German
"""
DE_DE
"""
Swiss German
"""
DE_CH
}
"""
Method for paying out brokerage fees
"""
enum BrokerageFeePayoutMethod {
NET
GROSS
}
"""
Configuration for creating an offer for the Prosperity Plus Germany insurance product.
"""
input ProsperityPlusGermanyProductConfigurationInput {
"""
When would the customer like to start the payment for the policy.
We recommend to use the first of the current month as the default value if there is no specific desired start date.
"""
startDate: Date!
"""
Age at which the policy ends and the customer can withdraw funds.
Constraints:
- Minimum: 62 years
- Maximum: 85 years
- Must be greater than the customer's age at start date
"""
ageWhenPolicyEnds: Int! @constraint(min: 62, max: 85)
"""
Age until which the customer will pay premiums.
Constraints:
- Minimum: 18 years
- Maximum: 85 years
- Must be greater than start date age
- Must be at least 5 years from policy start
Default: Same as policy end age
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 85)
"""
Monthly premium amount.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 10000 represents €100.00
"""
monthlyPremium: MonetaryFractionalAmount!
"""
Premium payment frequency.
Valid values:
- 0: Single premium
- 1: Annual
- 2: Semi-annual
- 4: Quarterly
- 12: Monthly (default)
"""
premiumMode: Int @constraint(pattern: "^(0|1|2|4|12)$")
"""
Indicates if the customer wants the option for premium waiver.
Default is false.
"""
premiumWaiver: Boolean
"""
Reduced premium during repayment phase (Reduzierte Prämie während der Tilgungsphase).
**Only supported when `brokerageFeePayoutMethod` is `NET` (net tariff, 049-0-PPD 2025).**
Setting this field with `brokerageFeePayoutMethod: GROSS` returns
`PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY`.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 7500 represents €75.00
Must be between 24% and 100% of monthlyPremium (inclusive).
Omit this field to use the default (equal to monthlyPremium — no reduction applied).
"""
reducedPremium: MonetaryFractionalAmount
"""
Annual premium increase percentage.
Constraints:
- Minimum: 1%
- Maximum: 10%
Omit this field for no annual adjustment.
"""
premiumDynamicPercentage: Int @constraint(min: 1, max: 10)
"""
One-time payment the customer would like to pay in when the policy starts.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 1000000 represents €10,000.00
"""
additionalPayment: MonetaryFractionalAmount!
"""
Investment strategy configuration including fund selection, risk level,
and sustainability preferences.
"""
investmentStrategy: ProsperityPlusGermanyInvestmentStrategyInput!
"""
Death benefit percentage above the standard coverage.
The actual payout will be the higher of:
1. Selected percentage of policy value
2. Minimum taxable death benefit:
- First 5 years: 100% of NAV
- After 5 years: 100% NAV + 10% of paid premiums (decreasing linearly to 0% at policy end)
"""
deathCoveragePercentage: Percentage!
"""
Option that insurance company checks with the age of 55 of the customer, they may have all assets moved to more secure funds.
Default is false.
"""
maturityManagement: Boolean
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: ProsperityPlusGermanyContractLanguage
"""
Method for paying out brokerage fees, which determines the tariff to be used.
"""
brokerageFeePayoutMethod: BrokerageFeePayoutMethod!
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input ProsperityPlusGermanyInvestmentStrategyInput {
"""
The reasons why the customer is making this investment choice.
"""
goals: InvestmentGoalsInput!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: ProsperityPlusGermanySustainabilityDetailsInput!
"""
The funds that the customer/broker selected to invest in.
If `sustainabilityDetails.productConfiguration` is set`, funds selection must be in accordance to the customer's `sustainabilityDetails.productConfiguration`.
e.g. If `percentage` is 50 and `aims` is `ECOLOGICAL`, the `investmentStrategy.fundSelection` should contain at least 50% funds that have a low carbon footprint.
Funds selection should also be in accordance to `riskLevel`: If `riskLevel` is set to `MEDIUM`, fund selection shouldn't contain high risk funds.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
Please talk to our support team if you need more information on the correct fund selection.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
It does not validate sustainability and risk related rules, these are validated by the insurance company and might prevent the policy from being issued.
"""
fundSelection: [FundSelectionInput!]!
"""
Maximum risk level the customer is willing to take with their investment.
In case you are using our broker license and the selected value is `LOW`, a `ConsultationTopic` `RISK_LEVEL` is attached to the offer on creation which needs to be resolved before the customer can submit the offer.
"""
riskLevel: RiskLevel!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
}
"""
Input about the user's knowledge of sustainable investing and sustainable investment choices.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input ProsperityPlusGermanySustainabilityDetailsInput {
"""
The current state of user's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
The configuration is in accordance to 2023 standards for ESG investing. The customer is allowed to divert investments on certain topics and also opt to exclude certain topics.
Indicates the various ESG topics that the customer want to invest their funds in.
These topics are used to filter the funds that can be selected for the investment strategy and the percentage of the funds is calculated from the total % of investment in ESG and the level of focus on environmental and social goals.
These topics contribute in being sustainable in environment, social or governance areas.
If none is selected, we assume that the customer is does not want to focus on certain ESG topics and want to invest in funds that are not ESG focused.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
"""
The configuration is in accordance to 2023 standards for ESG investing. The customer is allowed to divert investments on certain topics and also opt to exclude certain topics.
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the user does not want a sustainable product.
"""
percentage: Int!
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in the smallest currency unit (cents for EUR). Example: 10000 = EUR 100.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## Key features
- Has `brokerageFeePayoutMethod` (GROSS or NET)
- Supports `premiumWaiver` and `maturityManagement`
- Similar structure to LL Invest but with different product configuration options
## What I need
Build the integration to create Prosperity Plus Germany offers. Map my customer data to the input shape above. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Prosperity Plus Germany
beneficiaries.deathBeneficiary.beneficiaryType accepts PARTNER or POLICY_HOLDER, or supply customBeneficiaries to name the beneficiaries yourself.
POLICY_HOLDER is only accepted when the policy holder and the insured person are two different people. On an offer where one person holds both roles the death benefit would fall due to the person whose death triggers it, so the request returns InputValidationError with invalidInput: BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED.
{
"input": {
"prosperityPlusGermany": {
"associatedPersons": [
{
"role": [
"MAILING",
"INSURED_PERSON",
"POLICY_HOLDER",
"PAYER",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "sampleEmailAddress@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "2000-04-06",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Lawyer",
"occupation": "Lawyer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "DE",
"id": "96618720548"
}
]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "berlin",
"street": "Frankfuter-Alle",
"zip": "10367",
"houseNumber": "23A",
"streetAppendix": "8th Cross"
},
"identification": {
"birthPlace": "Tokyo",
"documentNumber": "AR12333323232",
"documentType": "PASSPORT",
"issueDate": "2025-01-01",
"issuedBy": "Govt of Japan",
"validUntil": "2026-01-01"
}
}
}
}
],
"productConfiguration": {
"premiumDynamicPercentage": 10,
"ageUntilPremiumIsPaid": 73,
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 82,
"monthlyPremium": 10000,
"maturityManagement": true,
"premiumWaiver": true,
"startDate": "2025-08-01",
"language": "DE_DE",
"deathCoveragePercentage": 100,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "IE0004766675",
"percentage": 100
}
],
"goals": {
"taxBenefit": false,
"flexibility": true,
"longTerm": true
},
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
},
"brokerageFeePayoutMethod": "GROSS"
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": {
"wireTransfer": true
},
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"criticalIllnessDetails": null,
"weight": 47,
"height": 156
}
}
}
}
Preview prompt
I need to create a Liechtenstein Life Pension offer via the Prosperity Partner Platform GraphQL API. This is a German Basisrente (Schicht 1) pension product.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"liechtensteinLifePension": {
"associatedPersons": [
{
"role": ["MAILING", "INSURED_PERSON", "POLICY_HOLDER", "PAYER", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "customer@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "1985-06-15",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Software Engineer",
"occupation": "Software Engineer",
"taxIdentification": { "taxLiableInUSA": false, "residencies": [{ "country": "DE", "id": "96618720548" }] },
"phoneNumber": "+4900000000",
"address": { "country": "DE", "city": "Berlin", "street": "Musterstraße", "zip": "10115", "houseNumber": "1" },
"identification": { "birthPlace": "Berlin", "documentNumber": "C01X00T478", "documentType": "ID_CARD", "issueDate": "2020-01-15", "issuedBy": "Stadt Berlin", "validUntil": "2030-01-15" }
}
}
}
],
"productConfiguration": {
"ageUntilPremiumIsPaid": 67,
"additionalPayment": 0,
"ageWhenPolicyEnds": 67,
"monthlyPremium": 10000,
"maturityManagement": true,
"premiumWaiver": true,
"guarantee": "SELECT_80",
"startDate": "2026-09-01",
"language": "DE_DE",
"deathCoveragePercentage": 0,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "LU0360863863", "percentage": 100 }],
"goals": { "taxBenefit": true, "flexibility": false, "longTerm": true },
"rebalancingType": "NORMAL",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
},
"absoluteReductionFundAdministrationCost": 0.5
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": { "wireTransfer": true },
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 150000,
"totalMonthlyNetIncome": 500000
},
"insuredPersonsHealthStatus": { "hasCriticalIllness": false, "weight": 80, "height": 180 },
"beneficiaries": { "deathBeneficiary": "PARTNER", "isDeathBeneficiaryIrrevocable": false }
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""
Different products can support different roles.
"""
enum LiechtensteinLifePensionPolicyPersonRole {
POLICY_HOLDER
INSURED_PERSON
PAYER
MAILING
ECONOMIC_INTEREST
}
"""
Input to associated persons for the policy
"""
input LiechtensteinLifePensionAssociatedPersonInput {
"""
The roles of the person in the policy.
"""
role: [LiechtensteinLifePensionPolicyPersonRole!]!
"""
Information about the person associated with the policy.
"""
person: CreateOfferCustomerByInput!
}
"""
Information about the policy beneficiaries.
Basisrente law (Schicht 1) restricts death beneficiary to PARTNER only.
"""
input LiechtensteinLifePensionBeneficiariesInput {
"""
Information about the nominated beneficiaries in case of death of the insured person.
Restricted to PARTNER only (Basisrente law, Schicht 1).
"""
deathBeneficiary: LiechtensteinLifePensionDeathBeneficiary
"""
Indicates if the death beneficiary is irrevocable.
If set to true, the death beneficiary cannot be changed after the policy is issued.
Default is false.
"""
isDeathBeneficiaryIrrevocable: Boolean
}
"""
Death beneficiary options for Liechtenstein Life Pension.
Basisrente law (Schicht 1) restricts death beneficiaries to the partner only.
"""
enum LiechtensteinLifePensionDeathBeneficiary {
"""
The partner (spouse/civil partner) of the insured person.
This is the only value accepted by the insurance system for Basisrente.
"""
PARTNER
"""
Accepted for backward compatibility. Mapped to PARTNER server-side.
@deprecated Use PARTNER instead.
"""
HEIRS @deprecated(reason: "Use PARTNER instead. HEIRS is mapped to PARTNER for Basisrente.")
}
"""
Information about the customer's current financial state.
"""
input LiechtensteinLifePensionFinancialStatusInput {
"""
The reason the customer is applying for a policy.
"""
policyReason: PolicyReason!
"""
The custom reason the customer is applying for a policy when the `PolicyReason` does not cover the use-case.
The value needs to be set when the `policyReason` is set as `OTHER`.
"""
policyReasonOtherText: String
"""
The origin of the money that the customer is using to pay the premiums with.
"""
moneyOrigin: MoneyOrigin!
"""
The custom source of customer's current income when the `moneyOrigin` does not cover the use-case.
The value needs to be set when the `moneyOrigin` is set as `OTHER`.
"""
moneyOriginOtherText: String
"""
Monthly net income of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Total monthly expenses of the customer.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Payment method to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
}
"""
Input to provide the medical history of the customer.
**Important**: We only support entry of one critical illness. If the customer has/had more than one
critical illness, the policy application will be rejected.
Weight and height are REQUIRED when ALL of the following conditions are met:
1. The insured person is 75 years or younger at the policy start date
2. No individual death benefit has been selected
3. Total premiums meet either:
- For death benefit option 1: Total premiums until year 6 do not exceed €1 million
- For death benefit option 2: Total premiums until policy end do not exceed €10 million
"""
input LiechtensteinLifePensionHealthInput {
"""
Indicates if the customer has a critical illness.
Set to false to mark the Health topic as completed in the insurance system.
"""
hasCriticalIllness: Boolean!
"""
Details about the critical illness.
Required if `hasCriticalIllness` is true.
**Note**: If the customer has multiple critical illnesses, the application cannot be accepted.
"""
criticalIllnessDetails: CriticalIllnessDetailsInput
"""
Insured person's weight in kilograms.
Required based on conditions described in the input type documentation.
"""
weight: Int @constraint(min: 1)
"""
Insured person's height in centimeters.
Required based on conditions described in the input type documentation.
"""
height: Int @constraint(min: 1)
}
"""
Guarantee options for Liechtenstein Life Pension.
"""
enum LiechtensteinLifePensionGuarantee {
"""
No guarantee on the invested capital.
"""
NO_GUARANTEE
"""
50% of the invested capital is guaranteed.
"""
SELECT_50
"""
80% of the invested capital is guaranteed.
"""
SELECT_80
}
"""
Language options for contract documents.
"""
enum LiechtensteinLifePensionContractLanguage {
"""
German
"""
DE_DE
"""
English
"""
EN_US
"""
German (Switzerland)
"""
DE_CH
}
"""
Configuration for creating an offer for the Liechtenstein Life Pension insurance product.
"""
input LiechtensteinLifePensionProductConfigurationInput {
"""
When would the customer like to start the payment for the policy.
We recommend to use the first of the current month as the default value if there is no specific desired start date.
"""
startDate: Date!
"""
Age at which the policy ends and the customer can withdraw funds.
Constraints:
- Minimum: 62 years
- Maximum: 85 years
- Must be greater than the customer's age at start date
"""
ageWhenPolicyEnds: Int! @constraint(min: 62, max: 85)
"""
Age until which the customer will pay premiums.
Constraints:
- Minimum: 18 years
- Maximum: 75 years
- Must be greater than start date age
- Must be at least 5 years from policy start (enforced by insurance system)
Default: Same as policy end age
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 75)
"""
Monthly premium amount.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 10000 represents €100.00
"""
monthlyPremium: MonetaryFractionalAmount!
"""
Premium payment frequency.
Valid values:
- 0: Single premium
- 1: Annual
- 2: Semi-annual
- 4: Quarterly
- 12: Monthly (default)
"""
premiumMode: Int @constraint(pattern: "^(0|1|2|4|12)$")
"""
Indicates if the customer wants the option for premium waiver.
Default is false.
"""
premiumWaiver: Boolean
"""
Premium dynamic increases are not supported for Basisrente products.
This field is accepted for backward compatibility but ignored server-side.
@deprecated Not supported for LLP. Value is silently ignored.
"""
premiumDynamicPercentage: Int
@deprecated(reason: "Not supported for Basisrente. Value is silently ignored.")
"""
One-time payment the customer would like to pay in when the policy starts.
Amount is specified in the smallest monetary unit (cents for EUR) to avoid floating point math.
Example: 1000000 represents €10,000.00
"""
additionalPayment: MonetaryFractionalAmount!
"""
Investment strategy configuration including fund selection, risk level,
and sustainability preferences.
"""
investmentStrategy: LiechtensteinLifePensionInvestmentStrategyInput!
"""
Death benefit percentage above the standard coverage.
Set to `0` for no additional death benefit beyond the policy value.
The actual death payout is the higher of: the selected percentage of the policy value,
or the minimum taxable death benefit as determined by the insurance system.
"""
deathCoveragePercentage: Percentage!
"""
Option that insurance company checks with the age of 55 of the customer, they may have all assets moved to more secure funds.
Default is false.
"""
maturityManagement: Boolean
"""
Capital guarantee level for the policy.
Default is NO_GUARANTEE.
"""
guarantee: LiechtensteinLifePensionGuarantee
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: LiechtensteinLifePensionContractLanguage
"""
The reduction of the fund administration cost that the customer will have to pay to the broker.
The value is between 0 and 1.
"""
absoluteReductionFundAdministrationCost: Float @constraint(min: 0, max: 1)
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input LiechtensteinLifePensionInvestmentStrategyInput {
"""
The reasons why the customer is making this investment choice.
**Note (Basisrente)**: `longTerm` is always overridden to `true` server-side regardless of the provided value.
`diversification`, `focusFund` are set to `false`, and `lowRiskInvestment` is derived from `riskLevel`.
"""
goals: InvestmentGoalsInput!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: LiechtensteinLifePensionSustainabilityDetailsInput!
"""
The funds that the customer/broker selected to invest in.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
"""
fundSelection: [FundSelectionInput!]!
"""
Maximum risk level the customer is willing to take with their investment.
"""
riskLevel: RiskLevel!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
}
"""
Input about the user's knowledge of sustainable investing and sustainable investment choices.
"""
input LiechtensteinLifePensionSustainabilityDetailsInput {
"""
The current state of user's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the user does not want a sustainable product.
"""
percentage: Int!
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in the smallest currency unit (cents for EUR). Example: 10000 = EUR 100.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## Key features (Basisrente / Schicht 1)
- Death beneficiary is restricted to `PARTNER` only — Basisrente law (Schicht 1) requirement
- No life beneficiaries are supported
- No `premiumDynamicPercentage` — premium dynamic increases are not supported, omit this field
- `lifelong_pension_purpose` is always enforced as `true` regardless of the `goals.longTerm` input value
- Guarantee options: `NO_GUARANTEE`, `SELECT_50`, `SELECT_80`
- Supports `premiumWaiver` and `maturityManagement`
- Similar structure to Prosperity Plus Germany but with Basisrente constraints
- Supports `absoluteReductionFundAdministrationCost`
## What I need
Build the integration to create Liechtenstein Life Pension (Basisrente) offers. Map my customer data to the input shape above. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Liechtenstein Life Pension (Basisrente)
- Beneficiaries: Death beneficiary is restricted to
PARTNERonly — this is a regulatory requirement for German Basisrente products (Schicht 1) - No life beneficiary: Life beneficiaries are not supported
- No premium dynamic:
premiumDynamicPercentageis not supported — omit this field - Guarantee options:
NO_GUARANTEE,SELECT_50,SELECT_80 lifelong_pension_purpose: Always enforced astrueregardless of thegoals.longTerminput value
{
"input": {
"liechtensteinLifePension": {
"associatedPersons": [
{
"role": [
"MAILING",
"INSURED_PERSON",
"POLICY_HOLDER",
"PAYER",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "sampleEmailAddress@example.com",
"firstName": "John",
"lastName": "Doe",
"gender": "MALE",
"dateOfBirth": "1985-06-15",
"maritalStatus": "SINGLE",
"nationality": "DE",
"profession": "Software Engineer",
"occupation": "Software Engineer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "DE",
"id": "96618720548"
}
]
},
"phoneNumber": "+4900000000",
"address": {
"country": "DE",
"city": "Berlin",
"street": "Musterstraße",
"zip": "10115",
"houseNumber": "1"
},
"identification": {
"birthPlace": "Berlin",
"documentNumber": "C01X00T478",
"documentType": "ID_CARD",
"issueDate": "2020-01-15",
"issuedBy": "Stadt Berlin",
"validUntil": "2030-01-15"
}
}
}
}
],
"productConfiguration": {
"ageUntilPremiumIsPaid": 67,
"additionalPayment": 0,
"ageWhenPolicyEnds": 67,
"monthlyPremium": 10000,
"maturityManagement": true,
"premiumWaiver": true,
"guarantee": "SELECT_80",
"startDate": "2026-09-01",
"language": "DE_DE",
"deathCoveragePercentage": 0,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "LU0360863863",
"percentage": 100
}
],
"goals": {
"taxBenefit": true,
"flexibility": false,
"longTerm": true
},
"rebalancingType": "NORMAL",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
},
"absoluteReductionFundAdministrationCost": 0.5
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": {
"wireTransfer": true
},
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 150000,
"totalMonthlyNetIncome": 500000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"criticalIllnessDetails": null,
"weight": 80,
"height": 180
},
"beneficiaries": {
"deathBeneficiary": "PARTNER",
"isDeathBeneficiaryIrrevocable": false
}
}
}
}
Preview prompt
I need to create a Value Invest VWL offer via the Prosperity Partner Platform GraphQL API. VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming benefit. The employer pays a fixed monthly contribution into a contract held by the employee.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"valueInvestVWL": {
"associatedPersons": [
{
"role": ["PAYER"],
"person": {
"existingCustomer": {
"byEmail": {
"email": "employer-hr@example.com"
}
}
}
},
{
"role": ["POLICY_HOLDER", "INSURED_PERSON", "MAILING", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "employee@example.com",
"firstName": "Anna",
"lastName": "Schmidt",
"gender": "FEMALE",
"dateOfBirth": "1992-03-14",
"maritalStatus": "SINGLE",
"nationality": "DE",
"birthPlace": "Munich",
"birthCountry": "DE",
"profession": "Mechatronics Engineer",
"occupation": "Mechatronics Engineer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [{ "country": "DE", "id": "12345678911" }]
},
"phoneNumber": "+4901701234567",
"address": { "country": "DE", "city": "Munich", "street": "Leopoldstraße", "zip": "80802", "houseNumber": "12" },
"identification": { "birthPlace": "Munich", "documentNumber": "L01XY12345", "documentType": "ID_CARD", "issueDate": "2022-01-15", "issuedBy": "Stadt München", "validUntil": "2032-01-15" }
}
}
}
],
"productConfiguration": {
"personalNumber": "EMP-2026-0042",
"startDate": "2026-06-01",
"language": "DE_DE",
"ageWhenPolicyEnds": 67,
"monthlyPremium": 4000,
"additionalPayment": 0,
"guarantee": "SELECT_80",
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "AT0000A08LD9", "percentage": 100 }],
"goals": { "taxBenefit": false, "flexibility": false, "longTerm": true },
"rebalancingType": "NORMAL",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
}
},
"customerFinancialStatus": {
"moneyOrigin": "EARNED_INCOME",
"paymentMethod": { "wireTransfer": true },
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 180000,
"totalMonthlyNetIncome": 320000
},
"beneficiaries": {
"deathBeneficiary": { "beneficiaryType": "PARTNER" },
"isDeathBeneficiaryIrrevocable": false
}
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""
Roles supported by Value Invest VWL.
Constraints on `associatedPersons` (validated server-side):
- Exactly one person must have role `[PAYER]` — this is the employer (company customer).
- Exactly one person must hold exactly `[POLICY_HOLDER, INSURED_PERSON, MAILING,
ECONOMIC_INTEREST]` — this is the employee. No extras, no duplicates.
- The same person must not be both PAYER and POLICY_HOLDER.
"""
enum ValueInvestVWLPolicyPersonRole {
POLICY_HOLDER
INSURED_PERSON
PAYER
MAILING
ECONOMIC_INTEREST
}
"""
Input to associated persons for the policy.
"""
input ValueInvestVWLAssociatedPersonInput {
"""
Roles of this person in the policy. See `ValueInvestVWLPolicyPersonRole` for the
required combinations.
"""
role: [ValueInvestVWLPolicyPersonRole!]!
"""
Information about the person associated with the policy.
For the `PAYER` role this must be a corporate entity. Use either:
- `existingCustomer` — to reference an employer already onboarded in our system, or
- `newCompanyCustomer` — to create the corporate-entity employer inline as part of the offer.
`newCustomer` is not allowed for the PAYER because it cannot represent a company.
For the employee entry (all non-PAYER roles), use `newCustomer` or `existingCustomer`.
`newCompanyCustomer` is rejected for non-PAYER roles.
"""
person: CreateOfferCustomerByInput!
}
"""
Information about the policy beneficiaries.
"""
input ValueInvestVWLBeneficiariesInput {
"""
Death beneficiary. Defaults to `PARTNER` if omitted.
The application form offers only the partner or named beneficiaries. There is no option for
the legal heirs: to name them, list them in `customBeneficiaries`.
"""
deathBeneficiary: ValueInvestVWLDeathBeneficiaryInput
"""
Whether the death beneficiary is irrevocable. Default is false.
"""
isDeathBeneficiaryIrrevocable: Boolean
}
"""
Death beneficiary configuration for Value Invest VWL. Provide exactly one of the two fields.
"""
input ValueInvestVWLDeathBeneficiaryInput @oneOf {
"""
The beneficiary type.
"""
beneficiaryType: ValueInvestVWLDeathBeneficiary
"""
Named beneficiaries, printed on the application form as "Abweichender Bezugsberechtigter".
The `allotmentPercentage` values must add up to exactly 100: any other total makes the
application impossible to sign.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Death beneficiary options for Value Invest VWL.
"""
enum ValueInvestVWLDeathBeneficiary {
"""
The partner (spouse/civil partner) of the insured employee.
"""
PARTNER
}
"""
Information about the employee's current financial state.
Note that the premium itself is not paid by the employee: VWL is a capital-forming benefit
transferred by the employer, so `paymentMethod` below describes the employer's arrangement.
"""
input ValueInvestVWLFinancialStatusInput {
"""
The reason the customer is applying for a policy.
"""
policyReason: PolicyReason!
"""
Required when `policyReason` is `OTHER`.
"""
policyReasonOtherText: String
"""
The origin of the money used to pay premiums.
"""
moneyOrigin: MoneyOrigin!
"""
Required when `moneyOrigin` is `OTHER`.
"""
moneyOriginOtherText: String
"""
Monthly net income of the employee (smallest monetary unit, i.e. cents for EUR).
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Total monthly expenses of the employee (smallest monetary unit, i.e. cents for EUR).
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
How the **employer** settles the premium. VWL premiums are paid by the employer (the party
holding the `PAYER` role), never by the employee, so this is the employer's payment
arrangement — not the employee's.
`wireTransfer` is the usual choice: the employer transfers the capital-forming contribution,
typically as a standing order. Its value decides who arranges that standing order, and VWL is
the only product where the answer can be `false`:
- `wireTransfer: true` — the employer sets it up themselves and is not contacted. You must
then forward them the page titled "VWL Antrag auf Überweisung vermögenswirksamer Leistungen
durch den Arbeitgeber" from the application document, or the contributions never start.
- `wireTransfer: false` — Liechtenstein Life notifies the employer to set the standing order
up. Nothing is required of you.
`directDebit` would place the SEPA mandate on the employer's account, so do not send employee
bank details here.
"""
paymentMethod: PaymentMethodInput!
}
"""
Health questions of the Value Invest VWL application form, answered by the employee.
"""
input ValueInvestVWLHealthInput {
"""
The form's disease question: whether the employee has or had, in the last 10 years, one of the
listed diseases, or took prescription medication for longer than 4 weeks. The insurance system
folds the medication question into this answer, so there is no separate medication flag.
`false` answers this question with "no"; height, weight and smoking are separate answers.
"""
hasCriticalIllness: Boolean!
"""
What the disease or medication was. Required when `hasCriticalIllness` is `true`, and rejected
when it is `false`.
"""
criticalIllnessDetails: ValueInvestVWLIllnessDetailsInput
"""
Height in centimeters.
"""
height: Int! @constraint(min: 1)
"""
Weight in kilograms.
"""
weight: Int! @constraint(min: 1)
"""
Smoking in the last 12 months. Required outside production.
Production does not ask this question yet. There the answer is accepted and not passed on to the
insurance system. Once the question is mandatory in production, we pass it on there too.
"""
smoking: ValueInvestVWLSmokingInput
"""
Name and address of the doctor or therapist who can best give information on the employee's
health. Required outside production, and, like `smoking`, not passed on in production for now.
"""
medicalPractitionerInformation: String
}
"""
The table that goes with a "yes" to the Value Invest VWL disease question.
"""
input ValueInvestVWLIllnessDetailsInput {
"""
Type of the disease or complaint, and its diagnosis.
"""
type: String!
"""
How long the employee has or had it.
"""
period: String!
"""
Whether the employee has fully recovered from it, without consequences.
"""
hasRecovered: Boolean!
"""
The doctor, hospital or clinic that treated the employee, with the name and address.
"""
medicalInstitutionName: String!
"""
The prescription medication the employee takes or took, and the dose.
"""
medication: String
}
"""
Smoking history for a Value Invest VWL employee.
"""
input ValueInvestVWLSmokingInput {
"""
Whether the employee has smoked cigarettes, cigars, e-cigarettes, snuff or similar in the last
12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when `hasSmoked` is true, and rejected when it is false.
"""
smokingDetails: String
}
"""
Guarantee options for Value Invest VWL.
"""
enum ValueInvestVWLGuarantee {
"""
No guarantee on the invested capital.
"""
NO_GUARANTEE
"""
50% of the invested capital is guaranteed.
"""
SELECT_50
"""
80% of the invested capital is guaranteed.
"""
SELECT_80
}
"""
Language options for contract documents.
"""
enum ValueInvestVWLContractLanguage {
"""
German. VWL is a German-market product; only German is supported.
"""
DE_DE
}
"""
Configuration for creating an offer for Value Invest VWL.
"""
input ValueInvestVWLProductConfigurationInput {
"""
Personnel/employee number assigned by the employer.
Required by Lifeware (`policy_information.personal_number`). Free text — letters, digits, hyphens
are accepted. Must not be empty.
"""
personalNumber: String! @constraint(minLength: 1, maxLength: 32)
"""
When the customer would like to start the policy.
We recommend the first of the next month if there is no specific desired start date.
"""
startDate: Date!
"""
Age at which the policy ends and the employee can withdraw funds.
Constraints: minimum 60 years, maximum 85 years, must be greater than the employee's current age.
"""
ageWhenPolicyEnds: Int! @constraint(min: 60, max: 85)
"""
Age until which the employee will pay premiums.
Constraints: minimum 18 years, maximum 75 years. Must be greater than the employee's current age
and at least 5 years from policy start (enforced by the insurance system).
Default: same as `ageWhenPolicyEnds`.
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 75)
"""
Premium per payment (smallest monetary unit, i.e. cents for EUR). It is a monthly amount with the default `premiumMode`.
The regular premium per year is this amount times the number of payments per year, and must be between EUR 168 and EUR 3,000.
Together with `additionalPayment` it must not exceed EUR 3,000 per year.
Otherwise the offer is rejected with `PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE` or `PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT`.
"""
monthlyPremium: MonetaryFractionalAmount!
"""
Premium payment frequency.
Valid values: 0 (single premium), 1 (annual), 2 (semi-annual), 4 (quarterly), 12 (monthly, default).
The premium limits are not checked for 0.
"""
premiumMode: Int @constraint(pattern: "^(0|1|2|4|12)$")
"""
One-time additional payment paid into the policy at start (smallest monetary unit).
Set it to `0` for none. Otherwise it must be at least EUR 50
(`PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM`), and the regular premium per year plus this payment must not exceed EUR 3,000
(`PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT`).
"""
additionalPayment: MonetaryFractionalAmount!
"""
Investment strategy configuration.
"""
investmentStrategy: ValueInvestVWLInvestmentStrategyInput!
"""
Death benefit percentage above the standard coverage. Set to `0` for no additional death benefit.
"""
deathCoveragePercentage: Percentage!
"""
Capital guarantee level for the policy. Default is `NO_GUARANTEE`.
"""
guarantee: ValueInvestVWLGuarantee
"""
Which kind of application the form (Antrag) ticks: a new contract, an increase of the
capital-forming benefits, or a change of how they are invested. Default is `NEW`, so existing
integrations keep working.
"""
capitalAccumulationBenefit: ValueInvestVWLCapitalAccumulationBenefit! = NEW
"""
Preferred contract language. Default: `DE_DE`.
"""
language: ValueInvestVWLContractLanguage
"""
Optional reduction of fund administration cost; value between 0 and 1.
"""
absoluteReductionFundAdministrationCost: Float @constraint(min: 0, max: 1)
}
"""
The kind of application a Value Invest VWL offer is, as printed under "Antrag" on the
application form (Antrag).
"""
enum ValueInvestVWLCapitalAccumulationBenefit {
"""
A new contract for capital-forming benefits (_Neuantrag_).
"""
NEW
"""
An increase of the capital-forming benefits the employee already receives (_Antrag auf
Erhöhung der vermögenswirksamen Leistungen_).
"""
INCREASE
"""
A change of how the capital-forming benefits are invested (_Antrag auf Änderung der Anlageart
der vermögenswirksamen Leistungen_).
"""
CHANGE
}
"""
Investment strategy configuration for Value Invest VWL.
"""
input ValueInvestVWLInvestmentStrategyInput {
"""
Customer's stated investment goals.
"""
goals: InvestmentGoalsInput!
"""
Sustainability preferences.
"""
sustainabilityDetails: ValueInvestVWLSustainabilityDetailsInput!
"""
Selected funds — percentages must sum to 100 and no more than 10 funds.
"""
fundSelection: [FundSelectionInput!]!
"""
Maximum risk level the employee is willing to take.
"""
riskLevel: RiskLevel!
"""
Preferred rebalancing type. Default: `NORMAL` (yearly rebalance).
"""
rebalancingType: RebalancingType
}
"""
Sustainability investment preferences for Value Invest VWL.
"""
input ValueInvestVWLSustainabilityDetailsInput {
"""
Customer's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Sustainability topics the customer wants to favour.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
"""
Sustainability topics the customer wants to exclude.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Strength of the environmental/social focus.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
Percentage of the overall investment in sustainable funds. `0` indicates no sustainability preference.
"""
percentage: Int!
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in the smallest currency unit (cents for EUR). Example: 10000 = EUR 100.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## VWL roles and required participants
A VWL offer requires **exactly two associated persons**:
1. **Employer** — must already be a customer in the Prosperity system, referenced via `existingCustomer.byEmail`. Roles: `[PAYER]` only.
2. **Employee** — the contract holder. Can be `newCustomer` or `existingCustomer`. Roles: `[POLICY_HOLDER, INSURED_PERSON, MAILING, ECONOMIC_INTEREST]` — all four, exactly.
The employee must NOT be the `PAYER`, and the employer must NOT hold any other role. Mixing roles will fail validation.
## Onboarding employers
Employers must be onboarded once via `createCustomer` (or a manual partner-portal flow) before any VWL offer can reference them. Re-use the same employer record across all their employees by looking it up via the employer's HR email.
## Key product constraints
- Tariff: `value invest VWL 2022` (fixed)
- Currency: **EUR** (amounts in cents)
- Language: `DE_DE` only — VWL is a German-market product
- Required: `personalNumber` — the employer's internal employee ID for payroll reconciliation
- No premium dynamic — `premiumDynamicPercentage` is not part of the schema
- Health questions — `insuredPersonsHealthStatus` is optional, but send it whenever you collect the answers. The insurance system only asks the questions above a limit and is replacing the rule that sets it: the new rule is (the sum of all premiums over the term + `additionalPayment`) × `deathCoveragePercentage` reaching EUR 35,000, but not every environment applies it yet and some still ask above a yearly premium. When the questions apply and the answers are missing, the offer can be created but not signed. Send `hasCriticalIllness` (the form's combined disease and medication question; `true` needs `criticalIllnessDetails` with `type`, `period`, `hasRecovered`, `medicalInstitutionName` and optionally `medication`), `height`, `weight`, plus `smoking` and `medicalPractitionerInformation`, which are required outside production. Never answer on the employee's behalf
- Smoking question in production — the production form has no smoking question yet: the API accepts `smoking` and `medicalPractitionerInformation` there but does not pass them on. Once the question is mandatory in production we will pass them on, so send both in every environment
- Guarantee options: `NO_GUARANTEE`, `SELECT_50`, `SELECT_80`
- Application kind: `capitalAccumulationBenefit` sets the box the application form ticks under "Antrag": `NEW` (Neuantrag), `INCREASE` (an increase of the capital-forming benefits) or `CHANGE` (a change of how they are invested). It defaults to `NEW`, so calls that omit it keep working
- Employee's birth place and country: send `birthPlace` (city only) and `birthCountry` on the employee's `newCustomer`; the application form prints "Geburtsort" and "Geburtsland" from these, not from `identification.birthPlace`
- Death beneficiary: `{ "beneficiaryType": "PARTNER" }` (default) or `{ "customBeneficiaries": [...] }`. The form has no option for the legal heirs: name them in `customBeneficiaries`. Allotments must add up to exactly 100
- Typical monthly premium: EUR 40 (4000 cents) — the standard VWL employer contribution
- Premium limits: the regular premium per year (`monthlyPremium` × payments per year, EUR 250 monthly at most) must be EUR 168 to EUR 3,000, `additionalPayment` must be `0` or at least EUR 50, and the regular premium per year plus `additionalPayment` must not exceed EUR 3,000. Offers outside these limits are rejected with `PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE`, `PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM` or `PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT`
- Premium is paid by the **employer**: `customerFinancialStatus.paymentMethod` describes the employer's payment arrangement, not the employee's. `{ "wireTransfer": true }` (the employer transfers the contribution, typically as a standing order) is the normal choice; `directDebit` would place the SEPA mandate on the **employer's** account. Never send employee bank details.
- `wireTransfer` also says who arranges the standing order, and VWL is the only product where both answers are allowed. `true` (also the default when omitted): nobody is notified, and it is on you to forward the employer the page titled "VWL Antrag auf Überweisung vermögenswirksamer Leistungen durch den Arbeitgeber" from the application PDF, per offer — skip it and the contributions never arrive. `false`: Liechtenstein Life notifies the employer instead, and you owe nothing. On every other product `false` is rejected with `FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
## What I need
Build the integration to create Value Invest VWL offers. Onboard each employer once, then create one offer per employee referencing the employer by email. Map my customer data to the input shape above. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Value Invest VWL (employer-funded)
VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming benefit. The employer pays a fixed monthly contribution into a contract held by the employee.
- Exactly two associated persons required:
- Employer (corporate entity) — Roles:
[PAYER]only. Provide eitherexistingCustomer(employer already onboarded) ornewCompanyCustomer(create the employer inline as part of the offer).newCustomeris rejected for PAYER because it cannot represent a company. - Employee — the contract holder. Roles:
[POLICY_HOLDER, INSURED_PERSON, MAILING, ECONOMIC_INTEREST]— all four, exactly. Employee can be a new or existing individual customer.newCompanyCustomeris rejected for non-PAYER roles.
- Employer (corporate entity) — Roles:
- The employer pays the premium:
customerFinancialStatus.paymentMethoddescribes the employer's payment arrangement, not the employee's.{ "wireTransfer": true }— the usual choice — means the employer transfers the capital-forming contribution, typically as a standing order, and no bank details are collected from anyone.directDebitplaces the SEPA mandate on the employer's account. Never send employee bank details on a VWL offer. Who arranges that standing order is your call, and one of the two answers leaves a manual step to you — see who sets the standing order up. - Onboard the employer once: each employer should be created in our system once and re-used across all their employees' offers. Use
newCompanyCustomeron the first offer for a new employer, then reference the same employer viaexistingCustomer.byEmailon subsequent offers. - Tariff:
value invest VWL 2022(fixed) - Currency: EUR (amounts in cents —
4000= EUR 40.00, the typical VWL contribution) - Language:
DE_DEonly — VWL is a German-market product - Premium limits: the regular premium per year —
monthlyPremiumtimes the number of payments per year, so EUR 250 monthly at most — must be between EUR 168 and EUR 3,000.additionalPaymentmust be0or at least EUR 50. The regular premium per year plusadditionalPaymentmust not exceed EUR 3,000. For example, EUR 200 monthly (EUR 2,400 a year) leaves room for anadditionalPaymentof EUR 600 at most. An offer outside these limits fails withPRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE,PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUMorPRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT. The limits are not checked forpremiumMode: 0. - Required:
personalNumber— the employer's internal payroll identifier for the employee - No premium dynamic:
premiumDynamicPercentageis not part of the schema - Health questions:
insuredPersonsHealthStatusis optional, but send it whenever you collect the answers. The insurance system only asks the questions above a limit, and it is replacing the rule that sets it. The new rule looks at the death benefit: (the sum of all premiums over the term +additionalPayment) ×deathCoveragePercentagereaching EUR 35,000. Not every environment applies it yet, and some still ask above a yearly premium (the amount printed next to the question on the application form). When the questions apply and the answers are missing, the offer can be created but cannot be signed.hasCriticalIllnessis the form's combined question about diseases and medication taken for longer than 4 weeks (trueneedscriticalIllnessDetailswithtype,period,hasRecovered,medicalInstitutionNameand, if any,medication). Also sendheightandweight, andsmokingandmedicalPractitionerInformation, which are required outside production. We never answer a health question on the employee's behalf. - Smoking question in production: the production application form has no smoking question yet. There the API accepts
smokingandmedicalPractitionerInformationbut does not pass them on to the insurance system. Once the question is mandatory in production, we will pass them on. Send both in every environment, so your integration needs no change then. - Guarantee options:
NO_GUARANTEE,SELECT_50,SELECT_80 - Application kind:
capitalAccumulationBenefitsets the box the application form ticks under "Antrag":NEW(Neuantrag),INCREASE(an increase of the capital-forming benefits) orCHANGE(a change of how they are invested). It defaults toNEW, so calls that do not send it keep working. - Employee's birth place and country: send
birthPlace(the city only, e.g.Berlin) andbirthCountryon the employee'snewCustomer. The application form prints "Geburtsort" and "Geburtsland" from these two fields. It does not printidentification.birthPlace, which records the place exactly as written on the identification document. - Occupation: the application form prints
occupationas "Ausgeübter Beruf" and printsprofession, occupationtogether as "Abteilung". When you omitoccupation, we use theprofession, so "Abteilung" then repeats it. Send a distinctoccupationto avoid that. - Death beneficiary:
beneficiaries.deathBeneficiarytakes{ "beneficiaryType": "PARTNER" }(the default) or{ "customBeneficiaries": [...] }. The application form has no option for the legal heirs: to name them, list them incustomBeneficiaries. TheirallotmentPercentagevalues must add up to exactly 100.
The example below shows the most common shape: a brand-new employer (newCompanyCustomer) plus a brand-new employee (newCustomer) on the same request. For subsequent offers tied to the same employer, swap the PAYER entry to { "existingCustomer": { "byEmail": { "email": "hr@acme.example" } } } — keep the rest unchanged.
{
"input": {
"valueInvestVWL": {
"associatedPersons": [
{
"role": ["PAYER"],
"person": {
"newCompanyCustomer": {
"name": "Acme GmbH",
"additionalName": "Acme Trading",
"contactName": "HR Department",
"legalForm": "GmbH",
"financialInstitution": false,
"email": "hr@acme.example",
"mobilePhone": "+4915000000000",
"landline": "+493012345678",
"address": {
"country": "DE",
"city": "Berlin",
"street": "Unter den Linden",
"zip": "10117",
"houseNumber": "1"
},
"taxInformation": {
"taxLiableInUSA": false,
"vatNumber": "DE123456789",
"taxIDCountry": "DE"
}
}
}
},
{
"role": [
"POLICY_HOLDER",
"INSURED_PERSON",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "employee@example.com",
"firstName": "Anna",
"lastName": "Schmidt",
"gender": "FEMALE",
"dateOfBirth": "1992-03-14",
"maritalStatus": "SINGLE",
"nationality": "DE",
"birthPlace": "Munich",
"birthCountry": "DE",
"profession": "Mechatronics Engineer",
"occupation": "Mechatronics Engineer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{ "country": "DE", "id": "12345678911" }
]
},
"phoneNumber": "+4901701234567",
"address": {
"country": "DE",
"city": "Munich",
"street": "Leopoldstraße",
"zip": "80802",
"houseNumber": "12"
},
"identification": {
"birthPlace": "Munich",
"documentNumber": "L01XY12345",
"documentType": "ID_CARD",
"issueDate": "2022-01-15",
"issuedBy": "Stadt München",
"validUntil": "2032-01-15"
}
}
}
}
],
"productConfiguration": {
"personalNumber": "EMP-2026-0042",
"startDate": "2026-06-01",
"language": "DE_DE",
"ageWhenPolicyEnds": 67,
"monthlyPremium": 4000,
"additionalPayment": 0,
"guarantee": "SELECT_80",
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{ "id": "AT0000A08LD9", "percentage": 100 }
],
"goals": {
"taxBenefit": false,
"flexibility": false,
"longTerm": true
},
"rebalancingType": "NORMAL",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
}
},
"customerFinancialStatus": {
"moneyOrigin": "EARNED_INCOME",
"paymentMethod": {
"wireTransfer": true
},
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 180000,
"totalMonthlyNetIncome": 320000
},
"beneficiaries": {
"deathBeneficiary": { "beneficiaryType": "PARTNER" },
"isDeathBeneficiaryIrrevocable": false
}
}
}
}
Example: Your Life Netto Plus (Deprecated)
yourlife netto plus is deprecated. New integrations are no longer being accepted for this product. Existing integrations remain supported, but new partners should use one of the other Germany products (Liechtenstein Life Invest, Liechtenstein Life Wealth, Liechtenstein Life Pension, Prosperity Plus Germany) instead. Contact your integration partner manager if you have questions about migrating off YLN+.
{
"input": {
"yourLifeNettoPlus": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"INSURED_PERSON",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "sampleEmailAddress@example.com",
"firstName": "Max",
"lastName": "Mustermann",
"dateOfBirth": "1990-01-15",
"gender": "MALE",
"maritalStatus": "SINGLE",
"nationality": "DE",
"address": {
"street": "Musterstraße",
"houseNumber": "1",
"zip": "10115",
"city": "Berlin",
"country": "DE"
},
"mobilePhone": "+491701234567",
"profession": "Software Engineer",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"id": "12345678911",
"country": "DE"
}
]
}
}
}
}
],
"productConfiguration": {
"startDate": "2026-04-01",
"ageWhenPolicyEnds": 67,
"monthlyPremium": 10000,
"additionalPayment": 0,
"deathCoveragePercentage": 100,
"investmentStrategy": {
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0
},
"fundSelection": [
{
"id": "LU0360863863",
"percentage": 100
}
],
"riskLevel": "MEDIUM"
}
},
"customerFinancialStatus": {
"policyReason": "PRIVATE_PENSION",
"moneyOrigin": "EARNED_INCOME",
"totalMonthlyNetIncome": 500000,
"totalMonthlyExpenses": 300000,
"paymentMethod": {
"directDebit": {
"iban": "DE89370400440532013000",
"accountHolder": "Max Mustermann"
}
}
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false
}
}
}
}
Preview prompt
I need to create an offer for an existing customer via the Prosperity Partner Platform GraphQL API. Instead of providing full customer details, I reference the customer by email.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables (using existing customer by email)
```json
{
"input": {
"liechtensteinLifeInvest": {
"associatedPersons": [
{
"role": ["MAILING", "INSURED_PERSON", "POLICY_HOLDER", "PAYER", "ECONOMIC_INTEREST"],
"person": {
"existingCustomer": {
"byEmail": {
"email": "existing-customer@example.com"
}
}
}
}
],
"productConfiguration": {
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 82,
"monthlyPremium": 10000,
"startDate": "2025-05-01",
"language": "DE_DE",
"deathCoveragePercentage": 100,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "IE0004766675", "percentage": 100 }],
"goals": { "taxBenefit": false, "flexibility": true, "longTerm": true },
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
}
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": { "wireTransfer": true },
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000
},
"insuredPersonsHealthStatus": { "hasCriticalIllness": false, "weight": 47, "height": 156 }
}
}
}
```
## Relevant Schema Types
```graphql
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
```
## Key difference
Instead of `"newCustomer": { ... }`, use `"existingCustomer": { "byEmail": { "email": "..." } }`. No personal details needed — just the email linked to their existing policy. This works for any product type.
## Important
- All monetary amounts are in the smallest currency unit (cents for EUR). Example: 10000 = EUR 100.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## What I need
Build the integration to create offers for customers who already exist in the Prosperity system. Look them up by email and skip the personal details.Example: Using Existing Customer
{
"input": {
"liechtensteinLifeInvest": {
"associatedPersons": [
{
"role": [
"MAILING",
"INSURED_PERSON",
"POLICY_HOLDER",
"PAYER",
"ECONOMIC_INTEREST"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "sampleEmailAddressNetto4@test.com"
}
}
}
}
],
"productConfiguration": {
"additionalPayment": 1000000,
"ageWhenPolicyEnds": 82,
"monthlyPremium": 10000,
"startDate": "2025-05-01",
"language": "DE_DE",
"deathCoveragePercentage": 100,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "IE0004766675",
"percentage": 100
}
],
"goals": {
"taxBenefit": false,
"flexibility": true,
"longTerm": true
},
"rebalancingType": "DYNAMIC",
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "SIGNIFICANT",
"percentage": 0,
"topicsToExclude": ["TOBACCO_INDUSTRY"],
"topicsToInclude": [],
"customerKnowledgeStatus": "NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER"
}
}
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"paymentMethod": {
"wireTransfer": true
},
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 100000,
"totalMonthlyNetIncome": 400000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null
},
"insuredPersonsHealthStatus": {
"hasCriticalIllness": false,
"criticalIllnessDetails": null,
"weight": 47,
"height": 156
}
}
}
}
Preview prompt
I need to create a Prosperity 3A offer via the Prosperity Partner Platform GraphQL API. This is a Swiss pillar 3a pension product with tax-advantaged savings.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"prosperity3A": {
"associatedPersons": [
{
"role": ["MAILING", "INSURED_PERSON", "POLICY_HOLDER", "PAYER", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "customer@example.com",
"firstName": "James",
"lastName": "Jones",
"gender": "MALE",
"dateOfBirth": "1975-07-21",
"maritalStatus": "MARRIED",
"nationality": "CH",
"profession": "IT",
"occupation": "Analyst",
"taxIdentification": { "taxLiableInUSA": false, "residencies": [{ "country": "CH", "id": "756.9217.0769.85" }] },
"phoneNumber": "+41000000000",
"address": { "country": "CH", "city": "Ruggell", "street": "Industriering", "zip": "9491", "houseNumber": "3" },
"identification": { "birthPlace": "Zürich", "documentNumber": "P123457689", "documentType": "PASSPORT", "issueDate": "2014-03-21", "issuedBy": "Zurich Tax Hall", "validUntil": "2028-03-21" }
}
}
}
],
"productConfiguration": {
"startDate": "2026-05-01",
"ageWhenPolicyEnds": 65,
"monthlyPremium": 15000,
"premiumMode": "MONTHLY",
"premiumDynamicPercentage": 3,
"additionalPayment": 100000,
"guarantee": "SELECT_50",
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "LU0070176184", "percentage": 60 }, { "id": "LLA030", "percentage": 40 }],
"goals": { "taxBenefit": true, "flexibility": true, "longTerm": true },
"rebalancingType": "NORMAL",
"lowRiskInvestment": false,
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "NORMAL",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE"
}
},
"coverage": { "type": "CHOSEN", "amount": 1444000 },
"crossBorderTariffApplicable": false,
"durationOverRetirement": false,
"maturityManagement": true,
"language": "DE_CH"
},
"insuredPersonsHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": { "hasExistingInsuranceContract": false },
"hasAggravatedTermsContract": false,
"additionalHealthRisk": { "hasAdditionalRisks": false },
"knownDiseases": { "hasHadKnownDiseases": false },
"hasExistingDisabilities": false,
"medication": { "hasBeenRegularlyMedicated": false },
"hospitalization": { "hasBeenHospitalized": false },
"hasAnnuity": false,
"drugAbuse": { "hasBeenTreatedForDrugAbuse": false },
"smoking": { "hasSmoked": false },
"hasHIV": false,
"medicalPractitionerInformation": "Dr. Hans Müller, Bahnhofstrasse 10, 8001 Zürich"
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 800000,
"differentWealthOrigin": false,
"paymentMethod": { "wireTransfer": true }
}
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""
Drug or alcohol abuse history and treatment details.
"""
input Prosperity3ADrugAbuseInformation {
"""
Whether the insured person has ever been treated for or consulted about drug or alcohol abuse.
"""
hasBeenTreatedForDrugAbuse: Boolean!
"""
Details about the treatment or consultation, including the reason and period.
Required when hasBeenTreatedForDrugAbuse is true.
"""
treatmentDetails: String
"""
Details about the substances consumed and quantity.
Required when hasBeenTreatedForDrugAbuse is true.
"""
substanceDetails: String
}
"""
Smoking history and details.
"""
input Prosperity3ASmokingInformation {
"""
Whether the insured person has smoked cigarettes, cigars, or similar substances in the last 12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when hasSmoked is true.
"""
smokingDetails: String
}
"""
Hospitalization, operations, and medical treatment history.
"""
input Prosperity3AHospitalizationInformation {
"""
Whether the insured person has been hospitalized, had operations, or received medical treatments in the last 10 years.
"""
hasBeenHospitalized: Boolean!
"""
Details about the hospitalization, including the time period and reason.
Required when hasBeenHospitalized is true.
"""
hospitalizationDetails: String
}
"""
Regular medication history.
"""
input Prosperity3AMedicationInformation {
"""
Whether the insured person is currently taking, or has frequently taken, medicine, sleeping pills, or sedatives in the last 10 years.
"""
hasBeenRegularlyMedicated: Boolean!
"""
Details about the medication, including which medicine, in what quantity, and over which period.
Required when hasBeenRegularlyMedicated is true.
"""
medicationDetails: String
}
"""
Additional health risk information from activities or occupation.
"""
input Prosperity3AAdditionalHealthRiskInformation {
"""
Whether the insured person engages in activities with additional risk (e.g. dangerous sports, hazardous hobbies, or occupational hazards).
"""
hasAdditionalRisks: Boolean!
"""
Further information about the additional risks.
Required when hasAdditionalRisks is true.
"""
additionalRiskDetails: String
}
"""
Existing insurance contract information.
"""
input Prosperity3AExistingInsuranceContractInformation {
"""
Does the insured person already have life insurance, professional insurance, or disability insurance with another provider, or are you simultaneously submitting such applications?
"""
hasExistingInsuranceContract: Boolean!
"""
Name of the insurance provider, type and amount of the insurance, and date of application submission.
Required when hasExistingInsuranceContract is true.
"""
insuranceDetails: String
}
"""
Known disease history in the last 10 years.
"""
input Prosperity3AKnownDiseaseInformation {
"""
Whether the insured person has suffered from illnesses or complaints in the last 10 years, including conditions relating to the heart and cardiovascular system (e.g. high blood pressure, heart attack, stroke), brain (e.g. migraines), blood (e.g. clotting disorder), respiratory organs (e.g. asthma), hearing, eyes, thyroid, pancreas, liver (e.g. hepatitis), kidneys, urinary and genital organs, nervous system or mind (e.g. depression, multiple sclerosis), musculoskeletal system (spine, joints), skin (e.g. neurodermatitis), tumours (e.g. cancer), diabetes, allergies, rheumatic illnesses, or infectious diseases.
"""
hasHadKnownDiseases: Boolean!
"""
Further information about the diseases or complaints.
Required when hasHadKnownDiseases is true.
"""
diseaseDetails: String
}
"""
Health questionnaire for Prosperity 3A insured persons.
Swiss-specific questions required for underwriting when premium waiver or disability annuity coverage is selected.
"""
input Prosperity3AHealthInput {
"""
Whether the insured person is self-employed.
"""
worksAsSelfEmployed: Boolean!
"""
Employment workload as a percentage (0–100). Full-time employment is 100.
"""
employmentWorkload: Int!
"""
Height in centimeters.
"""
height: Int!
"""
Weight in kilograms.
"""
weight: Int!
"""
Existing insurance contract information.
"""
existingInsuranceContract: Prosperity3AExistingInsuranceContractInformation!
"""
Whether the insured person has or has had an insurance contract with aggravated terms (e.g. exclusions, premium surcharges).
"""
hasAggravatedTermsContract: Boolean!
"""
Additional health risk information from activities or occupation.
"""
additionalHealthRisk: Prosperity3AAdditionalHealthRiskInformation!
"""
Known disease history in the last 10 years.
"""
knownDiseases: Prosperity3AKnownDiseaseInformation!
"""
Whether the insured person has any existing physical or mental disabilities, impairments, or congenital conditions.
"""
hasExistingDisabilities: Boolean!
"""
Regular medication history.
"""
medication: Prosperity3AMedicationInformation!
"""
Hospitalization, operations, and medical treatment history.
"""
hospitalization: Prosperity3AHospitalizationInformation!
"""
Whether the insured person currently receives or has received a disability pension, or has a pending pension application.
"""
hasAnnuity: Boolean!
"""
Drug or alcohol abuse history and treatment details.
"""
drugAbuse: Prosperity3ADrugAbuseInformation!
"""
Smoking history and details.
"""
smoking: Prosperity3ASmokingInformation!
"""
Whether the insured person has been diagnosed with HIV/AIDS.
"""
hasHIV: Boolean!
"""
Name and address of the physician, therapist, or practitioner who can best provide information on the insured person's state of health.
"""
medicalPractitionerInformation: String!
}
"""
Health-questionnaire container for Prosperity 3A (Swiss pillar 3a) offers. Exactly one variant key must be set — the chosen key determines which underwriting questionnaire the insurance system receives.
Variant mapping:
- `detailed` → `HealthQuestionnaireType.DETAILED`, equivalent payload to the legacy `insuredPersonsHealthStatus: Prosperity3AHealthInput`.
- `simplifiedDeathBenefit` → `HealthQuestionnaireType.SIMPLIFIED_DEATH_BENEFIT`, for offers that only carry a death-benefit rider.
- `simplifiedPremiumWaiver` → `HealthQuestionnaireType.SIMPLIFIED_PREMIUM_WAIVER`, for offers that include the premium-waiver rider.
Submitted via the `insuredPersonsHealthStatusV2` field on `CreateProsperity3AInput`. Must not be combined with the legacy `insuredPersonsHealthStatus` — setting both returns `HEALTH_STATE_BOTH_VERSIONS_SET`.
"""
input Prosperity3AHealthStatusV2Input @oneOf {
"""
Full detailed questionnaire. Same payload as the legacy `insuredPersonsHealthStatus: Prosperity3AHealthInput`; use when the partner has not enrolled in the simplified-underwriting programme or when coverage amounts require full underwriting.
"""
detailed: Prosperity3AHealthInput
"""
Simplified questionnaire for death-benefit-only offers (no premium-waiver, no disability-annuity). Requires the two-question disclosure set in `HealthSimplifiedDeathBenefitInput`.
"""
simplifiedDeathBenefit: HealthSimplifiedDeathBenefitInput
"""
Simplified questionnaire for offers that include the premium-waiver (premium-exoneration) rider. Adds serious-handicap, mental-illness and BMI disclosures on top of the death-benefit questionnaire — see `HealthSimplifiedPremiumWaiverInput`.
"""
simplifiedPremiumWaiver: HealthSimplifiedPremiumWaiverInput
}
"""
Different products can support different roles.
"""
enum Prosperity3APolicyPersonRole {
"""
The person who owns the policy and is the contractual party.
"""
POLICY_HOLDER
"""
The person whose life is insured under the policy.
"""
INSURED_PERSON
"""
The person responsible for premium payments.
"""
PAYER
"""
The person who receives correspondence related to the policy.
"""
MAILING
"""
The person with economic interest in the policy (beneficial owner).
"""
ECONOMIC_INTEREST
}
"""
Input to associated persons for the policy
"""
input Prosperity3AAssociatedPersonInput {
"""
The roles of the person in the policy.
"""
role: [Prosperity3APolicyPersonRole!]!
"""
Information about the person associated with the policy.
"""
person: CreateOfferCustomerByInput!
}
"""
Payment method for Prosperity 3A policies. Swiss-specific methods (LSV+, ESR) are available
in addition to standard bank transfer. Only one option can be provided.
If omitted, the insurance system auto-assigns a standing order.
"""
input Prosperity3APaymentMethodInput @oneOf {
"""
Bank transfer — the customer will wire the payment to the given bank account.
"""
wireTransfer: OnlyTrueValue
"""
LSV+ (Lastschriftverfahren) — Swiss direct debit. Requires the customer's IBAN.
"""
lsvPlus: Prosperity3ALSVPlusInput
@deprecated(
reason: "LSV+ is no longer supported by the insurance system. Use wireTransfer or esr instead."
)
"""
ESR (Einzahlungsschein mit Referenznummer) — Swiss payment slip.
"""
esr: OnlyTrueValue
}
"""
LSV+ direct debit details for Prosperity 3A.
"""
input Prosperity3ALSVPlusInput {
"""
The IBAN of the bank account to debit via LSV+.
"""
iban: IBAN!
"""
The BIC (Bank Identifier Code) of the bank.
"""
bic: String!
"""
The date the LSV+ authorization was signed by the account holder.
"""
signatureDate: Date!
}
"""
Information about the customer's current financial state for Prosperity 3A.
"""
input Prosperity3AFinancialStatusInput {
"""
The reason the customer is applying for a policy. Example: PRIVATE_PENSION
"""
policyReason: PolicyReason!
"""
The custom reason the customer is applying for a policy when the `PolicyReason` does not cover the use-case.
The value needs to be set when the `policyReason` is set as `OTHER`.
"""
policyReasonOtherText: String
"""
The origin of the money that the customer is using to pay the premiums with. Example: SALARY
"""
moneyOrigin: MoneyOrigin!
"""
The custom source of customer's current income when the `moneyOrigin` does not cover the use-case.
The value needs to be set when the `moneyOrigin` is set as `OTHER`.
"""
moneyOriginOtherText: String
"""
Monthly net income of the customer.
Amount is specified in the smallest monetary unit (Rappen for CHF) to avoid floating point math.
Example: 100000 represents CHF 1,000.00
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Total monthly expenses of the customer.
Amount is specified in the smallest monetary unit (Rappen for CHF) to avoid floating point math.
Example: 100000 represents CHF 1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Whether the source of overall wealth differs from the money origin used for premium payments.
Default: false.
"""
differentWealthOrigin: Boolean
"""
Source of the customer's overall wealth. Required when `differentWealthOrigin` is true.
"""
wealthOrigin: MoneyOrigin
"""
Custom wealth origin description when `wealthOrigin` is `OTHER`.
"""
wealthOriginOtherText: String
"""
Payment method for the policy. Swiss-specific methods (LSV+, ESR) are available in addition to bank transfer.
If omitted, the insurance system auto-assigns a standing order.
"""
paymentMethod: Prosperity3APaymentMethodInput
}
"""
Language options for Prosperity 3A contract documents.
"""
enum Prosperity3AContractLanguage {
"""
Standard German (Germany)
"""
DE_DE
"""
Swiss German (Switzerland)
"""
DE_CH
"""
French
"""
FR_FR
"""
Italian
"""
IT_IT
}
"""
Configuration for creating an offer for the Prosperity 3A insurance product.
"""
input Prosperity3AProductConfigurationInput {
"""
When would the customer like to start the payment for the policy.
We recommend to use the first of the current month as the default value if there is no specific desired start date.
Example: "2026-04-01"
"""
startDate: Date!
"""
Age at which the policy ends. Swiss pillar 3a policies have a retirement age range of 60–70.
Constraints:
- Minimum: 60 years
- Maximum: 70 years
- Must be greater than the customer's age at start date
"""
ageWhenPolicyEnds: Int! @constraint(min: 60, max: 70)
"""
Regular premium amount per payment period (see premiumMode). Despite the field name, this is the per-period amount regardless of frequency. Amount is specified in the smallest monetary unit (Rappen for CHF). Example: 10000 = CHF 100.00. Annually: minimum 600 CHF (60000), maximum 1,000,000 CHF (100000000).
"""
monthlyPremium: MonetaryFractionalAmount!
"""
Premium payment frequency. Defaults to monthly if omitted. Example: MONTHLY
"""
premiumMode: Prosperity3APremiumMode
"""
Annual premium increase percentage.
Constraints (when provided):
- Minimum: 1%
- Maximum: 10%
Omit this field for no annual adjustment.
"""
premiumDynamicPercentage: Int @constraint(min: 1, max: 10)
"""
One-time initial premium payment amount in the smallest monetary unit (Rappen for CHF). Must be either 0 (no initial premium) or at least CHF 500.00 (50000 in smallest unit). Example: 100000 = CHF 1,000.00.
"""
additionalPayment: MonetaryFractionalAmount!
"""
Transfer from an existing pillar 3a account into this policy.
Provide details about the source institution and the amount to transfer.
Omit if there is no 3a transfer.
"""
transferExisting3APolicy: Prosperity3ATransfer3aInput
"""
Capital guarantee type for the policy.
When provided, a percentage of the invested capital is guaranteed at policy maturity.
Omit for no guarantee.
"""
guarantee: Prosperity3AGuaranteeType
"""
Investment strategy configuration including fund selection, risk level, and sustainability preferences.
"""
investmentStrategy: Prosperity3AInvestmentStrategyInput!
"""
Death coverage configuration for the 3A policy.
"""
coverage: Prosperity3ACoverageInput!
"""
Premium waiver (premium exemption) in case of occupational disability.
When provided, premium payments are waived after a waiting period if the insured person becomes disabled.
Omit if the customer does not want premium waiver coverage.
"""
premiumWaiver: Prosperity3APremiumWaiverInput
"""
Disability annuity configuration.
When provided, the insured person receives a yearly pension in case of occupational disability.
Requires `premiumWaiver` to also be set. Omit if the customer does not want a disability annuity.
"""
disabilityAnnuity: Prosperity3ADisabilityAnnuityInput
"""
Whether the cross-border tariff applies. Set to true when the insured person resides outside Switzerland (e.g. in the EEA). When true, the cross-border tariff is used instead of the domestic Swiss tariff. Default: false.
"""
crossBorderTariffApplicable: Boolean
"""
Whether the policy duration extends beyond standard retirement age.
When true, allows the policy end age to extend to 69 (female) or 70 (male).
Default: false.
"""
durationOverRetirement: Boolean
"""
Whether maturity management is enabled. When true, the investment strategy is automatically adjusted to reduce risk as the policy approaches maturity. Default: false.
"""
maturityManagement: Boolean
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: Prosperity3AContractLanguage
"""
Death beneficiary configuration for the 3A policy.
Swiss pillar 3a follows a statutory multi-level beneficiary hierarchy.
Level 1 is always the statutory beneficiary order defined by Swiss law.
Custom beneficiaries can be designated at level 2 (subordinate) and level 3 (tertiary).
If omitted, the default statutory beneficiary order (heirs) is used.
"""
deathBeneficiary: Prosperity3ADeathBeneficiaryInput
}
"""
Death beneficiary input for Prosperity 3A policies.
Swiss pillar 3a follows a statutory multi-level beneficiary hierarchy.
When custom beneficiaries are used, level 2 and/or level 3 allotments must be provided.
"""
input Prosperity3ADeathBeneficiaryInput @oneOf {
"""
Use the default statutory beneficiary order (heirs).
"""
defaultBeneficiary: Prosperity3ADefaultDeathBeneficiary
"""
Configure custom beneficiaries at level 2 and/or level 3.
Level 1 is always the statutory beneficiary order defined by Swiss law.
"""
customBeneficiaries: Prosperity3ACustomDeathBeneficiariesInput
}
"""
Marker enum for selecting the default statutory beneficiary order.
"""
enum Prosperity3ADefaultDeathBeneficiary {
"""
Statutory heirs as defined by Swiss law.
"""
DEFAULT
}
"""
Multi-level custom beneficiary configuration for Swiss pillar 3a.
Level 2 (subordinate) beneficiaries are required.
Level 3 (tertiary) beneficiaries are optional.
Percentages within each level must sum to 100.
"""
input Prosperity3ACustomDeathBeneficiariesInput {
"""
Level 2 subordinate beneficiaries. Required. Percentages must sum to 100.
"""
level2Allotments: [Prosperity3ABeneficiaryAllotmentInput!]!
"""
Level 3 tertiary beneficiaries. Optional. Percentages must sum to 100.
"""
level3Allotments: [Prosperity3ABeneficiaryAllotmentInput!]
}
"""
A single beneficiary allotment for a Prosperity 3A policy.
Provide either personalData (for an individual) or companyData (for a company), not both.
"""
input Prosperity3ABeneficiaryAllotmentInput {
"""
Personal data for an individual beneficiary. Mutually exclusive with companyData.
"""
personalData: Prosperity3APersonalBeneficiaryInput
"""
Company data for a corporate beneficiary. Mutually exclusive with personalData.
"""
companyData: Prosperity3ACompanyBeneficiaryInput
"""
Current address of the beneficiary.
"""
address: AddressInput!
"""
Percentage allotment for this beneficiary.
All allotments within a level must sum to 100.
"""
allotmentPercentage: Percentage!
}
"""
Personal data for an individual beneficiary in a Prosperity 3A policy.
"""
input Prosperity3APersonalBeneficiaryInput {
"""
First name of the beneficiary. Example: "Maria"
"""
firstName: String!
"""
Last name of the beneficiary. Example: "Mueller"
"""
lastName: String!
"""
Gender of the beneficiary.
"""
gender: Gender!
"""
Date of birth of the beneficiary. Example: "1985-06-15"
"""
dateOfBirth: Date!
}
"""
Company data for a corporate beneficiary in a Prosperity 3A policy.
"""
input Prosperity3ACompanyBeneficiaryInput {
"""
Legal name of the company.
"""
name: String!
}
"""
Capital guarantee options for Prosperity 3A policies.
Determines what percentage of invested capital is guaranteed at policy maturity.
Guarantee levels are subject to the terms and conditions of the insurance contract.
"""
enum Prosperity3AGuaranteeType {
"""
No capital guarantee.
"""
NO_GUARANTEE
"""
50% capital guarantee at maturity.
"""
SELECT_50
"""
80% capital guarantee at maturity.
"""
SELECT_80
"""
90% capital guarantee at maturity.
"""
SELECT_90
"""
100% capital guarantee at maturity.
"""
SELECT_100
}
"""
Premium payment frequency for Prosperity 3A policies.
"""
enum Prosperity3APremiumMode {
"""
Annual payment (once per year).
"""
ANNUALLY
"""
Semi-annual payment (twice per year).
"""
SEMI_ANNUALLY
"""
Quarterly payment (four times per year).
"""
QUARTERLY
"""
Monthly payment (twelve times per year).
"""
MONTHLY
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input Prosperity3AInvestmentStrategyInput {
"""
Maximum risk level the customer is willing to take with their investment.
The risk level must correspond to the selected funds — the insurance system validates this before issuing the policy.
"""
riskLevel: RiskLevel!
"""
The reasons why the customer is making this investment choice.
"""
goals: InvestmentGoalsInput!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: Prosperity3ASustainabilityDetailsInput!
"""
The funds that the customer/broker selected to invest in.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
"""
fundSelection: [FundSelectionInput!]!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
"""
Whether this is a low-risk investment profile.
The insurance system uses this to validate the selected funds against the customer's risk appetite.
"""
lowRiskInvestment: Boolean!
}
"""
Input about the customer's knowledge of sustainable investing and sustainable investment choices for Prosperity 3A.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input Prosperity3ASustainabilityDetailsInput {
"""
The current state of user's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the customer does not want a sustainable product.
"""
percentage: Int!
}
"""
Type of death coverage for Prosperity 3A.
"""
enum Prosperity3ACoverageType {
"""
A chosen death coverage amount.
"""
CHOSEN
"""
101% of actuarial reserve at maturity.
"""
PERCENTAGE
}
"""
Death coverage configuration for Prosperity 3A policies.
"""
input Prosperity3ACoverageInput {
"""
The type of death coverage.
"""
type: Prosperity3ACoverageType!
"""
The death coverage amount in the smallest monetary unit (Rappen for CHF).
Example: 1000000 represents CHF 10,000.00
Required when type is `CHOSEN`. Ignored when type is `PERCENTAGE`.
"""
amount: MonetaryFractionalAmount
}
"""
Source of the pillar 3a transfer.
"""
enum Prosperity3ATransferSourceType {
"""
Transfer from a bank 3a account.
"""
BANK
"""
Transfer from an insurance company 3a policy.
"""
INSURANCE
}
"""
Transfer from an existing pillar 3a account into this policy.
"""
input Prosperity3ATransfer3aInput {
"""
Source of the 3a transfer.
"""
sourceType: Prosperity3ATransferSourceType!
"""
Transfer amount in the smallest monetary unit (Rappen for CHF).
Example: 500000 represents CHF 5,000.00
"""
amount: MonetaryFractionalAmount!
"""
Policy number of the existing 3a contract. Required when sourceType is INSURANCE.
"""
policyNumber: String
"""
Name of the source institution (bank or insurance company). Example: "Zuercher Kantonalbank"
"""
name: String
"""
Street address of the source institution. Example: "Bahnhofstrasse 9"
"""
address: String
"""
ZIP/postal code of the source institution. Example: "8001"
"""
zip: String
"""
City of the source institution. Example: "Zuerich"
"""
city: String
"""
PO Box of the source institution, if applicable. Example: "Postfach 1234"
"""
poBox: String
}
"""
Premium waiver (premium exemption) configuration for Prosperity 3A.
If the insured person becomes occupationally disabled, premium payments are waived after the waiting period.
"""
input Prosperity3APremiumWaiverInput {
"""
Waiting period in months before premium exemption takes effect.
Valid values: 6, 12, 24
"""
waitingPeriodMonths: Int! @constraint(pattern: "^(6|12|24)$")
}
"""
Disability annuity configuration for Prosperity 3A.
Provides a yearly pension if the insured person becomes occupationally disabled.
"""
input Prosperity3ADisabilityAnnuityInput {
"""
Yearly disability pension amount in the smallest monetary unit (Rappen for CHF).
Example: 300000 represents CHF 3,000.00
"""
yearlyPensionAmount: MonetaryFractionalAmount!
"""
Whether to exclude accident-related disability from coverage.
When true, only illness-related disability is covered.
"""
excludeAccident: Boolean!
"""
Whether the disability annuity increases by 1% per year to account for inflation.
"""
annuityIncrease: Boolean!
"""
Waiting period in months before the disability annuity payments begin.
Valid values: 12, 24
"""
waitingPeriodMonths: Int! @constraint(pattern: "^(12|24)$")
"""
Job class for disability pricing. Must be an exact match from the valid job classes list.
See the full list at: https://partner-docs.life.li/platform-integrations/job-classes
"""
jobClass: String!
"""
Job risk level (1-5) associated with the job class.
Each job class has one or more valid risk levels — see https://partner-docs.life.li/platform-integrations/job-classes for the mapping.
"""
jobRisk: Int! @constraint(min: 1, max: 5)
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in Rappen (1 CHF = 100 Rappen). Example: 15000 = CHF 150.00, 1000000 = CHF 10,000.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## Key differences from German products
- Currency is CHF (amounts in Rappen: 15000 = CHF 150.00)
- ageWhenPolicyEnds must be between 60 and 70
- Uses `coverage: { type, amount }` instead of `deathCoveragePercentage`
- Guarantee options: NO_GUARANTEE, SELECT_50, SELECT_80, SELECT_90, SELECT_100
- Supports `transferExisting3APolicy` for 3a account transfers
- Premium modes: ANNUALLY, SEMI_ANNUALLY, QUARTERLY, MONTHLY
- Health questionnaire has Swiss-specific fields (structured objects with boolean flags and detail fields)
- No beneficiaries block — insurance system handles defaults
- Languages: DE_DE, DE_CH, FR_FR, IT_IT
## What I need
Build the integration to create Prosperity 3A offers for Swiss customers. Map my customer data to the input shape above. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Prosperity 3A (Swiss Pillar 3a)
{
"input": {
"prosperity3A": {
"associatedPersons": [
{
"role": [
"MAILING",
"INSURED_PERSON",
"POLICY_HOLDER",
"PAYER",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "sampleEmailAddress@example.com",
"firstName": "James",
"lastName": "Jones",
"gender": "MALE",
"dateOfBirth": "1975-07-21",
"maritalStatus": "MARRIED",
"nationality": "CH",
"profession": "IT",
"occupation": "Analyst",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "CH",
"id": "756.9217.0769.85"
}
]
},
"phoneNumber": "+41000000000",
"address": {
"country": "CH",
"city": "Ruggell",
"street": "Industriering",
"zip": "9491",
"houseNumber": "3",
"streetAppendix": null
},
"identification": {
"birthPlace": "Zürich",
"documentNumber": "P123457689",
"documentType": "PASSPORT",
"issueDate": "2014-03-21",
"issuedBy": "Zurich Tax Hall",
"validUntil": "2028-03-21"
}
}
}
}
],
"productConfiguration": {
"startDate": "2026-05-01",
"ageWhenPolicyEnds": 65,
"monthlyPremium": 15000,
"premiumMode": "MONTHLY",
"premiumDynamicPercentage": 3,
"additionalPayment": 100000,
"transferExisting3APolicy": {
"sourceType": "BANK",
"amount": 500000,
"name": "UBS AG",
"address": "Bahnhofstrasse 45",
"zip": "8001",
"city": "Zürich"
},
"guarantee": "SELECT_50",
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "LU0070176184",
"percentage": 60
},
{
"id": "LLA030",
"percentage": 40
}
],
"goals": {
"taxBenefit": true,
"flexibility": true,
"longTerm": true
},
"rebalancingType": "NORMAL",
"lowRiskInvestment": false,
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "NORMAL",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE"
}
},
"coverage": {
"type": "CHOSEN",
"amount": 1444000
},
"crossBorderTariffApplicable": false,
"durationOverRetirement": false,
"maturityManagement": true,
"language": "DE_CH"
},
"insuredPersonsHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Dr. Hans Müller, Bahnhofstrasse 10, 8001 Zürich"
},
"customerFinancialStatus": {
"moneyOrigin": "SAVINGS",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 800000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null,
"differentWealthOrigin": false,
"paymentMethod": {
"wireTransfer": true
}
}
}
}
}
- All amounts are in the smallest monetary unit — Rappen for CHF (1 CHF = 100 Rappen). For example,
15000= CHF 150.00,1000000= CHF 10,000.00 - Disability annuity — requires
premiumWaiverto be set. ThejobClassandjobRiskmust be a valid pair from the job classes reference - Health questionnaire — required when
premiumWaiverordisabilityAnnuityis set. UsesinsuredPersonsHealthStatuswith Swiss-specific fields. Several fields are structured objects containing a boolean flag and optional detail fields (required when the flag istrue):existingInsuranceContract,additionalHealthRisk,knownDiseases,medication,hospitalization,drugAbuse,smoking. For example, if the person has been hospitalized:"hospitalization": { "hasBeenHospitalized": true, "hospitalizationDetails": "Appendectomy, March 2022" }. - No beneficiaries — the insurance system handles beneficiary defaults automatically
- Payment method (optional) — use
paymentMethodincustomerFinancialStatusto specify a Swiss-specific payment method. Available options:{ "wireTransfer": true }— bank transfer{ "lsvPlus": { "iban": "CH...", "bic": "UBSWCHZH80A", "signatureDate": "2026-03-01" } }— LSV+ (Swiss direct debit){ "esr": true }— ESR (Swiss payment slip)- If omitted, the insurance system auto-assigns a standing order
- Risk level required — the selected risk level must match the risk class of the selected funds
- Currency is CHF — Swiss pillar 3a products use Swiss Francs
- Age range 60–70 — Swiss retirement age constraints apply (
ageWhenPolicyEndsmust be between 60 and 70) - Coverage block — uses
coverage: { type, amount }instead ofdeathCoveragePercentage - Guarantee — optional capital guarantee at maturity (
NO_GUARANTEE,SELECT_50,SELECT_80,SELECT_90,SELECT_100, or omit for none) - 3A transfer — use
transferExisting3APolicyto transfer from an existing 3a account. SpecifysourceType(BANKorINSURANCE),amount, and institution details. Insurance-to-insurance transfers automatically zero acquisition costs. - Premium mode — use the
Prosperity3APremiumModeenum (ANNUALLY,SEMI_ANNUALLY,QUARTERLY,MONTHLY). Defaults toMONTHLYif omitted. - Coverage type —
CHOSENrequires anamount;PERCENTAGEgives 101% of actuarial reserve (no amount needed) - Low risk investment —
lowRiskInvestmenton the investment strategy is required and used by the insurance system to validate fund selection - Language — use the
Prosperity3AContractLanguageenum (DE_DE,DE_CH,FR_FR,IT_IT). Defaults toDE_DEif omitted.
Preview prompt
I need to create a Prosperity Plus (3B) offer via the Prosperity Partner Platform GraphQL API. This is a Swiss pillar 3b pension product. Unlike 3A, it does not have tax benefits but offers more flexibility.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Working Example Variables
```json
{
"input": {
"prosperityPlus": {
"associatedPersons": [
{
"role": ["POLICY_HOLDER", "INSURED_PERSON", "PAYER", "MAILING", "ECONOMIC_INTEREST"],
"person": {
"newCustomer": {
"email": "customer@example.com",
"firstName": "James",
"lastName": "Jones",
"gender": "MALE",
"dateOfBirth": "1985-07-21",
"maritalStatus": "MARRIED",
"nationality": "CH",
"profession": "IT",
"occupation": "Analyst",
"taxIdentification": { "taxLiableInUSA": false, "residencies": [{ "country": "CH", "id": "756.9217.0769.85" }] },
"phoneNumber": "+41000000000",
"address": { "country": "CH", "city": "Ruggell", "street": "Industriering", "zip": "9491", "houseNumber": "3" },
"identification": { "birthPlace": "Zürich", "documentNumber": "P123457689", "documentType": "PASSPORT", "issueDate": "2014-03-21", "issuedBy": "Zurich Tax Hall", "validUntil": "2028-03-21" }
}
}
}
],
"productConfiguration": {
"startDate": "2026-05-01",
"ageWhenPolicyEnds": 65,
"monthlyPremium": 10000,
"premiumMode": "MONTHLY",
"additionalPayment": 0,
"hasSecondPillar": true,
"guarantee": "NO_GUARANTEE",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [{ "id": "LU1894683009", "percentage": 100 }],
"goals": { "taxBenefit": false, "flexibility": true, "longTerm": true },
"rebalancingType": "NONE",
"lowRiskInvestment": false,
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "NORMAL",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "HAS_PRE_EXISTING_KNOWLEDGE"
}
},
"coverage": { "type": "CHOSEN", "amount": 1000000 },
"crossBorderTariffApplicable": false,
"maturityManagement": true,
"postDelivery": false,
"lifeBeneficiary": { "beneficiaryType": "POLICY_HOLDER" },
"deathBeneficiary": { "beneficiaryType": "DEFAULT" },
"language": "DE_CH"
},
"customerFinancialStatus": {
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 140000,
"totalMonthlyNetIncome": 200000,
"differentWealthOrigin": false,
"paymentMethod": { "wireTransfer": true }
}
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""
Information about a physical address.
"""
input AddressInput {
"""
Street information.
"""
street: String!
"""
Additional information related to the street/location.
"""
streetAppendix: String
"""
House number information.
"""
houseNumber: String!
"""
ZIP or postal code.
"""
zip: String!
"""
City in which the address is located.
"""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""
The contract number of the offer that has been successfully created.
"""
contractID: PolicyID!
}
"""
Information about how the broker's provision is paid out.
"""
input CreditInstructionsInput {
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
"""
Indicates how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.
from 0 to 7 in 0.25 increments without dynamic
from 0 to 9 in 0.25 increments with dynamic
"""
percentage: Float! @constraint(min: 0.0, max: 9.0)
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""
The type of critical illness the customer has/had in the past.
This is a free-form entry and will be reviewed manually by the insurance provider.
The following are some types of critical illnesses - heart attack, coronary artery disease, heart valve disease, myocardial damage, bypass surgery, stroke, cancer/leukemia, multiple sclerosis, diabetes mellitus, HIV infection (AIDS).
"""
type: String!
"""
The period for which the customer has/had the illness (e.g. 2 years)
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
period: String!
"""
Has the customer already recovered from said illness.
"""
hasRecovered: Boolean!
"""
The Hospital/Doctor/Clinic where the customer was treated.
The medical authorities have more details about the patient's medical records and are kept longer.
This is a free-form entry and will be reviewed manually by the insurance provider.
"""
medicalInstitutionName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""
The first name of the beneficiary (including any middle names).
"""
firstName: String!
"""
The last name of the beneficiary.
"""
lastName: String!
"""
The current gender of the beneficiary.
**Note:** The core insurance system is still adopting a diverse gender option. This means we require a binary gender selection limited to MALE|FEMALE for now.
"""
gender: Gender!
"""
Date of birth of the beneficiary.
"""
dateOfBirth: Date!
"""
Current address of residence of the beneficiary.
"""
address: AddressInput!
"""
The percentage amount of the insurance payout assigned to the beneficiary.
The sum of all allotments of all life / death beneficiaries respectively should equal to 100.
"""
allotmentPercentage: Percentage!
"""
Indicates the rank for the allotments. rank : 1 = first beneficiary
"""
rank: Int!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomDocumentBeneficiaryInput {
"""
The first name of the beneficiary (including any middle names).
"""
documentTitle: String!
"""
The type of the author of the document.
"""
authorType: AuthorType!
"""
The first name of the author of the document.
"""
authorFirstName: String!
"""
The last name of the author of the document.
"""
authorLastName: String!
"""
The place the document was created.
"""
place: String!
"""
The date of the document.
"""
date: Date!
}
enum CustomerPolicyRole {
POLICY_HOLDER
MAILING
PAYER
INSURED_PERSON
ECONOMIC_INTEREST
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
EMPLOYER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""
The partner of the insured person at the time of death.
"""
PARTNER
"""
The legal heirs of the insured person.
"""
HEIRS
"""
The policy holder. Only accepted when the policy holder is not also the insured person —
otherwise the request is rejected with `BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED`.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput @oneOf {
"""
Beneficiary when the insured person dies.
"""
beneficiaryType: DeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners and legal heirs) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
An enum to indicate when the Death coverage for the policy is paid out in case of multiple Insured persons (only application to Liechtenstein Life Wealth policies)
"""
enum DeathCoveragePayoutType {
"""
The death coverage is paid out when the first person dies.
"""
FIRST_TO_DIE
"""
The death coverage is paid out when the last person dies.
"""
LAST_TO_DIE
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""
A short description of the error.
"""
message: String!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""
Male gender marker.
"""
MALE
"""
Female gender marker.
"""
FEMALE
}
"""
Customer's tax information - available only for business customers
"""
type IndividualPersonTaxIdentification {
"""
Indicates whether the user is liable to pay tax in the USA.
We are required to *explicitly* ask about the user's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the user moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the user indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the user has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
Currently, not including a German tax residency will result in a `GermanTaxResidencyRequiredError` response.
"""
taxResidences: [TaxResidency!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""
Existing customer is missing date of birth
"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""
Customer is missing email
"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""
Tax identification is not valid
"""
CUSTOMER_TAX_IDENTIFICATION
"""
Tax identification is mandatory for policyholder
"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
Tax identification is not valid
"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""
Fund selection is not valid
"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
reducedPremium must be between 24% and 100% of monthlyPremium
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""
premiumDurationInYears is longer than durationInYears of a quick offer
"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""
Quick-offer settings are outside the supported calculation subset.
"""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""
Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0
"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""
When PolicyReason is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
When MoneyOrigin is sent as OTHER - OtherReason can not be null
"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
Custom beneficiaries allotment total should be 100%
"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""
disabilityAnnuity requires premiumWaiver to also be set
"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
"""
Input that defines the various reasons to make an investment.
"""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Person who is nominated to be beneficiary in case of maturity of the policy and the insured person is alive.
This option should be used when 100% of the policy amount is paid to a single beneficiary.
"""
enum LifeBeneficiary {
"""
The owner of the policy.
"""
POLICY_HOLDER
}
"""
Input to define the people who are nominated as beneficiaries in case of maturity of the policy and the insured person is alive.
"""
input LifeBeneficiaryInput @oneOf {
"""
Beneficiary when the policy matures or is terminated and the insured person is alive.
Defaults to `POLICY_HOLDER` when `LifeBeneficiaryInput` is not specified.
"""
beneficiaryType: LifeBeneficiary
"""
Configure an elaborate beneficiary with multiple beneficiaries and percentages.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Types of marital states.
"""
enum MaritalStatus {
"""
Single, never married.
"""
SINGLE
"""
Officially registered, partnered.
"""
REGISTERED
"""
Married, legally recognized.
"""
MARRIED
"""
Separated and not living together but not officially divorced.
"""
SEPARATED
"""
Divorced, legally recognized.
"""
DIVORCED
"""
Partner has passed away.
"""
WIDOWED
}
"""
The minimum death benefit is the minimum amount that must be paid out upon the death of the policyholder.
"""
enum MinimumDeathBenefit {
"""
Upon death, the benefit paid must be at least 101% of the actuarial reserve (the accumulated contract value) plus the trust fund value (if any).
"""
ACTUARIAL_RESERVE_101
"""
German regulatory minimum death benefit, i.e. _Steuerliche Mindesttodesfallleistung_ value.
The minimum taxable death benefit consists of 100% of the NAV during the first 5 years. Afterwards, it consists of 100% of NAV plus 10% of paid premiums linearly decreasing towards 0% until the end of the duration (values may vary depending on the insurance product, please check the product documentation).
"""
TAX_MINIMUM
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
best value rent. Market: Germany. Separate compensation agreements are not supported.
"""
bestValueRent: CreateBestValueRentInput
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
"""
Prosperity 3A is a Swiss pillar 3a pension solution combining tax-advantaged savings with individual investment strategies.
Market: Switzerland
"""
prosperity3A: CreateProsperity3AInput
"""
Prosperity Plus (3B) is a Swiss pillar 3b pension solution combining long-term protection with individual investment strategies.
Unlike 3A, it does not have tax benefits but offers more flexibility.
Market: Switzerland
"""
prosperityPlus: CreateProsperityPlusInput
"""
Liechtenstein Life Pension is a German Basisrente (Schicht 1) pension product.
Death beneficiary is restricted to PARTNER only (Basisrente law, Schicht 1).
Market: Germany
"""
liechtensteinLifePension: CreateLiechtensteinLifePensionInput
"""
Value Invest VWL (Vermögenswirksame Leistungen) is a German employer-funded capital-forming
benefit policy. The employer (a company customer) is the `PAYER`; the employee is the
`POLICY_HOLDER`, `INSURED_PERSON`, `MAILING`, and `ECONOMIC_INTEREST`. The employee's
health questions are optional: see `insuredPersonsHealthStatus`.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""
Input to associated persons for the policy
"""
input ProsperityPlusAssociatedPersonInput {
"""
Information about the person associated with the policy.
"""
person: CreateOfferCustomerByInput!
"""
The roles of the person in the policy.
"""
role: [ProsperityPlusPolicyPersonRole!]!
}
"""
Different products can support different roles.
"""
enum ProsperityPlusPolicyPersonRole {
"""
Person with economic interest in the policy (beneficial owner). Required for AML compliance.
"""
ECONOMIC_INTEREST
"""
The person whose life is insured under the policy.
"""
INSURED_PERSON
"""
Person or address to receive policy correspondence.
"""
MAILING
"""
Person responsible for premium payments if different from the policyholder.
"""
PAYER
"""
The policyholder and contract owner.
"""
POLICY_HOLDER
}
"""
Information about the customer's current financial state for Prosperity Plus 3B.
"""
input ProsperityPlusFinancialStatusInput {
"""
Whether the source of overall wealth differs from the money origin used for premium payments.
Default: false.
"""
differentWealthOrigin: Boolean
"""
The origin of the money that the customer is using to pay the premiums with.
"""
moneyOrigin: MoneyOrigin!
"""
The custom source of customer's current income when the `moneyOrigin` does not cover the use-case.
The value needs to be set when the `moneyOrigin` is set as `OTHER`.
"""
moneyOriginOtherText: String
"""
Payment method for the policy.
If omitted, the insurance system auto-assigns a standing order.
Note: LSV+ is not supported for Prosperity Plus 3B.
"""
paymentMethod: ProsperityPlusPaymentMethodInput
"""
The reason the customer is applying for a policy.
"""
policyReason: PolicyReason!
"""
The custom reason the customer is applying for a policy when the `PolicyReason` does not cover the use-case.
The value needs to be set when the `policyReason` is set as `OTHER`.
"""
policyReasonOtherText: String
"""
Total monthly expenses of the customer.
Amount is specified in the smallest monetary unit (Rappen for CHF) to avoid floating point math.
Example: 100000 represents CHF 1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Monthly net income of the customer.
Amount is specified in the smallest monetary unit (Rappen for CHF) to avoid floating point math.
Example: 100000 represents CHF 1,000.00
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""
Source of the customer's overall wealth. Required when `differentWealthOrigin` is true.
"""
wealthOrigin: MoneyOrigin
"""
Custom wealth origin description when `wealthOrigin` is `OTHER`.
"""
wealthOriginOtherText: String
}
"""
Payment method for Prosperity Plus 3B policies.
LSV+ is not supported for this product. Only wire transfer and ESR are available.
If omitted, the insurance system auto-assigns a standing order.
"""
input ProsperityPlusPaymentMethodInput @oneOf {
"""
ESR (Einzahlungsschein mit Referenznummer) — Swiss payment slip.
"""
esr: OnlyTrueValue
"""
Bank transfer — the customer will wire the payment to the given bank account.
"""
wireTransfer: OnlyTrueValue
}
"""
Configuration for creating an offer for the Prosperity Plus 3B insurance product.
"""
input ProsperityPlusProductConfigurationInput {
"""
One-time payment the customer would like to pay in when the policy starts.
Amount is specified in the smallest monetary unit (Rappen for CHF) to avoid floating point math.
Example: 1000000 represents CHF 10,000.00
"""
additionalPayment: MonetaryFractionalAmount!
"""
Age at which the policy ends. The policy must run for at least 10 years. Maximum end age is 85.
Constraints:
- Minimum: 18 years
- Maximum: 85 years
- Must be greater than the customer's age at start date
"""
ageWhenPolicyEnds: Int! @constraint(min: 18, max: 85)
"""
Death coverage configuration for the 3B policy.
"""
coverage: ProsperityPlusCoverageInput!
"""
Whether the cross-border tariff applies. When true, the cross-border tariff is used
for non-Swiss residents. Default: false (domestic Swiss tariff).
"""
crossBorderTariffApplicable: Boolean
"""
Death beneficiary configuration for the policy.
"""
deathBeneficiary: ProsperityPlusDeathBeneficiaryInput
"""
Disability annuity configuration.
When provided, the insured person receives a yearly pension in case of occupational disability.
Requires `premiumWaiver` to also be set. Omit if the customer does not want a disability annuity.
"""
disabilityAnnuity: ProsperityPlusDisabilityAnnuityInput
"""
Capital guarantee type for the policy.
When provided, a percentage of the invested capital is guaranteed at policy maturity.
Omit for no guarantee.
"""
guarantee: ProsperityPlusGuaranteeType
"""
Whether the insured person participates in an occupational pension scheme (BVG/2nd pillar). This information is used for internal premium calculations.
"""
hasSecondPillar: Boolean
"""
Investment strategy configuration including fund selection, risk level, and sustainability preferences.
"""
investmentStrategy: ProsperityPlusInvestmentStrategyInput!
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: ProsperityPlusContractLanguage
"""
Life beneficiary configuration for the policy. Defaults to the policyholder if not specified.
"""
lifeBeneficiary: LifeBeneficiaryInput
"""
Whether maturity management is enabled. When true, the insurance system automatically adjusts the investment strategy as the policy approaches maturity to reduce risk. Default: false.
"""
maturityManagement: Boolean
"""
Monthly premium amount.
Amount is specified in the smallest monetary unit (Rappen for CHF) to avoid floating point math.
Example: 10000 represents CHF 100.00
"""
monthlyPremium: MonetaryFractionalAmount!
"""
Whether documents should be delivered by post.
Default: false.
"""
postDelivery: Boolean
"""
Annual premium increase percentage. Valid values: 1.0, 1.5, 2.0, 2.5, 3.0.
Constraints (when provided):
- Minimum: 1.0%
- Maximum: 3.0%
Omit this field or set it to null for no annual adjustment.
"""
premiumDynamicPercentage: Float @constraint(min: 1, max: 3)
"""
Premium payment frequency. Defaults to monthly if omitted.
"""
premiumMode: ProsperityPlusPremiumMode
"""
Premium waiver (premium exemption) in case of occupational disability.
When provided, premium payments are waived after a waiting period if the insured person becomes disabled.
Omit if the customer does not want premium waiver coverage.
"""
premiumWaiver: ProsperityPlusPremiumWaiverInput
"""
When would the customer like to start the payment for the policy.
We recommend to use the first of the current month as the default value if there is no specific desired start date.
"""
startDate: Date!
}
"""
Language options for Prosperity Plus 3B contract documents.
"""
enum ProsperityPlusContractLanguage {
"""
Swiss German (Switzerland)
"""
DE_CH
"""
Standard German (Germany)
"""
DE_DE
"""
French
"""
FR_FR
"""
Italian
"""
IT_IT
}
"""
Premium payment frequency for Prosperity Plus 3B policies.
"""
enum ProsperityPlusPremiumMode {
"""
Annual payment (once per year).
"""
ANNUALLY
"""
Monthly payment (twelve times per year).
"""
MONTHLY
"""
Quarterly payment (four times per year).
"""
QUARTERLY
"""
Semi-annual payment (twice per year).
"""
SEMI_ANNUALLY
}
"""
Death coverage configuration for Prosperity Plus 3B policies.
"""
input ProsperityPlusCoverageInput {
"""
The death coverage amount in the smallest monetary unit (Rappen for CHF).
Example: 1000000 represents CHF 10,000.00
Required when type is `CHOSEN`. Ignored when type is `PERCENTAGE`.
"""
amount: MonetaryFractionalAmount
"""
The type of death coverage.
"""
type: ProsperityPlusCoverageType!
}
"""
Type of death coverage for Prosperity Plus 3B.
"""
enum ProsperityPlusCoverageType {
"""
A chosen death coverage amount.
"""
CHOSEN
"""
Minimum tax-compliant death coverage (the legally required minimum).
"""
PERCENTAGE
}
"""
Capital guarantee options for Prosperity Plus 3B policies.
Determines what percentage of invested capital is guaranteed at policy maturity.
Guarantee levels are subject to the terms and conditions of the insurance contract.
"""
enum ProsperityPlusGuaranteeType {
"""
No capital guarantee.
"""
NO_GUARANTEE
"""
50% capital guarantee at maturity.
"""
SELECT_50
"""
80% capital guarantee at maturity.
"""
SELECT_80
"""
90% capital guarantee at maturity.
"""
SELECT_90
"""
100% capital guarantee at maturity.
"""
SELECT_100
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input ProsperityPlusInvestmentStrategyInput {
"""
The funds that the customer/broker selected to invest in.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
"""
fundSelection: [FundSelectionInput!]!
"""
The reasons why the customer is making this investment choice.
"""
goals: InvestmentGoalsInput!
"""
Whether this is a low-risk investment profile.
The insurance system uses this to validate the selected funds against the customer's risk appetite.
"""
lowRiskInvestment: Boolean!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
"""
Maximum risk level the customer is willing to take with their investment.
The risk level must correspond to the selected funds — the insurance system validates this before issuing the policy.
"""
riskLevel: RiskLevel!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: ProsperityPlusSustainabilityDetailsInput!
}
"""
Input about the customer's knowledge of sustainable investing and sustainable investment choices for Prosperity Plus 3B.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input ProsperityPlusSustainabilityDetailsInput {
"""
The current state of user's knowledge of sustainable investing.
"""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the customer does not want a sustainable product.
"""
percentage: Int!
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
}
"""
Death beneficiary options for Prosperity Plus 3B.
"""
enum ProsperityPlusDeathBeneficiary {
"""
The legal heirs of the insured person.
"""
DEFAULT
}
"""
Death beneficiary configuration for Prosperity Plus 3B. Choose either a default beneficiary (legal heirs) or configure custom beneficiaries with percentage allotments.
"""
input ProsperityPlusDeathBeneficiaryInput @oneOf {
"""
The beneficiary type.
"""
beneficiaryType: ProsperityPlusDeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries and percentage allotments.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Premium waiver (premium exemption) configuration for Prosperity Plus 3B.
If the insured person becomes occupationally disabled, premium payments are waived after the waiting period.
"""
input ProsperityPlusPremiumWaiverInput {
"""
Waiting period in months before premium exemption takes effect.
Valid values: 6, 12, 24
"""
waitingPeriodMonths: Int! @constraint(pattern: "^(6|12|24)$")
}
"""
Disability annuity configuration for Prosperity Plus 3B.
Provides a yearly pension if the insured person becomes occupationally disabled.
"""
input ProsperityPlusDisabilityAnnuityInput {
"""
Yearly disability pension amount in the smallest monetary unit (Rappen for CHF).
Example: 300000 represents CHF 3,000.00
"""
yearlyPensionAmount: MonetaryFractionalAmount!
"""
Whether to exclude accident-related disability from coverage.
When true, only illness-related disability is covered.
"""
excludeAccident: Boolean!
"""
Whether the disability pension increases by 1% per year.
"""
annuityIncrease: Boolean!
"""
Waiting period in months before the disability annuity payments begin.
Valid values: 12, 24
"""
waitingPeriodMonths: Int! @constraint(pattern: "^(12|24)$")
"""
Job class for disability pricing. Must be an exact match from the valid job classes list.
See the full list at: https://partner-docs.life.li/platform-integrations/job-classes
"""
jobClass: String!
"""
Job risk level (1-5) associated with the job class.
Each job class has one or more valid risk levels — see https://partner-docs.life.li/platform-integrations/job-classes for the mapping.
"""
jobRisk: Int! @constraint(min: 1, max: 5)
}
"""
Health questionnaire for Prosperity Plus 3B insured persons.
Swiss-specific questions required for underwriting when premium waiver or disability annuity coverage is selected.
"""
input ProsperityPlusHealthInput {
"""
Additional health risk information from activities or occupation.
"""
additionalHealthRisk: ProsperityPlusAdditionalHealthRiskInformation!
"""
Drug or alcohol abuse history and treatment details.
"""
drugAbuse: ProsperityPlusDrugAbuseInformation!
"""
Employment workload as a percentage (0–100). Full-time employment is 100.
"""
employmentWorkload: Int!
"""
Existing insurance contract information.
"""
existingInsuranceContract: ProsperityPlusExistingInsuranceContractInformation!
"""
Whether the insured person has or has had an insurance contract with aggravated terms (e.g. exclusions, premium surcharges).
"""
hasAggravatedTermsContract: Boolean!
"""
Whether the insured person currently receives or has received a disability pension, or has a pending pension application.
"""
hasAnnuity: Boolean!
"""
Whether the insured person has any existing physical or mental disabilities, impairments, or congenital conditions.
"""
hasExistingDisabilities: Boolean!
"""
Whether the insured person has been diagnosed with HIV/AIDS.
"""
hasHIV: Boolean!
"""
Height in centimeters.
"""
height: Int!
"""
Hospitalization, operations, and medical treatment history.
"""
hospitalization: ProsperityPlusHospitalizationInformation!
"""
Known disease history in the last 10 years.
"""
knownDiseases: ProsperityPlusKnownDiseaseInformation!
"""
Name and address of the physician, therapist, or practitioner who can best provide information on the insured person's state of health.
"""
medicalPractitionerInformation: String!
"""
Regular medication history.
"""
medication: ProsperityPlusMedicationInformation!
"""
Smoking history and details.
"""
smoking: ProsperityPlusSmokingInformation!
"""
Weight in kilograms.
"""
weight: Int!
"""
Whether the insured person is self-employed.
"""
worksAsSelfEmployed: Boolean!
}
"""
Health-questionnaire container for Prosperity Plus (Swiss pillar 3b) offers. Exactly one variant key must be set — the chosen key determines which underwriting questionnaire the insurance system receives.
Variant mapping:
- `detailed` → `HealthQuestionnaireType.DETAILED`, equivalent payload to the legacy `insuredPersonsHealthStatus: ProsperityPlusHealthInput`.
- `simplifiedDeathBenefit` → `HealthQuestionnaireType.SIMPLIFIED_DEATH_BENEFIT`, for offers that only carry a death-benefit rider.
- `simplifiedPremiumWaiver` → `HealthQuestionnaireType.SIMPLIFIED_PREMIUM_WAIVER`, for offers that include the premium-waiver rider.
Submitted via the `insuredPersonsHealthStatusV2` field on `CreateProsperityPlusInput`. Must not be combined with the legacy `insuredPersonsHealthStatus` — setting both returns `HEALTH_STATE_BOTH_VERSIONS_SET`.
"""
input ProsperityPlusHealthStatusV2Input @oneOf {
"""
Full detailed questionnaire. Same payload as the legacy `insuredPersonsHealthStatus: ProsperityPlusHealthInput`; use when the partner has not enrolled in the simplified-underwriting programme or when coverage amounts require full underwriting.
"""
detailed: ProsperityPlusHealthInput
"""
Simplified questionnaire for death-benefit-only offers (no premium-waiver, no disability-annuity). Requires the two-question disclosure set in `HealthSimplifiedDeathBenefitInput`.
"""
simplifiedDeathBenefit: HealthSimplifiedDeathBenefitInput
"""
Simplified questionnaire for offers that include the premium-waiver (premium-exoneration) rider. Adds serious-handicap, mental-illness and BMI disclosures on top of the death-benefit questionnaire — see `HealthSimplifiedPremiumWaiverInput`.
"""
simplifiedPremiumWaiver: HealthSimplifiedPremiumWaiverInput
}
"""
Additional health risk information for dangerous activities, sports, or occupational hazards.
"""
input ProsperityPlusAdditionalHealthRiskInformation {
"""
Further information about the additional risks.
Required when hasAdditionalRisks is true.
"""
additionalRiskDetails: String
"""
Whether the insured person engages in activities with additional risk (e.g. dangerous sports, hazardous hobbies, or occupational hazards).
"""
hasAdditionalRisks: Boolean!
}
"""
Drug or alcohol abuse history and treatment details.
"""
input ProsperityPlusDrugAbuseInformation {
"""
Whether the insured person has ever been treated for or consulted about drug or alcohol abuse.
"""
hasBeenTreatedForDrugAbuse: Boolean!
"""
Details about the substances consumed and quantity.
Required when hasBeenTreatedForDrugAbuse is true.
"""
substanceDetails: String
"""
Details about the treatment or consultation, including the reason and period.
Required when hasBeenTreatedForDrugAbuse is true.
"""
treatmentDetails: String
}
"""
Existing insurance contract information.
"""
input ProsperityPlusExistingInsuranceContractInformation {
"""
Does the insured person already have life insurance, professional insurance, or disability insurance with another provider, or are you simultaneously submitting such applications?
"""
hasExistingInsuranceContract: Boolean!
"""
Name of the insurance provider, type and amount of the insurance, and date of application submission.
Required when hasExistingInsuranceContract is true.
"""
insuranceDetails: String
}
"""
Hospitalization, operations, and medical treatment history.
"""
input ProsperityPlusHospitalizationInformation {
"""
Whether the insured person has been hospitalized, had operations, or received medical treatments in the last 10 years.
"""
hasBeenHospitalized: Boolean!
"""
Details about the hospitalization, including the time period and reason.
Required when hasBeenHospitalized is true.
"""
hospitalizationDetails: String
}
"""
Known disease history in the last 10 years.
"""
input ProsperityPlusKnownDiseaseInformation {
"""
Further information about the diseases or complaints.
Required when hasHadKnownDiseases is true.
"""
diseaseDetails: String
"""
Whether the insured person has suffered from illnesses or complaints in the last 10 years, including conditions relating to the heart and cardiovascular system (e.g. high blood pressure, heart attack, stroke), brain (e.g. migraines), blood (e.g. clotting disorder), respiratory organs (e.g. asthma), hearing, eyes, thyroid, pancreas, liver (e.g. hepatitis), kidneys, urinary and genital organs, nervous system or mind (e.g. depression, multiple sclerosis), musculoskeletal system (spine, joints), skin (e.g. neurodermatitis), tumours (e.g. cancer), diabetes, allergies, rheumatic illnesses, or infectious diseases.
"""
hasHadKnownDiseases: Boolean!
}
"""
Regular medication history.
"""
input ProsperityPlusMedicationInformation {
"""
Whether the insured person is currently taking, or has frequently taken, medicine, sleeping pills, or sedatives in the last 10 years.
"""
hasBeenRegularlyMedicated: Boolean!
"""
Details about the medication, including which medicine, in what quantity, and over which period.
Required when hasBeenRegularlyMedicated is true.
"""
medicationDetails: String
}
"""
Smoking history and details.
"""
input ProsperityPlusSmokingInformation {
"""
Whether the insured person has smoked cigarettes, cigars, or similar substances in the last 12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when hasSmoked is true.
"""
smokingDetails: String
}
"""
Payment method to use for payment of the policy premium and any one-time opt-in payments.
**Only direct debit and wire transfer is supported right now.**
This describes how the **payer** settles the premium — the party holding the `PAYER` role,
which is not necessarily the policyholder. On Value Invest VWL it never is: the payer there is
always the employer, and the premium is a capital-forming benefit transferred by the employer,
never collected from the employee.
"""
input PaymentMethodInput @oneOf {
"""
The Direct Debit/SEPA information to use for debiting payments.
The SEPA mandate will be requested for this account in the policy contract from the payer.
"""
directDebit: DirectDebitInput
"""
The premium is transferred by the payer rather than debited, typically as a standing order
set up with their own bank. No bank details are collected. Selecting this arm also answers
who arranges that standing order:
- `true` — the payer sets it up themselves. Nobody is notified; arranging the transfer is
on you and the payer.
- `false` — the payer is notified by Liechtenstein Life to set the standing order up.
**Only Value Invest VWL accepts `false`**; every other product rejects it with
`FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED`.
For Value Invest VWL this arm is the usual choice: the employer transfers the capital-forming
contribution, so nothing is collected from the employee's account. Choose `false` when you
want the employer contacted directly, and `true` when you take on forwarding them the
standing-order page from the application document yourself.
"""
wireTransfer: Boolean
}
"""
Indicate how the amount should be paid out to the beneficiaries.
"""
input PayoutPlanInput {
"""
The IBAN number of the account that payouts will be made to.
"""
iban: IBAN!
"""
The account holder of the account that payouts will be made to.
"""
accountHolder: String!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
Various reasons for obtaining the policy.
"""
enum PolicyReason {
"""
The policy as a private pension for the user.
"""
PRIVATE_PENSION
"""
The policy to accumulate capital.
"""
CAPITAL_ACCUMULATION
"""
The policy to transfer assets with tax benefits.
"""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""
The policy as risk coverage.
"""
RISK_COVERAGE
"""
Other reason for obtaining the policy.
"""
OTHER
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""
No re-balancing is done after the initial fund allotment.
"""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""
Medium level investment risk.
"""
MEDIUM
"""
High level investment risk.
"""
HIGH
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Tax identification number or equivalent.
Format varies by country according to local regulations.
Examples:
- Germany: _Steueridentifikationsnummer_ (11 digits)
- France: _Numéro fiscal de référence_ (13 characters)
"""
id: String!
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
Additional tax number if required by the country.
Some jurisdictions require multiple tax identifiers.
Example: Local tax office number
"""
taxNumber: String
}
"""
Term fix allows you to transfer assets to your beneficiary at a certain time when a certain event occurs.
With the term-fixed date, you determine when the insurance benefit should be paid out to the beneficiary if the insured event (triggered by the death of the only or last insured person under the policy) occurs earlier.
"""
input TermFixInput {
"""
Designated date when the beneficiary should be paid out.
"""
term: Date!
"""
Events that trigger the payout of the insurance benefit to the beneficiary.
"""
events: [TermFixEventType!]!
"""
The funds in which the NAV should be invested during the waiting period.
"""
funds: [FundSelectionInput!]!
}
```
## Important
- All monetary amounts are in Rappen (1 CHF = 100 Rappen). Example: 15000 = CHF 150.00, 1000000 = CHF 10,000.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## Key differences from Prosperity 3A
- No tax benefits — unlike 3A, Prosperity Plus (3b) does not offer tax-deductible contributions, but provides more flexibility
- Supports both `lifeBeneficiary` and `deathBeneficiary` in productConfiguration
- Has `hasSecondPillar` boolean and `postDelivery` boolean
- No 3A transfer — `transferExisting3APolicy` is not available
- Age range 18–99 — broader than 3A's 60–70
- Payment method — only `wireTransfer` and `esr` (no LSV+)
- Premium modes: ANNUALLY, SEMI_ANNUALLY, QUARTERLY, MONTHLY
- Guarantee options: NO_GUARANTEE, SELECT_50, SELECT_80, SELECT_90, SELECT_100
- Coverage type: CHOSEN requires amount; PERCENTAGE gives 101% of actuarial reserve
- Languages: DE_DE, DE_CH, FR_FR, IT_IT
- Currency is CHF
## What I need
Build the integration to create Prosperity Plus (3B) offers for Swiss customers. Map my customer data to the input shape above. After creating an offer, wait ~30 seconds before requesting documents (system sync delay).Example: Prosperity Plus (Swiss Pillar 3b)
{
"input": {
"prosperityPlus": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"INSURED_PERSON",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"newCustomer": {
"email": "sampleEmailAddress@example.com",
"firstName": "James",
"lastName": "Jones",
"gender": "MALE",
"dateOfBirth": "1985-07-21",
"maritalStatus": "MARRIED",
"nationality": "CH",
"profession": "IT",
"occupation": "Analyst",
"taxIdentification": {
"taxLiableInUSA": false,
"residencies": [
{
"country": "CH",
"id": "756.9217.0769.85"
}
]
},
"phoneNumber": "+41000000000",
"address": {
"country": "CH",
"city": "Ruggell",
"street": "Industriering",
"zip": "9491",
"houseNumber": "3",
"streetAppendix": null
},
"identification": {
"birthPlace": "Zürich",
"documentNumber": "P123457689",
"documentType": "PASSPORT",
"issueDate": "2014-03-21",
"issuedBy": "Zurich Tax Hall",
"validUntil": "2028-03-21"
}
}
}
}
],
"productConfiguration": {
"startDate": "2026-05-01",
"ageWhenPolicyEnds": 65,
"monthlyPremium": 10000,
"premiumMode": "MONTHLY",
"additionalPayment": 0,
"hasSecondPillar": true,
"guarantee": "NO_GUARANTEE",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "LU1894683009",
"percentage": 100
}
],
"goals": {
"taxBenefit": false,
"flexibility": true,
"longTerm": true
},
"rebalancingType": "NONE",
"lowRiskInvestment": false,
"sustainabilityDetails": {
"environmentalAndSocialInvestmentFocusLevel": "NORMAL",
"percentage": 0,
"topicsToExclude": [],
"topicsToInclude": [],
"customerKnowledgeStatus": "HAS_PRE_EXISTING_KNOWLEDGE"
}
},
"coverage": {
"type": "CHOSEN",
"amount": 1000000
},
"crossBorderTariffApplicable": false,
"maturityManagement": true,
"postDelivery": false,
"lifeBeneficiary": {
"beneficiaryType": "POLICY_HOLDER"
},
"deathBeneficiary": {
"beneficiaryType": "DEFAULT"
},
"language": "DE_CH"
},
"customerFinancialStatus": {
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 140000,
"totalMonthlyNetIncome": 200000,
"moneyOriginOtherText": null,
"policyReasonOtherText": null,
"differentWealthOrigin": false,
"paymentMethod": {
"wireTransfer": true
}
}
}
}
}
- No tax benefits — unlike 3A, Prosperity Plus (3b) does not offer tax-deductible contributions, but provides more flexibility
- All amounts are in the smallest monetary unit — Rappen for CHF (1 CHF = 100 Rappen). For example,
10000= CHF 100.00,1000000= CHF 10,000.00 - Beneficiaries — supports both
lifeBeneficiaryanddeathBeneficiaryinproductConfiguration:- Life beneficiary:
{ "beneficiaryType": "POLICY_HOLDER" }(default) or providecustomBeneficiariesarray (each entry requiresfirstName,lastName,dateOfBirth,gender,address,allotmentPercentage) - Death beneficiary:
{ "beneficiaryType": "DEFAULT" }(heirs) or custom withcustomBeneficiariesarray
- Life beneficiary:
hasSecondPillar— boolean indicating whether the customer has a second pillar pensionpostDelivery— boolean for postal delivery of documents- No 3A transfer —
transferExisting3APolicyis not available (pillar 3b is separate from 3a) - No
durationOverRetirement— this field is 3A-specific - Age range 18–99 — broader than 3A's 60–70 retirement constraint for
ageWhenPolicyEnds - Payment method — only
wireTransferandesrare available (no LSV+ direct debit) - Premium mode — use the
ProsperityPlusPremiumModeenum (ANNUALLY,SEMI_ANNUALLY,QUARTERLY,MONTHLY) - Disability annuity — requires
premiumWaiverto be set. ThejobClassandjobRiskmust be a valid pair from the job classes reference - Health questionnaire — required when
premiumWaiverordisabilityAnnuityis set inproductConfiguration. Uses the same structure as Prosperity 3A (insuredPersonsHealthStatus) - Guarantee — optional capital guarantee at maturity (
NO_GUARANTEE,SELECT_50,SELECT_80,SELECT_90,SELECT_100) - Coverage type —
CHOSENrequires anamount;PERCENTAGEgives 101% of actuarial reserve (no amount needed) - Language — use the
ProsperityPlusContractLanguageenum (DE_DE,DE_CH,FR_FR,IT_IT) - Currency is CHF — Swiss pillar 3b products use Swiss Francs
Preview prompt
Build an integration for Prosperity Duo 2026 through the Partner Platform GraphQL API, using the prosperityDuo input branch.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Implementation requirements
- Use the guide below as the creation contract. Confirm the acting partner has the explicit product grant; do not infer access from another Swiss product.
- Keep holder and relative roles separate for Duo/Junior. Calculate policy and payment terms from the holder's birth date, and validate the relative's product-specific entry age.
- Collect the customer's actual investment, financial and detailed health declarations. Never fill missing declarations from the example. Preserve positive disease and smoking details; do not substitute the German VWL health mapping or a simplified questionnaire.
- Use integer CHF minor units. A regular premium is the amount per payment. Wealth CH chooses exactly one single/regular premium variant and one cover variant.
- Retrieve product-specific funds through availableFunds. Use an available free fund and require lowRiskInvestment explicitly. A selected guarantee also requires maturityManagement:true.
- Handle top-level GraphQL errors and every declared union outcome. Persist the returned contractID and use the existing document-download flow after synchronization. Do not automatically retry a create after a timeout with an unknown outcome.
- Do not add unsupported relative annuities, cross-border tariffs or tariff years. Creation is not proof of signing readiness, underwriting acceptance, submission or issuance. Junior guardian signing is outside this creation support.
## Flow guide and example variables
Use `prosperityDuo` for a holder saving for a separate relative aged 16–60 at policy start. The holder carries `POLICY_HOLDER`, `PAYER`, `MAILING` and `ECONOMIC_INTEREST`; the relative carries `INSURED_PERSON` only. The holder supplies `policyHolderHealthStatus`, and the holder's age determines policy and payment terms.
This example references a synthetic holder born in 1985 and a relative born in 1990. Replace the customer references, date and fund selection before sending a request. Collect all declarations from the customer; the example answers are not defaults.
```json
{
"input": {
"prosperityDuo": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
},
{
"role": [
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-relative@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"regularPremium": 20000,
"premiumMode": "MONTHLY",
"additionalPayment": 100000,
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "LU0070176184",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
```
**Note:**
- Holder entry age: 18–75; relative entry age: 16–60; policy end by holder age 85.
- Minimum policy/payment terms: ten/five years. Annual premiums must be at least CHF 1,200, with an agreed regular-premium sum of at least CHF 12,000.
- `additionalPayment` is 0 or at least CHF 500. Regular premiums are amounts per payment, in CHF minor units.
- Retrieve funds with `availableFunds(product: PROSPERITY_DUO)`. Select50/80 require twenty policy/payment years; Select100 requires thirty. Any guarantee requires `maturityManagement: true`.
- Optional holder premium waiver requires entry age at most 60 and a waiting period of 6, 12 or 24 months. Relative disability annuities are not exposed.
- Follow the [shared Swiss requirements](#swiss-savings-requirements), including the environment-specific health questions and consultation protocol.
## Shared Swiss savings requirements
The Duo, Junior and Wealth CH branches require an explicit product grant for the acting partner. Existing access to another Swiss product does not grant access automatically. These branches support the listed tariffs only; companies, cross-border tariffs and other tariff years are not exposed.
Each individual can use the normal `newCustomer` or `existingCustomer` selector. Existing individuals must be linked to the acting broker and have a stored date of birth. For Duo and Junior, that requirement applies to both the holder and the relative. The holder needs an email address and tax-residency information. Do not give different individuals the same email address.
Collect every investment, financial and health answer from the customer. `customerFinancialStatus.hasSwissIncome` is required and records whether the holder has income in Switzerland. Supply the actual answer, including `false` for a holder without Swiss income; residence, nationality and CHF premiums do not establish it. Synthetic negative answers in examples are not defaults to fill on a customer's behalf.
All amounts are integer CHF minor units (Rappen): `20000` is CHF 200 and `100000` is CHF 1,000. `regularPremium` is the amount **per payment**. With `MONTHLY`, `20000` means CHF 200 twelve times a year; with `ANNUALLY`, it means only CHF 200 per year.
`lowRiskInvestment` is required. Supply the customer's actual declaration, including an explicit `false` when appropriate. Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order. Omitted document language defaults to `DE_CH`; `DE_DE`, `FR_FR` and `IT_IT` are also available.
#### Swiss consultation protocol
The application includes the consultation protocol even when `consultation` is omitted. The legacy `disableConsultationWaiver` input currently cannot remove those pages: the API always sends `external_advice_protocol: false`. A licensed broker can supply `consultation` to prefill the advice and confirmations. Omitting it leaves the protocol for completion rather than removing it.
#### Retrieve Swiss product funds
Use the product-specific fund catalogue before building the investment selection. Select free investment funds; the insurance system adds the applicable guarantee fund when a guarantee is selected.
```graphql
query SwissSavingsFunds($product: PlatformInsuranceProduct!) {
availableFunds(product: $product, pagination: { first: 100 }) {
__typename
... on AvailableFundsConnection {
edges {
node {
isin
name
isGuaranteeFund
}
}
pageInfo {
hasNextPage
endCursor
}
}
... on ErrorInterface {
message
}
}
}
```
Use `PROSPERITY_DUO`, `PROSPERITY_JUNIOR` or `LIECHTENSTEIN_LIFE_WEALTH_CH` for `$product`. Continue pagination when `hasNextPage` is true. Pass the selected `isin` as `fundSelection[].id`; percentages must sum to 100, with no duplicate funds and at most ten funds.
#### Swiss health questions by environment
The new Swiss branches follow the same temporary production split as Value Invest VWL for
smoking and physician details. All other detailed health declarations remain required.
| Declaration | Staging (`test2`) and Stable (`test`) | Production |
|---|---|---|
| Disease, medication and other detailed answers | Required and sent using the Swiss questionnaire keys | Required and sent using the same Swiss keys |
| `smoking` | Required and sent | Optional; validated for consistency when supplied, then omitted from the Lifeware request |
| `medicalPractitionerInformation` | Required and nonblank; sent as `medic` | Optional; omitted from the Lifeware request |
Both fields are nullable in the GraphQL schema because production permits their omission.
Staging and Stable validate the requirements during offer creation. An integration can send the
complete example payload in every environment; production currently leaves smoking and
physician details out of its provider request. Never invent a missing health answer.
Staging application PDFs verify the Swiss detailed mapping. Stable follows the non-production
mapping but has not been tested against Lifeware. The production split is a provisional mapping
based on the documented VWL rollout; **production behavior for these Swiss tariffs still needs
manual verification**. Do not replace the Swiss disease fields with VWL's combined-question
fields or apply its proposed EUR 35,000 threshold to CHF products.
#### Swiss age, premium and term rules
| Rule | Duo | Junior | Wealth CH: single | Wealth CH: regular |
|---|---|---|---|---|
| Holder entry age | 18–75 | 18–75 | 18–65 | 18–75 |
| Relative entry age | 16–60 | 0–15 | Holder is insured | Holder is insured |
| Holder end age | At most 85 | At most 85 | 60–100 | 60–85 |
| Minimum policy term | 10 years | 10 years | 10 years | 10 years |
| Minimum payment term | 5 years | 5 years | Single payment | 5 years |
| Minimum regular premium per year | CHF 1,200 | CHF 1,200 | Not applicable | CHF 2,000 |
| Minimum agreed regular-premium sum | CHF 12,000 | CHF 12,000 | Not applicable | CHF 10,000 |
| Initial top-up | 0 or at least CHF 500 | 0 or at least CHF 500 | Premium at least CHF 20,000 | 0 or at least CHF 1,000 |
For regular premiums, omit `ageUntilPremiumIsPaid` to pay until policy end. When present, it is the **holder's** age when payments end. The payment term must not exceed the policy term.
Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order; these branches expose no alternate payment-method input. Omitted document language defaults to `DE_CH`; `DE_DE`, `FR_FR` and `IT_IT` are also available.
##### Guarantees and maturity management
Use `NO_GUARANTEE`, `SELECT50`, `SELECT80` or `SELECT100`. Omit `guarantee` for no guarantee. Any selected guarantee requires `maturityManagement: true`.
| Variant | Select50/Select80 minimum policy term | Select100 minimum policy term | Minimum payment term with a guarantee |
|---|---|---|---|
| Duo and Junior | 20 years | 30 years | 20 years for Select50/80; 30 years for Select100 |
| Wealth CH: regular | 20 years | 30 years | 20 years for every guarantee level |
| Wealth CH: single | 10 years | 10 years | Single payment |
For Duo and Junior, optional `premiumWaiver` covers the holder's occupational disability, with a waiting period of 6, 12 or 24 months. Holder entry age must not exceed 60. The policy can continue beyond the waiver coverage period under the product terms. Wealth CH exposes no premium-waiver input.
#### Swiss detailed health declarations
`policyHolderHealthStatus` is required for all three branches. For Duo and Junior, the policyholder is the insured provider. The relative's separate `INSURED_PERSON` role does not make that relative the subject of this health declaration.
Use the detailed grouped fields shown above. A positive grouped answer requires its details; a negative answer must omit details. For example:
```json
{
"knownDiseases": {
"hasHadKnownDiseases": true,
"diseaseDetails": "Synthetic example: condition, period, recovery and treating practitioner"
},
"smoking": {
"hasSmoked": true,
"smokingDetails": "Synthetic example: substance and daily quantity"
}
}
```
The same consistency rule applies to existing insurance, additional health risks, medication, hospitalization and drug-abuse disclosures. Drug-abuse disclosures require both treatment and substance details. Provide the actual physician/practitioner information, body measurements and workload. Do not use the German VWL `hasCriticalIllness` fields or a simplified questionnaire as a substitute for these detailed Swiss declarations.
Disability annuities for the relative are not exposed by these creation branches. Relative health mapping remains unresolved. Junior's in-app guardian signing journey is also outside this creation support.
#### Swiss results, errors and documents
Handle `__typename`, every `ErrorInterface` result, and top-level GraphQL errors. Examples of validation outcomes include `PRODUCT_CONFIGURATION_SWISS_SAVINGS`, `HEALTH_STATE_SWISS_SAVINGS`, person-role errors and fund-selection errors. A partner without the product grant receives `UnauthorizedOperationError`.
A successful `CreatedOffer.contractID` identifies the offer. Follow the existing [document retrieval flow](https://partner.life.li/integration-docs/platform-integrations/creating-offers#option-1-download-application-document) to obtain its application form after synchronization. Inspect the generated application when verifying an integration, including positive health answers and the persons named on the form.
Creation does not establish signing readiness, underwriting acceptance, submission or policy issuance. The separate relative-health and guardian requirements must be resolved before relying on an end-to-end Duo/Junior application journey. Cross-border tariffs and other tariff years are not exposed by these branches.
These creation checks use staging (`test2`). Stable and production behavior require separate verification; a staging result does not establish parity.
## Relevant schema types
The CreateOfferInput excerpt contains only the prosperityDuo branch. The full schema also retains the other product branches.
```graphql
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
Prosperity Duo 2026: Swiss pillar 3b savings for a relative aged 16–60.
The policyholder and relative are separate people. Detailed policyholder health is required.
Disability annuities are not available through this branch.
"""
prosperityDuo: CreateProsperityDuoInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InsuranceSystemError | InputValidationError | UnauthorizedOperationError
"""
A product you can create an offer for. One vocabulary covers reading an offer's product
and discovering the funds it accepts.
For `availableFunds`, each value resolves to that product's **default** tariff. Three
products have a variant tariff chosen by an input on `createOffer` — cross-border on
`PROSPERITY_3A` and `PROSPERITY_PLUS`, and the GROSS tariff on `PROSPERITY_PLUS_GERMANY` —
and the variants are not covered yet. Ask us if you need one.
`Offer.product` identifies the product across its tariff variants; it does not identify the tariff.
"""
enum PlatformInsuranceProduct {
BEST_VALUE_RENT
LIECHTENSTEIN_LIFE_INVEST
LIECHTENSTEIN_LIFE_PENSION
LIECHTENSTEIN_LIFE_WEALTH
PROSPERITY_3A
PROSPERITY_PLUS
PROSPERITY_DUO
PROSPERITY_JUNIOR
LIECHTENSTEIN_LIFE_WEALTH_CH
PROSPERITY_PLUS_GERMANY
VALUE_INVEST_VWL
YOUR_LIFE_NETTO_PLUS
}
union AvailableFundsResult = AvailableFundsConnection | UnauthorizedOperationError | InputValidationError | UnexpectedError
"""
Cursor pagination. Omit it to get the first 50 funds.
Page in one direction at a time: `after` with `first` to go forwards, `before` with `last`
to go backwards. Mixing the two returns an `InputValidationError`.
"""
input FundsPaginationInput {
"""
Return the funds that come after this cursor. Take the value from `edges.cursor` or
`pageInfo.endCursor` of the previous page. Combine with `first`.
"""
after: String
"""Return the funds that come before this cursor. Combine with `last`."""
before: String
"""How many funds to return, counting forwards. Defaults to 50."""
first: Int @constraint(min: 1, max: 100)
"""
How many funds to return, counting backwards. Defaults to 50 when `before` is set.
"""
last: Int @constraint(min: 1, max: 100)
}
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
"""
Creates a Prosperity Duo offer for a relative aged 16–60 at policy start. The holder carries all roles except INSURED_PERSON;
the separate relative carries INSURED_PERSON only. Policy and premium end ages refer to the holder.
"""
input CreateProsperityDuoInput {
"""The adult holder and the separate relative aged 16–60."""
associatedPersons: [SwissSavingsAssociatedPersonInput!]!
"""The policyholder's financial position and source of funds."""
customerFinancialStatus: SwissSavingsFinancialStatusInput!
"""
Detailed health answers from the policyholder, who is the insured provider. Never answer for the relative here.
"""
policyHolderHealthStatus: SwissSavingsDetailedHealthInput!
"""Premiums, holder end ages and investment choices."""
productConfiguration: ProsperityRelativeProductConfigurationInput!
"""
Accepted for compatibility with other creation branches. Currently does not disable the consultation protocol.
"""
disableConsultationWaiver: Boolean
"""The licensed broker's advice, to prefill the consultation protocol."""
consultation: SwissConsultationInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""The contract number of the offer that has been successfully created."""
contractID: PolicyID!
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the requested customer was not found in the system.
Common causes:
- Customer does not exist in the system
- Invalid customer identifier provided
- On test environment, the customers reset every Thursday and customers created before that date are not available anymore.
"""
type CustomerNotFoundError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""One page of the product's fund range."""
type AvailableFundsConnection {
edges: [AvailableFundEdge!]!
pageInfo: PageInfo!
"""How many funds the product offers in total, across every page."""
totalCount: Int!
"""
When this product's fund list was last refreshed from the insurance system. `null` means we
hold no fund rows for this product — either it has never been refreshed, or its most recent
refresh found none, and we cannot currently tell those two cases apart. Either way, an empty
page is not a promise that the product has no funds — contact us if you expected some.
"""
syncedAt: DateTime
}
"""
In case an unexpected error occurs during the update customer operation. Please contact customer support for assistance.
"""
type UnexpectedError implements ErrorInterface {
message: String!
}
"""
An individual participating in a Swiss savings offer. Companies are not supported by these branches.
"""
input SwissSavingsAssociatedPersonInput {
"""
Create an individual or reference an existing individual associated with the broker.
"""
person: CreateOfferCustomerByInput!
"""
The individual's roles. Do not duplicate or split a role across entries.
"""
role: [SwissSavingsPolicyPersonRole!]!
}
"""
Financial declarations for a Swiss savings offer. Premiums settle by bank transfer/standing order.
"""
input SwissSavingsFinancialStatusInput {
"""
Whether the policyholder has income in Switzerland. Supply the customer's actual answer;
Swiss residence or a CHF-denominated policy does not establish Swiss income.
"""
hasSwissIncome: Boolean!
"""
Whether overall wealth comes from a different source than the premium payments. Omit for false.
"""
differentWealthOrigin: Boolean
"""Source of funds used for premium payments."""
moneyOrigin: MoneyOrigin!
"""Required when moneyOrigin is OTHER; otherwise omit."""
moneyOriginOtherText: NonEmptyString
"""The policyholder's purpose for this policy."""
policyReason: PolicyReason!
"""Required when policyReason is OTHER; otherwise omit."""
policyReasonOtherText: NonEmptyString
"""Monthly expenses in CHF minor units: 100000 means CHF 1,000."""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""Monthly net income in CHF minor units: 100000 means CHF 1,000."""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""Required when differentWealthOrigin is true; otherwise omit."""
wealthOrigin: MoneyOrigin
"""Required when wealthOrigin is OTHER; otherwise omit."""
wealthOriginOtherText: NonEmptyString
}
"""
Detailed health declaration for the policyholder. For Duo/Junior this is the insured provider, not the relative. Simplified questionnaires and relative-health annuities are not supported. Positive answers require their details; negative answers must not carry details.
"""
input SwissSavingsDetailedHealthInput {
"""Additional health risk information from activities or occupation."""
additionalHealthRisk: ProsperityPlusAdditionalHealthRiskInformation!
"""Drug or alcohol abuse history and treatment details."""
drugAbuse: ProsperityPlusDrugAbuseInformation!
"""
Employment workload as a percentage (0–100). Full-time employment is 100.
"""
employmentWorkload: Int!
"""Existing insurance contract information."""
existingInsuranceContract: ProsperityPlusExistingInsuranceContractInformation!
"""
Whether the insured person has or has had an insurance contract with aggravated terms (e.g. exclusions, premium surcharges).
"""
hasAggravatedTermsContract: Boolean!
"""
Whether the insured person currently receives or has received a disability pension, or has a pending pension application.
"""
hasAnnuity: Boolean!
"""
Whether the insured person has any existing physical or mental disabilities, impairments, or congenital conditions.
"""
hasExistingDisabilities: Boolean!
"""Whether the insured person has been diagnosed with HIV/AIDS."""
hasHIV: Boolean!
"""Height in centimeters."""
height: Int!
"""Hospitalization, operations, and medical treatment history."""
hospitalization: ProsperityPlusHospitalizationInformation!
"""Known disease history in the last 10 years."""
knownDiseases: ProsperityPlusKnownDiseaseInformation!
"""
Name and address of the physician, therapist, or practitioner who can best provide information on the insured person's state of health.
Required outside production. Accepted but not sent to Lifeware in production during the health-question rollout.
"""
medicalPractitionerInformation: String
"""Regular medication history."""
medication: ProsperityPlusMedicationInformation!
"""
Smoking history and details. Required outside production.
When supplied in production, checked for consistency but not sent to Lifeware during the health-question rollout.
"""
smoking: ProsperityPlusSmokingInformation
"""Weight in kilograms."""
weight: Int!
"""Whether the insured person is self-employed."""
worksAsSelfEmployed: Boolean!
}
"""
Regular-premium choices shared by Duo and Junior. End ages always refer to the holder.
"""
input ProsperityRelativeProductConfigurationInput {
"""Initial top-up in CHF minor units. Use 0 or at least 50000 (CHF 500)."""
additionalPayment: MonetaryFractionalAmount!
"""
Holder's age at policy end, at most 85. Policy term must be at least ten years.
"""
ageWhenPolicyEnds: Int! @constraint(min: 18, max: 85)
"""
Holder's age when regular payments end. Omit to pay until policy end. Minimum payment term: five years.
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 85)
"""
Omit or choose NO_GUARANTEE for no guarantee. SELECT50/80 need twenty policy/payment years; SELECT100 needs thirty.
"""
guarantee: SwissSavingsGuarantee
"""
Customer investment choices, including an explicit low-risk declaration.
"""
investmentStrategy: SwissSavingsInvestmentStrategyInput!
"""Document language. Omit for DE_CH."""
language: SwissSavingsContractLanguage
"""Omit for false. Must be explicitly true with a premium guarantee."""
maturityManagement: Boolean
"""
Premium per payment in CHF minor units. Annualized premium must be at least CHF 1,200.
"""
regularPremium: MonetaryFractionalAmount!
"""Omit for MONTHLY."""
premiumMode: SwissSavingsPremiumMode
"""
Optional occupational-disability premium waiver for the holder. Holder entry age must not exceed 60.
"""
premiumWaiver: SwissSavingsPremiumWaiverInput
"""Whether to request postal delivery. Omit for false."""
postDelivery: Boolean
"""
Daily policy start, from today through three calendar months ahead. Backdating is not supported.
"""
startDate: Date!
}
"""
The advice you gave the customer before this application, for Swiss products.
Supplying this **pre-fills** the _Erklärungen und Einwilligungen_ section of the offer's
application form (Antrag). It does not remove that section: it is printed on every
application form whether you send this or not. Omitting it simply leaves it blank for the
customer to complete on paper.
The fields below cover every row of that section, so a submitted protocol leaves no row
for a human to tick. The form states that an application with an unticked row cannot be
accepted, which is why every field is mandatory.
Only a licensed broker may submit a consultation protocol. Unlicensed partners receive an
`UnauthorizedOperationError`.
"""
input SwissConsultationInput {
"""
Whether the consultation was conducted online rather than face to face.
"""
conductedConsultationOnline: Boolean!
"""The confirmations the customer gave during the consultation."""
protocol: SwissConsultationProtocolInput!
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""A short description of the error."""
message: String!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""reducedPremium must be between 24% and 100% of monthlyPremium"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""premiumDurationInYears is longer than durationInYears of a quick offer"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""Quick-offer settings are outside the supported calculation subset."""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""disabilityAnnuity requires premiumWaiver to also be set"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
type AvailableFundEdge {
"""
Pass this value as `after` or `before` to page from this fund. Opaque: do not build it
yourself, and do not store it beyond the walk — a fund the insurance system withdraws
takes its cursor with it, and the next page then returns an `InputValidationError` with
`PAGINATION_CURSOR_NOT_FOUND` rather than silently ending your walk.
"""
cursor: String!
node: AvailableFund!
}
"""Where the current page sits in the full list."""
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Roles for Swiss savings offers. For Duo/Junior, INSURED_PERSON identifies the relative, not the insured provider.
"""
enum SwissSavingsPolicyPersonRole {
"""The beneficial owner."""
ECONOMIC_INTEREST
"""The relative for Duo/Junior, or the policyholder for Wealth CH."""
INSURED_PERSON
"""The policy correspondence recipient."""
MAILING
"""The premium payer."""
PAYER
"""The contract owner and, for Duo/Junior, the insured provider."""
POLICY_HOLDER
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""The policy as a private pension for the user."""
PRIVATE_PENSION
"""The policy to accumulate capital."""
CAPITAL_ACCUMULATION
"""The policy to transfer assets with tax benefits."""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""The policy as risk coverage."""
RISK_COVERAGE
"""Other reason for obtaining the policy."""
OTHER
}
"""
Additional health risk information for dangerous activities, sports, or occupational hazards.
"""
input ProsperityPlusAdditionalHealthRiskInformation {
"""
Further information about the additional risks.
Required when hasAdditionalRisks is true.
"""
additionalRiskDetails: String
"""
Whether the insured person engages in activities with additional risk (e.g. dangerous sports, hazardous hobbies, or occupational hazards).
"""
hasAdditionalRisks: Boolean!
}
"""Drug or alcohol abuse history and treatment details."""
input ProsperityPlusDrugAbuseInformation {
"""
Whether the insured person has ever been treated for or consulted about drug or alcohol abuse.
"""
hasBeenTreatedForDrugAbuse: Boolean!
"""
Details about the substances consumed and quantity.
Required when hasBeenTreatedForDrugAbuse is true.
"""
substanceDetails: String
"""
Details about the treatment or consultation, including the reason and period.
Required when hasBeenTreatedForDrugAbuse is true.
"""
treatmentDetails: String
}
"""Existing insurance contract information."""
input ProsperityPlusExistingInsuranceContractInformation {
"""
Does the insured person already have life insurance, professional insurance, or disability insurance with another provider, or are you simultaneously submitting such applications?
"""
hasExistingInsuranceContract: Boolean!
"""
Name of the insurance provider, type and amount of the insurance, and date of application submission.
Required when hasExistingInsuranceContract is true.
"""
insuranceDetails: String
}
"""Hospitalization, operations, and medical treatment history."""
input ProsperityPlusHospitalizationInformation {
"""
Whether the insured person has been hospitalized, had operations, or received medical treatments in the last 10 years.
"""
hasBeenHospitalized: Boolean!
"""
Details about the hospitalization, including the time period and reason.
Required when hasBeenHospitalized is true.
"""
hospitalizationDetails: String
}
"""Known disease history in the last 10 years."""
input ProsperityPlusKnownDiseaseInformation {
"""
Further information about the diseases or complaints.
Required when hasHadKnownDiseases is true.
"""
diseaseDetails: String
"""
Whether the insured person has suffered from illnesses or complaints in the last 10 years, including conditions relating to the heart and cardiovascular system (e.g. high blood pressure, heart attack, stroke), brain (e.g. migraines), blood (e.g. clotting disorder), respiratory organs (e.g. asthma), hearing, eyes, thyroid, pancreas, liver (e.g. hepatitis), kidneys, urinary and genital organs, nervous system or mind (e.g. depression, multiple sclerosis), musculoskeletal system (spine, joints), skin (e.g. neurodermatitis), tumours (e.g. cancer), diabetes, allergies, rheumatic illnesses, or infectious diseases.
"""
hasHadKnownDiseases: Boolean!
}
"""Regular medication history."""
input ProsperityPlusMedicationInformation {
"""
Whether the insured person is currently taking, or has frequently taken, medicine, sleeping pills, or sedatives in the last 10 years.
"""
hasBeenRegularlyMedicated: Boolean!
"""
Details about the medication, including which medicine, in what quantity, and over which period.
Required when hasBeenRegularlyMedicated is true.
"""
medicationDetails: String
}
"""Smoking history and details."""
input ProsperityPlusSmokingInformation {
"""
Whether the insured person has smoked cigarettes, cigars, or similar substances in the last 12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when hasSmoked is true.
"""
smokingDetails: String
}
"""Premium guarantee levels supported by Duo, Junior and Wealth CH."""
enum SwissSavingsGuarantee {
"""No premium guarantee."""
NO_GUARANTEE
"""Select50."""
SELECT50
"""Select80."""
SELECT80
"""Select100."""
SELECT100
}
"""
Customer fund selection, risk appetite and sustainability choices for Swiss savings offers.
"""
input SwissSavingsInvestmentStrategyInput {
"""
The funds that the customer/broker selected to invest in.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
"""
fundSelection: [FundSelectionInput!]!
"""The reasons why the customer is making this investment choice."""
goals: InvestmentGoalsInput!
"""
Whether this is a low-risk investment profile.
The insurance system uses this to validate the selected funds against the customer's risk appetite.
"""
lowRiskInvestment: Boolean!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
"""
Maximum risk level the customer is willing to take with their investment.
The risk level must correspond to the selected funds — the insurance system validates this before issuing the policy.
"""
riskLevel: RiskLevel!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: ProsperityPlusSustainabilityDetailsInput!
}
"""Document language for Swiss savings offers."""
enum SwissSavingsContractLanguage {
"""Swiss German."""
DE_CH
"""Standard German."""
DE_DE
"""French."""
FR_FR
"""Italian."""
IT_IT
}
"""Number of regular premium payments per year."""
enum SwissSavingsPremiumMode {
"""One payment per year."""
ANNUALLY
"""Twelve payments per year."""
MONTHLY
"""Four payments per year."""
QUARTERLY
"""Two payments per year."""
SEMI_ANNUALLY
}
"""
Occupational-disability premium waiver for the Duo/Junior policyholder. Relative annuities are unavailable.
"""
input SwissSavingsPremiumWaiverInput {
"""Waiting period: 6, 12 or 24 months."""
waitingPeriodMonths: Int! @constraint(pattern: "^(6|12|24)$")
}
"""
Confirmations recorded in the _Erklärungen und Einwilligungen_ section for Swiss products.
Each field is one declaration printed on the application form, and sending it asserts the
customer gave you that confirmation — so submit a protocol only once you hold all of them.
Every field is `OnlyTrueValue` and mandatory: the insurance system will not accept an
application on which one is declined, so there is no way to express a partial protocol. If
any confirmation is missing, omit `consultation` entirely and the customer completes the
whole section on paper.
"""
input SwissConsultationProtocolInput {
"""
The policyholder was informed of their right of revocation (_Widerrufsrecht_).
"""
withdrawal: OnlyTrueValue!
"""
The policyholder was informed of the right of termination arising from a breach of the
duty to provide information (_Kündigungsrecht wegen Verletzung der Informationspflicht_).
"""
terminationRight: OnlyTrueValue!
"""
The policyholder was informed of the pre-contractual duty to notify
(_Vorvertragliche Anzeigepflicht_).
"""
preliminaryContract: OnlyTrueValue!
"""
The policyholder received all information the intermediary owes them under Article 45 of
the Swiss Insurance Supervision Act (_alle Informationen gemäss Artikel 45 VAG_).
"""
vagInfo: OnlyTrueValue!
"""
The policyholder received a duplicate or a copy of their insurance application.
"""
applicationCopy: OnlyTrueValue!
"""
The policyholder received the general terms and conditions of insurance (GTCI/AVB).
"""
receivedGeneralConditions: OnlyTrueValue!
"""The policyholder received the customer information."""
receivedCustomerInformation: OnlyTrueValue!
"""
The policyholder received the information on the fund selection (fund brochure and
PRIIP-KID).
"""
receivedInvestmentInformation: OnlyTrueValue!
"""The policyholder received the sample quotation (_Musterofferte_)."""
receivedOffer: OnlyTrueValue!
"""
The policyholder received the key information document for this insurance product
(_Das Basisinformationsblatt (BIB)_). This is the product's own BIB, distinct from the
per-fund PRIIP-KIDs covered by `receivedInvestmentInformation`.
"""
receivedBib: OnlyTrueValue!
"""
The policyholder agrees that the insurance cover begins before the right of revocation
expires.
"""
insuranceStartAgreement: OnlyTrueValue!
"""
The policyholder confirms they will comply with all tax obligations incumbent upon them
in their country of residence.
"""
taxObligations: OnlyTrueValue!
"""
All signatories confirm that the conclusion of, and the advice on, the insurance
contract took place exclusively in Switzerland.
"""
adviceConclusion: OnlyTrueValue!
"""
All signatories irrevocably release Liechtenstein Life Assurance AG from Liechtenstein
trade secrecy and any privacy policy, and consent to reports to domestic and foreign
(tax) authorities.
"""
privacyAcceptance: OnlyTrueValue!
"""
All signatories agree to delivery by email or electronic transmission, unless they
expressly chose "Paper Mail".
"""
communicationAgreement: OnlyTrueValue!
"""
The policyholder confirms they were given sufficient opportunity to study all insurance
documents, and have read and understood them.
"""
timeToStudyAllDocuments: OnlyTrueValue!
"""
All signatories confirm that the information provided is correct and accept the terms
and conditions of the contract.
"""
termAndConditionsAgreement: OnlyTrueValue!
"""
The policyholder and the premium payer confirm they have fulfilled all tax obligations
with regard to the premiums paid.
"""
policyholderPayerPremiumTaxObligations: OnlyTrueValue!
"""
The insured person — and, for minors and wards, their legal representative — consents to
the contract being concluded on their life and confirms the health questions were
answered truthfully and in full.
"""
healthsAgreement: OnlyTrueValue!
"""
The signatories declare they had the opportunity to read the data protection information
sheet and the section on data processing in the client information.
"""
dataProcessing: OnlyTrueValue!
}
"""A fund the product offers."""
type AvailableFund {
"""The value to pass as `FundSelectionInput.id` when creating an offer."""
isin: String!
"""The fund's name as the insurance system reports it."""
name: String
"""
The insurance system's own risk classification, from 1 (lowest) to 7 (highest). `null`
means the fund carries no risk profile. This is the fund's risk, not the customer's
appetite: we deliberately publish no rule mapping one to the other, because the ceiling
the insurer enforces at issuance is not ours to state. Selecting funds above a customer's
profile is validated by the insurance system before issuance, not by this API.
"""
riskLevel: Int
"""Whether the insurance system classes the fund as sustainable."""
isSustainable: Boolean!
"""Whether this is a guarantee fund."""
isGuaranteeFund: Boolean!
}
"""
Input to create a new customer in the insurance system and associate them with the offer that is being created.
"""
input NewCustomerInput {
"""
Email address of the customer.
**This field is optional unless the customer is a policyholder. Policyholders need access to this email to later activate the policy in the Prosperity App.**
"""
email: Email
"""First name of the customer (including any middle names)."""
firstName: String!
"""Last name of the customer."""
lastName: String!
"""
Date of birth of the customer, used to calculate entry age and populate the policy application.
The date cannot be in the future. Age limits depend on the product and the customer's policy role.
Prosperity Junior permits an insured child aged 0–15; the policyholder must satisfy the adult entry limits.
"""
dateOfBirth: Date!
"""The current gender of the customer."""
gender: Gender!
"""The current marital status of the customer."""
maritalStatus: MaritalStatus!
"""
The nationality of the customer.
The ISO 3166 country code for the current country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
nationality: Country!
"""Home address of the customer."""
address: AddressInput!
"""
Verified mobile phone number of the customer, in E.164 format (e.g. `+4917604069000`).
"""
phoneNumber: PhoneNumber @deprecated(reason: "Use `mobilePhone` instead. Mobile phone numbers are not used in the insurance system.")
"""
Verified mobile phone number of the customer, in E.164 format (e.g. `+4917604069000`).
"""
mobilePhone: PhoneNumber
"""
Landline phone number of the customer, in E.164 format (e.g. `+493023125000`).
"""
landline: PhoneNumber
"""
City or town where the customer was born, printed as "Geburtsort" on the application form (e.g. `Berlin`).
Send the place only: the country goes in `birthCountry`.
Not the same as `identification.birthPlace`, which records the place exactly as written on the identification document and is not printed on the application form.
"""
birthPlace: NonEmptyString
"""
Country where the customer was born, printed as "Geburtsland" on the application form.
The ISO 3166 country code for the country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
birthCountry: Country
"""What the customer studied and is qualified for."""
profession: String!
"""
What the customer presently does for a living.
Defaults to profession if not set.
"""
occupation: String
"""
Taxation information for the customer.
**This field is optional unless the customer is a policyholder**
"""
taxIdentification: TaxIdentificationInput
"""Information about the customer's identification document."""
identification: IdentificationInput
}
"""
Input to create a new corporate-entity customer (a company) inline as part of an offer.
Used today by Value Invest VWL where the offer's PAYER must be the employee's
employer — a corporate entity. The employee remains an individual and is provided
via `newCustomer` or `existingCustomer`.
"""
input CompanyTypeCustomerInput {
"""Official registered name of the corporate entity."""
name: String!
"""
Additional corporate name or trade name, if applicable (e.g. doing-business-as).
"""
additionalName: String
"""Name of the primary contact person at the corporate entity."""
contactName: String
"""
Legal form of the corporate entity (for example `AG`, `GmbH`, `OHG`, `KG`).
Passed through to the insurance system without translation.
"""
legalForm: String!
"""
Whether the corporate entity is a financial institution.
Required for KYC categorisation in the insurance system.
"""
financialInstitution: Boolean!
"""
Email address used to reach the corporate entity (typically the primary contact).
"""
email: Email
"""
Mobile phone number of the corporate entity's primary contact, in E.164 format
(e.g. `+4917604069000`).
"""
mobilePhone: PhoneNumber
"""
Landline phone number of the corporate entity, in E.164 format (e.g. `+493023125000`).
"""
landline: PhoneNumber
"""
Preferred communication language for the corporate entity. Defaults to `de_DE` if not provided.
"""
language: CustomerLanguage
"""Registered address of the corporate entity."""
address: AddressInput!
"""
Tax information of the corporate entity (VAT number, tax residency country, US tax status).
"""
taxInformation: CorporateEntityTaxIdentificationInput!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""Medium level investment risk."""
MEDIUM
"""High level investment risk."""
HIGH
}
"""
Input about the customer's knowledge of sustainable investing and sustainable investment choices for Prosperity Plus 3B.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input ProsperityPlusSustainabilityDetailsInput {
"""The current state of user's knowledge of sustainable investing."""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the customer does not want a sustainable product.
"""
percentage: Int!
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""Male gender marker."""
MALE
"""Female gender marker."""
FEMALE
}
"""Types of marital states."""
enum MaritalStatus {
"""Single, never married."""
SINGLE
"""Officially registered, partnered."""
REGISTERED
"""Married, legally recognized."""
MARRIED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Divorced, legally recognized."""
DIVORCED
"""Partner has passed away."""
WIDOWED
}
"""Information about a physical address."""
input AddressInput {
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""House number information."""
houseNumber: String!
"""ZIP or postal code."""
zip: String!
"""City in which the address is located."""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Input to provide information about taxation status in various country for the customer.
"""
input TaxIdentificationInput {
"""
Indicates whether the customer is liable to pay tax in the USA.
We are required to *explicitly* ask about the customer's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the customer moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the customer indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the customer has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
"""
residencies: [TaxResidencyInput!]!
}
"""Information about the customer's identification document."""
input IdentificationInput {
"""Type of identification document."""
documentType: IdentificationDocumentType!
"""Date when the document was issued."""
issueDate: Date!
"""Date until which the document is valid."""
validUntil: Date!
"""
Place where the customer was born (e.g. Berlin, Germany) exactly what is mentioned in the document.
"""
birthPlace: NonEmptyString
"""Document number or identifier."""
documentNumber: NonEmptyString!
"""Authority that issued the document."""
issuedBy: NonEmptyString!
}
enum CustomerLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
"""French"""
FR_FR
"""English"""
EN_US
"""Italian"""
IT_IT
}
"""Input to provide tax information of the Corporate customer"""
input CorporateEntityTaxIdentificationInput {
"""The VAT ID of the employing company"""
vatNumber: String
"""The VAT ID country of the employing company"""
taxIDCountry: Country
"""Indicates if the employing company has a US tax status"""
taxLiableInUSA: Boolean!
}
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
input ExistingCustomerByIDInput {
"""ID of the existing customer in the our system."""
ID: ID!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Type to represent the state of customer's knowledge about sustainability, sustainable investing, and sustainable funds (ESG).
Brokers are legally required to ask customers about their knowledge of sustainable investing and funds.
If the customer does not have sufficient knowledge, the broker must consult with them until they are educated.
These are the only 2 cases we accept, if your use-case does not fit these cases do not pass sustainability and talk to the customer and the insurance provider.
More information about the legal requirements and what the customers need to be informed about can be found here: https://www.eiopa.europa.eu/sites/default/files/publications/reports/guidance_on_integration_of_customers_sustainability_preferences_under_idd.pdf
"""
enum CustomerSustainabilityKnowledgeStatus {
"""
The customer has sufficient knowledge about sustainable investing and funds as per the ESG guidelines and has waived the need for further consultation when the option is provided.
The broker needs to ensure the customer has the knowledge and if not it's mandatory to consult and educate them.
"""
WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE
"""
The customer did not have pre-existing knowledge of sustainable investing or ESG.
The broker has consulted with the customer and has informed them about sustainable investing and ESG funds.
This can only be selected only if the partner has their own broker license as only a licensed broker can educate the customers.
"""
NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Information about the tax information for a given country the customer has residency in.
The customer may have one or more residency countries. We currently only validate Tax ID for Germany.
"""
input TaxResidencyInput {
"""
The Tax identification number (TIN) of the customer in the given country that is issued by the taxation authority.
If the country is Germany, the tax ID will be validated and if invalid then the response will be of type `TaxResidencyInputInvalidError`.
In this case we recommend re-trying the request without tax residency.
**Note:** For testing purposes you can generate valid testing tax IDs using e.g. https://generator.avris.it/.
"""
id: String!
"""
The ISO 3166 country code for the current country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""Type of identification document provided by the customer."""
enum IdentificationDocumentType {
"""Passport"""
PASSPORT
"""Driving license"""
DRIVERS_LICENSE
"""National Identity card"""
ID_CARD
"""Residence permit"""
RESIDENCE_PERMIT
"""Commerce register certificate"""
COMMERCE_REGISTER_CERTIFICATE
}
```
## Important
- All monetary amounts are in Rappen (1 CHF = 100 Rappen). Example: 15000 = CHF 150.00, 1000000 = CHF 10,000.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
Source: https://partner.life.li/integration-docs/platform-integrations/creating-offers#example-prosperity-duo
Use the deployed API schema for shared scalar definitions and the current broker's product fund catalogue.Example: Prosperity Duo (Swiss Pillar 3b)
Use prosperityDuo for a holder saving for a separate relative aged 16–60 at policy start. The holder carries POLICY_HOLDER, PAYER, MAILING and ECONOMIC_INTEREST; the relative carries INSURED_PERSON only. The holder supplies policyHolderHealthStatus, and the holder's age determines policy and payment terms.
This example references a synthetic holder born in 1985 and a relative born in 1990. Replace the customer references, date and fund selection before sending a request. Collect all declarations from the customer; the example answers are not defaults.
{
"input": {
"prosperityDuo": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
},
{
"role": [
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-relative@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"regularPremium": 20000,
"premiumMode": "MONTHLY",
"additionalPayment": 100000,
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "LU0070176184",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
- Holder entry age: 18–75; relative entry age: 16–60; policy end by holder age 85.
- Minimum policy/payment terms: ten/five years. Annual premiums must be at least CHF 1,200, with an agreed regular-premium sum of at least CHF 12,000.
additionalPaymentis 0 or at least CHF 500. Regular premiums are amounts per payment, in CHF minor units.- Retrieve funds with
availableFunds(product: PROSPERITY_DUO). Select50/80 require twenty policy/payment years; Select100 requires thirty. Any guarantee requiresmaturityManagement: true. - Optional holder premium waiver requires entry age at most 60 and a waiting period of 6, 12 or 24 months. Relative disability annuities are not exposed.
- Follow the shared Swiss requirements, including the environment-specific health questions and consultation protocol.
Preview prompt
Build an integration for Prosperity Junior 2026 through the Partner Platform GraphQL API, using the prosperityJunior input branch.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Implementation requirements
- Use the guide below as the creation contract. Confirm the acting partner has the explicit product grant; do not infer access from another Swiss product.
- Keep holder and relative roles separate for Duo/Junior. Calculate policy and payment terms from the holder's birth date, and validate the relative's product-specific entry age.
- Collect the customer's actual investment, financial and detailed health declarations. Never fill missing declarations from the example. Preserve positive disease and smoking details; do not substitute the German VWL health mapping or a simplified questionnaire.
- Use integer CHF minor units. A regular premium is the amount per payment. Wealth CH chooses exactly one single/regular premium variant and one cover variant.
- Retrieve product-specific funds through availableFunds. Use an available free fund and require lowRiskInvestment explicitly. A selected guarantee also requires maturityManagement:true.
- Handle top-level GraphQL errors and every declared union outcome. Persist the returned contractID and use the existing document-download flow after synchronization. Do not automatically retry a create after a timeout with an unknown outcome.
- Do not add unsupported relative annuities, cross-border tariffs or tariff years. Creation is not proof of signing readiness, underwriting acceptance, submission or issuance. Junior guardian signing is outside this creation support.
## Flow guide and example variables
Use `prosperityJunior` for an adult holder saving for a separate child aged 0–15 at policy start. The holder carries `POLICY_HOLDER`, `PAYER`, `MAILING` and `ECONOMIC_INTEREST`; the child carries `INSURED_PERSON` only. The holder supplies `policyHolderHealthStatus`; these are not the child's health answers. Policy and payment terms use the holder's age.
This example references a synthetic holder born in 1985 and a child born in 2018. Replace the customer references, date and fund selection before sending a request. Collect all declarations from the holder; the example answers are not defaults.
```json
{
"input": {
"prosperityJunior": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
},
{
"role": [
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-child@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"regularPremium": 20000,
"premiumMode": "MONTHLY",
"additionalPayment": 100000,
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "LU0070176184",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
```
**Note:**
- Holder entry age: 18–75; child entry age: 0–15; policy end by holder age 85.
- Minimum policy/payment terms: ten/five years. Annual premiums must be at least CHF 1,200, with an agreed regular-premium sum of at least CHF 12,000.
- `additionalPayment` is 0 or at least CHF 500. Regular premiums are amounts per payment, in CHF minor units.
- Retrieve funds with `availableFunds(product: PROSPERITY_JUNIOR)`. Select50/80 require twenty policy/payment years; Select100 requires thirty. Any guarantee requires `maturityManagement: true`.
- Optional holder premium waiver requires entry age at most 60 and a waiting period of 6, 12 or 24 months. Relative disability annuities and guardian signing are outside this creation support.
- Follow the [shared Swiss requirements](#swiss-savings-requirements), including the environment-specific health questions and consultation protocol.
## Shared Swiss savings requirements
The Duo, Junior and Wealth CH branches require an explicit product grant for the acting partner. Existing access to another Swiss product does not grant access automatically. These branches support the listed tariffs only; companies, cross-border tariffs and other tariff years are not exposed.
Each individual can use the normal `newCustomer` or `existingCustomer` selector. Existing individuals must be linked to the acting broker and have a stored date of birth. For Duo and Junior, that requirement applies to both the holder and the relative. The holder needs an email address and tax-residency information. Do not give different individuals the same email address.
Collect every investment, financial and health answer from the customer. `customerFinancialStatus.hasSwissIncome` is required and records whether the holder has income in Switzerland. Supply the actual answer, including `false` for a holder without Swiss income; residence, nationality and CHF premiums do not establish it. Synthetic negative answers in examples are not defaults to fill on a customer's behalf.
All amounts are integer CHF minor units (Rappen): `20000` is CHF 200 and `100000` is CHF 1,000. `regularPremium` is the amount **per payment**. With `MONTHLY`, `20000` means CHF 200 twelve times a year; with `ANNUALLY`, it means only CHF 200 per year.
`lowRiskInvestment` is required. Supply the customer's actual declaration, including an explicit `false` when appropriate. Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order. Omitted document language defaults to `DE_CH`; `DE_DE`, `FR_FR` and `IT_IT` are also available.
#### Swiss consultation protocol
The application includes the consultation protocol even when `consultation` is omitted. The legacy `disableConsultationWaiver` input currently cannot remove those pages: the API always sends `external_advice_protocol: false`. A licensed broker can supply `consultation` to prefill the advice and confirmations. Omitting it leaves the protocol for completion rather than removing it.
#### Retrieve Swiss product funds
Use the product-specific fund catalogue before building the investment selection. Select free investment funds; the insurance system adds the applicable guarantee fund when a guarantee is selected.
```graphql
query SwissSavingsFunds($product: PlatformInsuranceProduct!) {
availableFunds(product: $product, pagination: { first: 100 }) {
__typename
... on AvailableFundsConnection {
edges {
node {
isin
name
isGuaranteeFund
}
}
pageInfo {
hasNextPage
endCursor
}
}
... on ErrorInterface {
message
}
}
}
```
Use `PROSPERITY_DUO`, `PROSPERITY_JUNIOR` or `LIECHTENSTEIN_LIFE_WEALTH_CH` for `$product`. Continue pagination when `hasNextPage` is true. Pass the selected `isin` as `fundSelection[].id`; percentages must sum to 100, with no duplicate funds and at most ten funds.
#### Swiss health questions by environment
The new Swiss branches follow the same temporary production split as Value Invest VWL for
smoking and physician details. All other detailed health declarations remain required.
| Declaration | Staging (`test2`) and Stable (`test`) | Production |
|---|---|---|
| Disease, medication and other detailed answers | Required and sent using the Swiss questionnaire keys | Required and sent using the same Swiss keys |
| `smoking` | Required and sent | Optional; validated for consistency when supplied, then omitted from the Lifeware request |
| `medicalPractitionerInformation` | Required and nonblank; sent as `medic` | Optional; omitted from the Lifeware request |
Both fields are nullable in the GraphQL schema because production permits their omission.
Staging and Stable validate the requirements during offer creation. An integration can send the
complete example payload in every environment; production currently leaves smoking and
physician details out of its provider request. Never invent a missing health answer.
Staging application PDFs verify the Swiss detailed mapping. Stable follows the non-production
mapping but has not been tested against Lifeware. The production split is a provisional mapping
based on the documented VWL rollout; **production behavior for these Swiss tariffs still needs
manual verification**. Do not replace the Swiss disease fields with VWL's combined-question
fields or apply its proposed EUR 35,000 threshold to CHF products.
#### Swiss age, premium and term rules
| Rule | Duo | Junior | Wealth CH: single | Wealth CH: regular |
|---|---|---|---|---|
| Holder entry age | 18–75 | 18–75 | 18–65 | 18–75 |
| Relative entry age | 16–60 | 0–15 | Holder is insured | Holder is insured |
| Holder end age | At most 85 | At most 85 | 60–100 | 60–85 |
| Minimum policy term | 10 years | 10 years | 10 years | 10 years |
| Minimum payment term | 5 years | 5 years | Single payment | 5 years |
| Minimum regular premium per year | CHF 1,200 | CHF 1,200 | Not applicable | CHF 2,000 |
| Minimum agreed regular-premium sum | CHF 12,000 | CHF 12,000 | Not applicable | CHF 10,000 |
| Initial top-up | 0 or at least CHF 500 | 0 or at least CHF 500 | Premium at least CHF 20,000 | 0 or at least CHF 1,000 |
For regular premiums, omit `ageUntilPremiumIsPaid` to pay until policy end. When present, it is the **holder's** age when payments end. The payment term must not exceed the policy term.
Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order; these branches expose no alternate payment-method input. Omitted document language defaults to `DE_CH`; `DE_DE`, `FR_FR` and `IT_IT` are also available.
##### Guarantees and maturity management
Use `NO_GUARANTEE`, `SELECT50`, `SELECT80` or `SELECT100`. Omit `guarantee` for no guarantee. Any selected guarantee requires `maturityManagement: true`.
| Variant | Select50/Select80 minimum policy term | Select100 minimum policy term | Minimum payment term with a guarantee |
|---|---|---|---|
| Duo and Junior | 20 years | 30 years | 20 years for Select50/80; 30 years for Select100 |
| Wealth CH: regular | 20 years | 30 years | 20 years for every guarantee level |
| Wealth CH: single | 10 years | 10 years | Single payment |
For Duo and Junior, optional `premiumWaiver` covers the holder's occupational disability, with a waiting period of 6, 12 or 24 months. Holder entry age must not exceed 60. The policy can continue beyond the waiver coverage period under the product terms. Wealth CH exposes no premium-waiver input.
#### Swiss detailed health declarations
`policyHolderHealthStatus` is required for all three branches. For Duo and Junior, the policyholder is the insured provider. The relative's separate `INSURED_PERSON` role does not make that relative the subject of this health declaration.
Use the detailed grouped fields shown above. A positive grouped answer requires its details; a negative answer must omit details. For example:
```json
{
"knownDiseases": {
"hasHadKnownDiseases": true,
"diseaseDetails": "Synthetic example: condition, period, recovery and treating practitioner"
},
"smoking": {
"hasSmoked": true,
"smokingDetails": "Synthetic example: substance and daily quantity"
}
}
```
The same consistency rule applies to existing insurance, additional health risks, medication, hospitalization and drug-abuse disclosures. Drug-abuse disclosures require both treatment and substance details. Provide the actual physician/practitioner information, body measurements and workload. Do not use the German VWL `hasCriticalIllness` fields or a simplified questionnaire as a substitute for these detailed Swiss declarations.
Disability annuities for the relative are not exposed by these creation branches. Relative health mapping remains unresolved. Junior's in-app guardian signing journey is also outside this creation support.
#### Swiss results, errors and documents
Handle `__typename`, every `ErrorInterface` result, and top-level GraphQL errors. Examples of validation outcomes include `PRODUCT_CONFIGURATION_SWISS_SAVINGS`, `HEALTH_STATE_SWISS_SAVINGS`, person-role errors and fund-selection errors. A partner without the product grant receives `UnauthorizedOperationError`.
A successful `CreatedOffer.contractID` identifies the offer. Follow the existing [document retrieval flow](https://partner.life.li/integration-docs/platform-integrations/creating-offers#option-1-download-application-document) to obtain its application form after synchronization. Inspect the generated application when verifying an integration, including positive health answers and the persons named on the form.
Creation does not establish signing readiness, underwriting acceptance, submission or policy issuance. The separate relative-health and guardian requirements must be resolved before relying on an end-to-end Duo/Junior application journey. Cross-border tariffs and other tariff years are not exposed by these branches.
These creation checks use staging (`test2`). Stable and production behavior require separate verification; a staging result does not establish parity.
## Relevant schema types
The CreateOfferInput excerpt contains only the prosperityJunior branch. The full schema also retains the other product branches.
```graphql
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
Prosperity Junior 2026: Swiss pillar 3b savings for a child aged 0–15 at policy start.
The adult policyholder provides the detailed health declaration. Disability annuities and
the in-app guardian signing journey are not available through this branch.
"""
prosperityJunior: CreateProsperityJuniorInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InsuranceSystemError | InputValidationError | UnauthorizedOperationError
"""
A product you can create an offer for. One vocabulary covers reading an offer's product
and discovering the funds it accepts.
For `availableFunds`, each value resolves to that product's **default** tariff. Three
products have a variant tariff chosen by an input on `createOffer` — cross-border on
`PROSPERITY_3A` and `PROSPERITY_PLUS`, and the GROSS tariff on `PROSPERITY_PLUS_GERMANY` —
and the variants are not covered yet. Ask us if you need one.
`Offer.product` identifies the product across its tariff variants; it does not identify the tariff.
"""
enum PlatformInsuranceProduct {
BEST_VALUE_RENT
LIECHTENSTEIN_LIFE_INVEST
LIECHTENSTEIN_LIFE_PENSION
LIECHTENSTEIN_LIFE_WEALTH
PROSPERITY_3A
PROSPERITY_PLUS
PROSPERITY_DUO
PROSPERITY_JUNIOR
LIECHTENSTEIN_LIFE_WEALTH_CH
PROSPERITY_PLUS_GERMANY
VALUE_INVEST_VWL
YOUR_LIFE_NETTO_PLUS
}
union AvailableFundsResult = AvailableFundsConnection | UnauthorizedOperationError | InputValidationError | UnexpectedError
"""
Cursor pagination. Omit it to get the first 50 funds.
Page in one direction at a time: `after` with `first` to go forwards, `before` with `last`
to go backwards. Mixing the two returns an `InputValidationError`.
"""
input FundsPaginationInput {
"""
Return the funds that come after this cursor. Take the value from `edges.cursor` or
`pageInfo.endCursor` of the previous page. Combine with `first`.
"""
after: String
"""Return the funds that come before this cursor. Combine with `last`."""
before: String
"""How many funds to return, counting forwards. Defaults to 50."""
first: Int @constraint(min: 1, max: 100)
"""
How many funds to return, counting backwards. Defaults to 50 when `before` is set.
"""
last: Int @constraint(min: 1, max: 100)
}
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
"""
Creates a Prosperity Junior offer for a child aged 0–15 at policy start. The adult holder carries all
roles except INSURED_PERSON; the child carries INSURED_PERSON only. Relative-health annuities are unavailable.
"""
input CreateProsperityJuniorInput {
"""The adult policyholder and the separate child."""
associatedPersons: [SwissSavingsAssociatedPersonInput!]!
"""The policyholder's financial position and source of funds."""
customerFinancialStatus: SwissSavingsFinancialStatusInput!
"""
Detailed health answers from the adult policyholder. These are not the child's health answers.
"""
policyHolderHealthStatus: SwissSavingsDetailedHealthInput!
"""Premiums, holder end ages and investment choices."""
productConfiguration: ProsperityRelativeProductConfigurationInput!
"""
Accepted for compatibility with other creation branches. Currently does not disable the consultation protocol.
"""
disableConsultationWaiver: Boolean
"""The licensed broker's advice, to prefill the consultation protocol."""
consultation: SwissConsultationInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""The contract number of the offer that has been successfully created."""
contractID: PolicyID!
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the requested customer was not found in the system.
Common causes:
- Customer does not exist in the system
- Invalid customer identifier provided
- On test environment, the customers reset every Thursday and customers created before that date are not available anymore.
"""
type CustomerNotFoundError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""One page of the product's fund range."""
type AvailableFundsConnection {
edges: [AvailableFundEdge!]!
pageInfo: PageInfo!
"""How many funds the product offers in total, across every page."""
totalCount: Int!
"""
When this product's fund list was last refreshed from the insurance system. `null` means we
hold no fund rows for this product — either it has never been refreshed, or its most recent
refresh found none, and we cannot currently tell those two cases apart. Either way, an empty
page is not a promise that the product has no funds — contact us if you expected some.
"""
syncedAt: DateTime
}
"""
In case an unexpected error occurs during the update customer operation. Please contact customer support for assistance.
"""
type UnexpectedError implements ErrorInterface {
message: String!
}
"""
An individual participating in a Swiss savings offer. Companies are not supported by these branches.
"""
input SwissSavingsAssociatedPersonInput {
"""
Create an individual or reference an existing individual associated with the broker.
"""
person: CreateOfferCustomerByInput!
"""
The individual's roles. Do not duplicate or split a role across entries.
"""
role: [SwissSavingsPolicyPersonRole!]!
}
"""
Financial declarations for a Swiss savings offer. Premiums settle by bank transfer/standing order.
"""
input SwissSavingsFinancialStatusInput {
"""
Whether the policyholder has income in Switzerland. Supply the customer's actual answer;
Swiss residence or a CHF-denominated policy does not establish Swiss income.
"""
hasSwissIncome: Boolean!
"""
Whether overall wealth comes from a different source than the premium payments. Omit for false.
"""
differentWealthOrigin: Boolean
"""Source of funds used for premium payments."""
moneyOrigin: MoneyOrigin!
"""Required when moneyOrigin is OTHER; otherwise omit."""
moneyOriginOtherText: NonEmptyString
"""The policyholder's purpose for this policy."""
policyReason: PolicyReason!
"""Required when policyReason is OTHER; otherwise omit."""
policyReasonOtherText: NonEmptyString
"""Monthly expenses in CHF minor units: 100000 means CHF 1,000."""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""Monthly net income in CHF minor units: 100000 means CHF 1,000."""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""Required when differentWealthOrigin is true; otherwise omit."""
wealthOrigin: MoneyOrigin
"""Required when wealthOrigin is OTHER; otherwise omit."""
wealthOriginOtherText: NonEmptyString
}
"""
Detailed health declaration for the policyholder. For Duo/Junior this is the insured provider, not the relative. Simplified questionnaires and relative-health annuities are not supported. Positive answers require their details; negative answers must not carry details.
"""
input SwissSavingsDetailedHealthInput {
"""Additional health risk information from activities or occupation."""
additionalHealthRisk: ProsperityPlusAdditionalHealthRiskInformation!
"""Drug or alcohol abuse history and treatment details."""
drugAbuse: ProsperityPlusDrugAbuseInformation!
"""
Employment workload as a percentage (0–100). Full-time employment is 100.
"""
employmentWorkload: Int!
"""Existing insurance contract information."""
existingInsuranceContract: ProsperityPlusExistingInsuranceContractInformation!
"""
Whether the insured person has or has had an insurance contract with aggravated terms (e.g. exclusions, premium surcharges).
"""
hasAggravatedTermsContract: Boolean!
"""
Whether the insured person currently receives or has received a disability pension, or has a pending pension application.
"""
hasAnnuity: Boolean!
"""
Whether the insured person has any existing physical or mental disabilities, impairments, or congenital conditions.
"""
hasExistingDisabilities: Boolean!
"""Whether the insured person has been diagnosed with HIV/AIDS."""
hasHIV: Boolean!
"""Height in centimeters."""
height: Int!
"""Hospitalization, operations, and medical treatment history."""
hospitalization: ProsperityPlusHospitalizationInformation!
"""Known disease history in the last 10 years."""
knownDiseases: ProsperityPlusKnownDiseaseInformation!
"""
Name and address of the physician, therapist, or practitioner who can best provide information on the insured person's state of health.
Required outside production. Accepted but not sent to Lifeware in production during the health-question rollout.
"""
medicalPractitionerInformation: String
"""Regular medication history."""
medication: ProsperityPlusMedicationInformation!
"""
Smoking history and details. Required outside production.
When supplied in production, checked for consistency but not sent to Lifeware during the health-question rollout.
"""
smoking: ProsperityPlusSmokingInformation
"""Weight in kilograms."""
weight: Int!
"""Whether the insured person is self-employed."""
worksAsSelfEmployed: Boolean!
}
"""
Regular-premium choices shared by Duo and Junior. End ages always refer to the holder.
"""
input ProsperityRelativeProductConfigurationInput {
"""Initial top-up in CHF minor units. Use 0 or at least 50000 (CHF 500)."""
additionalPayment: MonetaryFractionalAmount!
"""
Holder's age at policy end, at most 85. Policy term must be at least ten years.
"""
ageWhenPolicyEnds: Int! @constraint(min: 18, max: 85)
"""
Holder's age when regular payments end. Omit to pay until policy end. Minimum payment term: five years.
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 85)
"""
Omit or choose NO_GUARANTEE for no guarantee. SELECT50/80 need twenty policy/payment years; SELECT100 needs thirty.
"""
guarantee: SwissSavingsGuarantee
"""
Customer investment choices, including an explicit low-risk declaration.
"""
investmentStrategy: SwissSavingsInvestmentStrategyInput!
"""Document language. Omit for DE_CH."""
language: SwissSavingsContractLanguage
"""Omit for false. Must be explicitly true with a premium guarantee."""
maturityManagement: Boolean
"""
Premium per payment in CHF minor units. Annualized premium must be at least CHF 1,200.
"""
regularPremium: MonetaryFractionalAmount!
"""Omit for MONTHLY."""
premiumMode: SwissSavingsPremiumMode
"""
Optional occupational-disability premium waiver for the holder. Holder entry age must not exceed 60.
"""
premiumWaiver: SwissSavingsPremiumWaiverInput
"""Whether to request postal delivery. Omit for false."""
postDelivery: Boolean
"""
Daily policy start, from today through three calendar months ahead. Backdating is not supported.
"""
startDate: Date!
}
"""
The advice you gave the customer before this application, for Swiss products.
Supplying this **pre-fills** the _Erklärungen und Einwilligungen_ section of the offer's
application form (Antrag). It does not remove that section: it is printed on every
application form whether you send this or not. Omitting it simply leaves it blank for the
customer to complete on paper.
The fields below cover every row of that section, so a submitted protocol leaves no row
for a human to tick. The form states that an application with an unticked row cannot be
accepted, which is why every field is mandatory.
Only a licensed broker may submit a consultation protocol. Unlicensed partners receive an
`UnauthorizedOperationError`.
"""
input SwissConsultationInput {
"""
Whether the consultation was conducted online rather than face to face.
"""
conductedConsultationOnline: Boolean!
"""The confirmations the customer gave during the consultation."""
protocol: SwissConsultationProtocolInput!
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""A short description of the error."""
message: String!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""reducedPremium must be between 24% and 100% of monthlyPremium"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""premiumDurationInYears is longer than durationInYears of a quick offer"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""Quick-offer settings are outside the supported calculation subset."""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""disabilityAnnuity requires premiumWaiver to also be set"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
type AvailableFundEdge {
"""
Pass this value as `after` or `before` to page from this fund. Opaque: do not build it
yourself, and do not store it beyond the walk — a fund the insurance system withdraws
takes its cursor with it, and the next page then returns an `InputValidationError` with
`PAGINATION_CURSOR_NOT_FOUND` rather than silently ending your walk.
"""
cursor: String!
node: AvailableFund!
}
"""Where the current page sits in the full list."""
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Roles for Swiss savings offers. For Duo/Junior, INSURED_PERSON identifies the relative, not the insured provider.
"""
enum SwissSavingsPolicyPersonRole {
"""The beneficial owner."""
ECONOMIC_INTEREST
"""The relative for Duo/Junior, or the policyholder for Wealth CH."""
INSURED_PERSON
"""The policy correspondence recipient."""
MAILING
"""The premium payer."""
PAYER
"""The contract owner and, for Duo/Junior, the insured provider."""
POLICY_HOLDER
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""The policy as a private pension for the user."""
PRIVATE_PENSION
"""The policy to accumulate capital."""
CAPITAL_ACCUMULATION
"""The policy to transfer assets with tax benefits."""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""The policy as risk coverage."""
RISK_COVERAGE
"""Other reason for obtaining the policy."""
OTHER
}
"""
Additional health risk information for dangerous activities, sports, or occupational hazards.
"""
input ProsperityPlusAdditionalHealthRiskInformation {
"""
Further information about the additional risks.
Required when hasAdditionalRisks is true.
"""
additionalRiskDetails: String
"""
Whether the insured person engages in activities with additional risk (e.g. dangerous sports, hazardous hobbies, or occupational hazards).
"""
hasAdditionalRisks: Boolean!
}
"""Drug or alcohol abuse history and treatment details."""
input ProsperityPlusDrugAbuseInformation {
"""
Whether the insured person has ever been treated for or consulted about drug or alcohol abuse.
"""
hasBeenTreatedForDrugAbuse: Boolean!
"""
Details about the substances consumed and quantity.
Required when hasBeenTreatedForDrugAbuse is true.
"""
substanceDetails: String
"""
Details about the treatment or consultation, including the reason and period.
Required when hasBeenTreatedForDrugAbuse is true.
"""
treatmentDetails: String
}
"""Existing insurance contract information."""
input ProsperityPlusExistingInsuranceContractInformation {
"""
Does the insured person already have life insurance, professional insurance, or disability insurance with another provider, or are you simultaneously submitting such applications?
"""
hasExistingInsuranceContract: Boolean!
"""
Name of the insurance provider, type and amount of the insurance, and date of application submission.
Required when hasExistingInsuranceContract is true.
"""
insuranceDetails: String
}
"""Hospitalization, operations, and medical treatment history."""
input ProsperityPlusHospitalizationInformation {
"""
Whether the insured person has been hospitalized, had operations, or received medical treatments in the last 10 years.
"""
hasBeenHospitalized: Boolean!
"""
Details about the hospitalization, including the time period and reason.
Required when hasBeenHospitalized is true.
"""
hospitalizationDetails: String
}
"""Known disease history in the last 10 years."""
input ProsperityPlusKnownDiseaseInformation {
"""
Further information about the diseases or complaints.
Required when hasHadKnownDiseases is true.
"""
diseaseDetails: String
"""
Whether the insured person has suffered from illnesses or complaints in the last 10 years, including conditions relating to the heart and cardiovascular system (e.g. high blood pressure, heart attack, stroke), brain (e.g. migraines), blood (e.g. clotting disorder), respiratory organs (e.g. asthma), hearing, eyes, thyroid, pancreas, liver (e.g. hepatitis), kidneys, urinary and genital organs, nervous system or mind (e.g. depression, multiple sclerosis), musculoskeletal system (spine, joints), skin (e.g. neurodermatitis), tumours (e.g. cancer), diabetes, allergies, rheumatic illnesses, or infectious diseases.
"""
hasHadKnownDiseases: Boolean!
}
"""Regular medication history."""
input ProsperityPlusMedicationInformation {
"""
Whether the insured person is currently taking, or has frequently taken, medicine, sleeping pills, or sedatives in the last 10 years.
"""
hasBeenRegularlyMedicated: Boolean!
"""
Details about the medication, including which medicine, in what quantity, and over which period.
Required when hasBeenRegularlyMedicated is true.
"""
medicationDetails: String
}
"""Smoking history and details."""
input ProsperityPlusSmokingInformation {
"""
Whether the insured person has smoked cigarettes, cigars, or similar substances in the last 12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when hasSmoked is true.
"""
smokingDetails: String
}
"""Premium guarantee levels supported by Duo, Junior and Wealth CH."""
enum SwissSavingsGuarantee {
"""No premium guarantee."""
NO_GUARANTEE
"""Select50."""
SELECT50
"""Select80."""
SELECT80
"""Select100."""
SELECT100
}
"""
Customer fund selection, risk appetite and sustainability choices for Swiss savings offers.
"""
input SwissSavingsInvestmentStrategyInput {
"""
The funds that the customer/broker selected to invest in.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
"""
fundSelection: [FundSelectionInput!]!
"""The reasons why the customer is making this investment choice."""
goals: InvestmentGoalsInput!
"""
Whether this is a low-risk investment profile.
The insurance system uses this to validate the selected funds against the customer's risk appetite.
"""
lowRiskInvestment: Boolean!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
"""
Maximum risk level the customer is willing to take with their investment.
The risk level must correspond to the selected funds — the insurance system validates this before issuing the policy.
"""
riskLevel: RiskLevel!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: ProsperityPlusSustainabilityDetailsInput!
}
"""Document language for Swiss savings offers."""
enum SwissSavingsContractLanguage {
"""Swiss German."""
DE_CH
"""Standard German."""
DE_DE
"""French."""
FR_FR
"""Italian."""
IT_IT
}
"""Number of regular premium payments per year."""
enum SwissSavingsPremiumMode {
"""One payment per year."""
ANNUALLY
"""Twelve payments per year."""
MONTHLY
"""Four payments per year."""
QUARTERLY
"""Two payments per year."""
SEMI_ANNUALLY
}
"""
Occupational-disability premium waiver for the Duo/Junior policyholder. Relative annuities are unavailable.
"""
input SwissSavingsPremiumWaiverInput {
"""Waiting period: 6, 12 or 24 months."""
waitingPeriodMonths: Int! @constraint(pattern: "^(6|12|24)$")
}
"""
Confirmations recorded in the _Erklärungen und Einwilligungen_ section for Swiss products.
Each field is one declaration printed on the application form, and sending it asserts the
customer gave you that confirmation — so submit a protocol only once you hold all of them.
Every field is `OnlyTrueValue` and mandatory: the insurance system will not accept an
application on which one is declined, so there is no way to express a partial protocol. If
any confirmation is missing, omit `consultation` entirely and the customer completes the
whole section on paper.
"""
input SwissConsultationProtocolInput {
"""
The policyholder was informed of their right of revocation (_Widerrufsrecht_).
"""
withdrawal: OnlyTrueValue!
"""
The policyholder was informed of the right of termination arising from a breach of the
duty to provide information (_Kündigungsrecht wegen Verletzung der Informationspflicht_).
"""
terminationRight: OnlyTrueValue!
"""
The policyholder was informed of the pre-contractual duty to notify
(_Vorvertragliche Anzeigepflicht_).
"""
preliminaryContract: OnlyTrueValue!
"""
The policyholder received all information the intermediary owes them under Article 45 of
the Swiss Insurance Supervision Act (_alle Informationen gemäss Artikel 45 VAG_).
"""
vagInfo: OnlyTrueValue!
"""
The policyholder received a duplicate or a copy of their insurance application.
"""
applicationCopy: OnlyTrueValue!
"""
The policyholder received the general terms and conditions of insurance (GTCI/AVB).
"""
receivedGeneralConditions: OnlyTrueValue!
"""The policyholder received the customer information."""
receivedCustomerInformation: OnlyTrueValue!
"""
The policyholder received the information on the fund selection (fund brochure and
PRIIP-KID).
"""
receivedInvestmentInformation: OnlyTrueValue!
"""The policyholder received the sample quotation (_Musterofferte_)."""
receivedOffer: OnlyTrueValue!
"""
The policyholder received the key information document for this insurance product
(_Das Basisinformationsblatt (BIB)_). This is the product's own BIB, distinct from the
per-fund PRIIP-KIDs covered by `receivedInvestmentInformation`.
"""
receivedBib: OnlyTrueValue!
"""
The policyholder agrees that the insurance cover begins before the right of revocation
expires.
"""
insuranceStartAgreement: OnlyTrueValue!
"""
The policyholder confirms they will comply with all tax obligations incumbent upon them
in their country of residence.
"""
taxObligations: OnlyTrueValue!
"""
All signatories confirm that the conclusion of, and the advice on, the insurance
contract took place exclusively in Switzerland.
"""
adviceConclusion: OnlyTrueValue!
"""
All signatories irrevocably release Liechtenstein Life Assurance AG from Liechtenstein
trade secrecy and any privacy policy, and consent to reports to domestic and foreign
(tax) authorities.
"""
privacyAcceptance: OnlyTrueValue!
"""
All signatories agree to delivery by email or electronic transmission, unless they
expressly chose "Paper Mail".
"""
communicationAgreement: OnlyTrueValue!
"""
The policyholder confirms they were given sufficient opportunity to study all insurance
documents, and have read and understood them.
"""
timeToStudyAllDocuments: OnlyTrueValue!
"""
All signatories confirm that the information provided is correct and accept the terms
and conditions of the contract.
"""
termAndConditionsAgreement: OnlyTrueValue!
"""
The policyholder and the premium payer confirm they have fulfilled all tax obligations
with regard to the premiums paid.
"""
policyholderPayerPremiumTaxObligations: OnlyTrueValue!
"""
The insured person — and, for minors and wards, their legal representative — consents to
the contract being concluded on their life and confirms the health questions were
answered truthfully and in full.
"""
healthsAgreement: OnlyTrueValue!
"""
The signatories declare they had the opportunity to read the data protection information
sheet and the section on data processing in the client information.
"""
dataProcessing: OnlyTrueValue!
}
"""A fund the product offers."""
type AvailableFund {
"""The value to pass as `FundSelectionInput.id` when creating an offer."""
isin: String!
"""The fund's name as the insurance system reports it."""
name: String
"""
The insurance system's own risk classification, from 1 (lowest) to 7 (highest). `null`
means the fund carries no risk profile. This is the fund's risk, not the customer's
appetite: we deliberately publish no rule mapping one to the other, because the ceiling
the insurer enforces at issuance is not ours to state. Selecting funds above a customer's
profile is validated by the insurance system before issuance, not by this API.
"""
riskLevel: Int
"""Whether the insurance system classes the fund as sustainable."""
isSustainable: Boolean!
"""Whether this is a guarantee fund."""
isGuaranteeFund: Boolean!
}
"""
Input to create a new customer in the insurance system and associate them with the offer that is being created.
"""
input NewCustomerInput {
"""
Email address of the customer.
**This field is optional unless the customer is a policyholder. Policyholders need access to this email to later activate the policy in the Prosperity App.**
"""
email: Email
"""First name of the customer (including any middle names)."""
firstName: String!
"""Last name of the customer."""
lastName: String!
"""
Date of birth of the customer, used to calculate entry age and populate the policy application.
The date cannot be in the future. Age limits depend on the product and the customer's policy role.
Prosperity Junior permits an insured child aged 0–15; the policyholder must satisfy the adult entry limits.
"""
dateOfBirth: Date!
"""The current gender of the customer."""
gender: Gender!
"""The current marital status of the customer."""
maritalStatus: MaritalStatus!
"""
The nationality of the customer.
The ISO 3166 country code for the current country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
nationality: Country!
"""Home address of the customer."""
address: AddressInput!
"""
Verified mobile phone number of the customer, in E.164 format (e.g. `+4917604069000`).
"""
phoneNumber: PhoneNumber @deprecated(reason: "Use `mobilePhone` instead. Mobile phone numbers are not used in the insurance system.")
"""
Verified mobile phone number of the customer, in E.164 format (e.g. `+4917604069000`).
"""
mobilePhone: PhoneNumber
"""
Landline phone number of the customer, in E.164 format (e.g. `+493023125000`).
"""
landline: PhoneNumber
"""
City or town where the customer was born, printed as "Geburtsort" on the application form (e.g. `Berlin`).
Send the place only: the country goes in `birthCountry`.
Not the same as `identification.birthPlace`, which records the place exactly as written on the identification document and is not printed on the application form.
"""
birthPlace: NonEmptyString
"""
Country where the customer was born, printed as "Geburtsland" on the application form.
The ISO 3166 country code for the country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
birthCountry: Country
"""What the customer studied and is qualified for."""
profession: String!
"""
What the customer presently does for a living.
Defaults to profession if not set.
"""
occupation: String
"""
Taxation information for the customer.
**This field is optional unless the customer is a policyholder**
"""
taxIdentification: TaxIdentificationInput
"""Information about the customer's identification document."""
identification: IdentificationInput
}
"""
Input to create a new corporate-entity customer (a company) inline as part of an offer.
Used today by Value Invest VWL where the offer's PAYER must be the employee's
employer — a corporate entity. The employee remains an individual and is provided
via `newCustomer` or `existingCustomer`.
"""
input CompanyTypeCustomerInput {
"""Official registered name of the corporate entity."""
name: String!
"""
Additional corporate name or trade name, if applicable (e.g. doing-business-as).
"""
additionalName: String
"""Name of the primary contact person at the corporate entity."""
contactName: String
"""
Legal form of the corporate entity (for example `AG`, `GmbH`, `OHG`, `KG`).
Passed through to the insurance system without translation.
"""
legalForm: String!
"""
Whether the corporate entity is a financial institution.
Required for KYC categorisation in the insurance system.
"""
financialInstitution: Boolean!
"""
Email address used to reach the corporate entity (typically the primary contact).
"""
email: Email
"""
Mobile phone number of the corporate entity's primary contact, in E.164 format
(e.g. `+4917604069000`).
"""
mobilePhone: PhoneNumber
"""
Landline phone number of the corporate entity, in E.164 format (e.g. `+493023125000`).
"""
landline: PhoneNumber
"""
Preferred communication language for the corporate entity. Defaults to `de_DE` if not provided.
"""
language: CustomerLanguage
"""Registered address of the corporate entity."""
address: AddressInput!
"""
Tax information of the corporate entity (VAT number, tax residency country, US tax status).
"""
taxInformation: CorporateEntityTaxIdentificationInput!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""Medium level investment risk."""
MEDIUM
"""High level investment risk."""
HIGH
}
"""
Input about the customer's knowledge of sustainable investing and sustainable investment choices for Prosperity Plus 3B.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input ProsperityPlusSustainabilityDetailsInput {
"""The current state of user's knowledge of sustainable investing."""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the customer does not want a sustainable product.
"""
percentage: Int!
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""Male gender marker."""
MALE
"""Female gender marker."""
FEMALE
}
"""Types of marital states."""
enum MaritalStatus {
"""Single, never married."""
SINGLE
"""Officially registered, partnered."""
REGISTERED
"""Married, legally recognized."""
MARRIED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Divorced, legally recognized."""
DIVORCED
"""Partner has passed away."""
WIDOWED
}
"""Information about a physical address."""
input AddressInput {
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""House number information."""
houseNumber: String!
"""ZIP or postal code."""
zip: String!
"""City in which the address is located."""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Input to provide information about taxation status in various country for the customer.
"""
input TaxIdentificationInput {
"""
Indicates whether the customer is liable to pay tax in the USA.
We are required to *explicitly* ask about the customer's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the customer moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the customer indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the customer has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
"""
residencies: [TaxResidencyInput!]!
}
"""Information about the customer's identification document."""
input IdentificationInput {
"""Type of identification document."""
documentType: IdentificationDocumentType!
"""Date when the document was issued."""
issueDate: Date!
"""Date until which the document is valid."""
validUntil: Date!
"""
Place where the customer was born (e.g. Berlin, Germany) exactly what is mentioned in the document.
"""
birthPlace: NonEmptyString
"""Document number or identifier."""
documentNumber: NonEmptyString!
"""Authority that issued the document."""
issuedBy: NonEmptyString!
}
enum CustomerLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
"""French"""
FR_FR
"""English"""
EN_US
"""Italian"""
IT_IT
}
"""Input to provide tax information of the Corporate customer"""
input CorporateEntityTaxIdentificationInput {
"""The VAT ID of the employing company"""
vatNumber: String
"""The VAT ID country of the employing company"""
taxIDCountry: Country
"""Indicates if the employing company has a US tax status"""
taxLiableInUSA: Boolean!
}
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
input ExistingCustomerByIDInput {
"""ID of the existing customer in the our system."""
ID: ID!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""
Type to represent the state of customer's knowledge about sustainability, sustainable investing, and sustainable funds (ESG).
Brokers are legally required to ask customers about their knowledge of sustainable investing and funds.
If the customer does not have sufficient knowledge, the broker must consult with them until they are educated.
These are the only 2 cases we accept, if your use-case does not fit these cases do not pass sustainability and talk to the customer and the insurance provider.
More information about the legal requirements and what the customers need to be informed about can be found here: https://www.eiopa.europa.eu/sites/default/files/publications/reports/guidance_on_integration_of_customers_sustainability_preferences_under_idd.pdf
"""
enum CustomerSustainabilityKnowledgeStatus {
"""
The customer has sufficient knowledge about sustainable investing and funds as per the ESG guidelines and has waived the need for further consultation when the option is provided.
The broker needs to ensure the customer has the knowledge and if not it's mandatory to consult and educate them.
"""
WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE
"""
The customer did not have pre-existing knowledge of sustainable investing or ESG.
The broker has consulted with the customer and has informed them about sustainable investing and ESG funds.
This can only be selected only if the partner has their own broker license as only a licensed broker can educate the customers.
"""
NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Information about the tax information for a given country the customer has residency in.
The customer may have one or more residency countries. We currently only validate Tax ID for Germany.
"""
input TaxResidencyInput {
"""
The Tax identification number (TIN) of the customer in the given country that is issued by the taxation authority.
If the country is Germany, the tax ID will be validated and if invalid then the response will be of type `TaxResidencyInputInvalidError`.
In this case we recommend re-trying the request without tax residency.
**Note:** For testing purposes you can generate valid testing tax IDs using e.g. https://generator.avris.it/.
"""
id: String!
"""
The ISO 3166 country code for the current country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""Type of identification document provided by the customer."""
enum IdentificationDocumentType {
"""Passport"""
PASSPORT
"""Driving license"""
DRIVERS_LICENSE
"""National Identity card"""
ID_CARD
"""Residence permit"""
RESIDENCE_PERMIT
"""Commerce register certificate"""
COMMERCE_REGISTER_CERTIFICATE
}
```
## Important
- All monetary amounts are in Rappen (1 CHF = 100 Rappen). Example: 15000 = CHF 150.00, 1000000 = CHF 10,000.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
Source: https://partner.life.li/integration-docs/platform-integrations/creating-offers#example-prosperity-junior
Use the deployed API schema for shared scalar definitions and the current broker's product fund catalogue.Example: Prosperity Junior (Swiss Pillar 3b)
Use prosperityJunior for an adult holder saving for a separate child aged 0–15 at policy start. The holder carries POLICY_HOLDER, PAYER, MAILING and ECONOMIC_INTEREST; the child carries INSURED_PERSON only. The holder supplies policyHolderHealthStatus; these are not the child's health answers. Policy and payment terms use the holder's age.
This example references a synthetic holder born in 1985 and a child born in 2018. Replace the customer references, date and fund selection before sending a request. Collect all declarations from the holder; the example answers are not defaults.
{
"input": {
"prosperityJunior": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
},
{
"role": [
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-child@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"regularPremium": 20000,
"premiumMode": "MONTHLY",
"additionalPayment": 100000,
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "LU0070176184",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
- Holder entry age: 18–75; child entry age: 0–15; policy end by holder age 85.
- Minimum policy/payment terms: ten/five years. Annual premiums must be at least CHF 1,200, with an agreed regular-premium sum of at least CHF 12,000.
additionalPaymentis 0 or at least CHF 500. Regular premiums are amounts per payment, in CHF minor units.- Retrieve funds with
availableFunds(product: PROSPERITY_JUNIOR). Select50/80 require twenty policy/payment years; Select100 requires thirty. Any guarantee requiresmaturityManagement: true. - Optional holder premium waiver requires entry age at most 60 and a waiting period of 6, 12 or 24 months. Relative disability annuities and guardian signing are outside this creation support.
- Follow the shared Swiss requirements, including the environment-specific health questions and consultation protocol.
Preview prompt
Build an integration for Liechtenstein Life Wealth CH 2025 through the Partner Platform GraphQL API, using the liechtensteinLifeWealthCH input branch. Support both single and regular premiums.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL mutation
```graphql
mutation CreateOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
}
}
```
## Implementation requirements
- Use the guide below as the creation contract. Confirm the acting partner has the explicit product grant; do not infer access from another Swiss product.
- Keep holder and relative roles separate for Duo/Junior. Calculate policy and payment terms from the holder's birth date, and validate the relative's product-specific entry age.
- Collect the customer's actual investment, financial and detailed health declarations. Never fill missing declarations from the example. Preserve positive disease and smoking details; do not substitute the German VWL health mapping or a simplified questionnaire.
- Use integer CHF minor units. A regular premium is the amount per payment. Wealth CH chooses exactly one single/regular premium variant and one cover variant.
- Retrieve product-specific funds through availableFunds. Use an available free fund and require lowRiskInvestment explicitly. A selected guarantee also requires maturityManagement:true.
- Handle top-level GraphQL errors and every declared union outcome. Persist the returned contractID and use the existing document-download flow after synchronization. Do not automatically retry a create after a timeout with an unknown outcome.
- Do not add unsupported relative annuities, cross-border tariffs or tariff years. Creation is not proof of signing readiness, underwriting acceptance, submission or issuance. Junior guardian signing is outside this creation support.
## Flow guide and example variables
Use `liechtensteinLifeWealthCH` with one individual carrying all five roles: `POLICY_HOLDER`, `INSURED_PERSON`, `PAYER`, `MAILING` and `ECONOMIC_INTEREST`. The holder supplies the financial and detailed health declarations. Choose exactly one premium variant and one death-cover variant.
These examples reference a synthetic holder born in 1985. Replace the customer reference, date and fund selection before sending a request. Collect every declaration from the customer; the example answers are not defaults.
#### Single premium
This example invests CHF 50,000 and selects fiscal minimum death cover.
```json
{
"input": {
"liechtensteinLifeWealthCH": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST",
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"premium": {
"singlePremium": 5000000
},
"coverage": {
"minimalTax": true
},
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "IE00B8J37J31",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
```
#### Regular premiums
This example pays CHF 200 each month and CHF 1,000 initially. `regularPremium` is the amount per payment, not an annual amount.
```json
{
"input": {
"liechtensteinLifeWealthCH": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST",
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"premium": {
"regularPremium": {
"regularPremium": 20000,
"premiumMode": "MONTHLY",
"additionalPayment": 100000
}
},
"coverage": {
"minimalTax": true
},
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "IE00B8J37J31",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
```
**Note:**
- Single premium: at least CHF 20,000; holder entry age 18–65; policy end age 60–100; minimum policy term ten years, including guarantees.
- Regular premiums: holder entry age 18–75; policy end age 60–85; minimum policy/payment terms ten/five years; at least CHF 2,000 annually and CHF 10,000 in agreed regular premiums. Initial top-up is 0 or at least CHF 1,000.
- Regular-premium Select50/80 require twenty policy years; Select100 requires thirty. Every regular-premium guarantee requires at least twenty payment years. Any guarantee requires `maturityManagement: true`.
- `premium` accepts exactly one of `singlePremium` or `regularPremium`. All amounts use CHF minor units.
- `coverage` accepts `minimalTax: true` or a positive `chosenAmount`. Chosen cover cannot exceed 200% of the applicable premium sum; Lifeware also validates its calculated minimum.
- Retrieve funds with `availableFunds(product: LIECHTENSTEIN_LIFE_WEALTH_CH)`. No premium-waiver input is exposed.
- Follow the [shared Swiss requirements](#swiss-savings-requirements), including the environment-specific health questions and consultation protocol.
## Shared Swiss savings requirements
The Duo, Junior and Wealth CH branches require an explicit product grant for the acting partner. Existing access to another Swiss product does not grant access automatically. These branches support the listed tariffs only; companies, cross-border tariffs and other tariff years are not exposed.
Each individual can use the normal `newCustomer` or `existingCustomer` selector. Existing individuals must be linked to the acting broker and have a stored date of birth. For Duo and Junior, that requirement applies to both the holder and the relative. The holder needs an email address and tax-residency information. Do not give different individuals the same email address.
Collect every investment, financial and health answer from the customer. `customerFinancialStatus.hasSwissIncome` is required and records whether the holder has income in Switzerland. Supply the actual answer, including `false` for a holder without Swiss income; residence, nationality and CHF premiums do not establish it. Synthetic negative answers in examples are not defaults to fill on a customer's behalf.
All amounts are integer CHF minor units (Rappen): `20000` is CHF 200 and `100000` is CHF 1,000. `regularPremium` is the amount **per payment**. With `MONTHLY`, `20000` means CHF 200 twelve times a year; with `ANNUALLY`, it means only CHF 200 per year.
`lowRiskInvestment` is required. Supply the customer's actual declaration, including an explicit `false` when appropriate. Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order. Omitted document language defaults to `DE_CH`; `DE_DE`, `FR_FR` and `IT_IT` are also available.
#### Swiss consultation protocol
The application includes the consultation protocol even when `consultation` is omitted. The legacy `disableConsultationWaiver` input currently cannot remove those pages: the API always sends `external_advice_protocol: false`. A licensed broker can supply `consultation` to prefill the advice and confirmations. Omitting it leaves the protocol for completion rather than removing it.
#### Retrieve Swiss product funds
Use the product-specific fund catalogue before building the investment selection. Select free investment funds; the insurance system adds the applicable guarantee fund when a guarantee is selected.
```graphql
query SwissSavingsFunds($product: PlatformInsuranceProduct!) {
availableFunds(product: $product, pagination: { first: 100 }) {
__typename
... on AvailableFundsConnection {
edges {
node {
isin
name
isGuaranteeFund
}
}
pageInfo {
hasNextPage
endCursor
}
}
... on ErrorInterface {
message
}
}
}
```
Use `PROSPERITY_DUO`, `PROSPERITY_JUNIOR` or `LIECHTENSTEIN_LIFE_WEALTH_CH` for `$product`. Continue pagination when `hasNextPage` is true. Pass the selected `isin` as `fundSelection[].id`; percentages must sum to 100, with no duplicate funds and at most ten funds.
#### Swiss health questions by environment
The new Swiss branches follow the same temporary production split as Value Invest VWL for
smoking and physician details. All other detailed health declarations remain required.
| Declaration | Staging (`test2`) and Stable (`test`) | Production |
|---|---|---|
| Disease, medication and other detailed answers | Required and sent using the Swiss questionnaire keys | Required and sent using the same Swiss keys |
| `smoking` | Required and sent | Optional; validated for consistency when supplied, then omitted from the Lifeware request |
| `medicalPractitionerInformation` | Required and nonblank; sent as `medic` | Optional; omitted from the Lifeware request |
Both fields are nullable in the GraphQL schema because production permits their omission.
Staging and Stable validate the requirements during offer creation. An integration can send the
complete example payload in every environment; production currently leaves smoking and
physician details out of its provider request. Never invent a missing health answer.
Staging application PDFs verify the Swiss detailed mapping. Stable follows the non-production
mapping but has not been tested against Lifeware. The production split is a provisional mapping
based on the documented VWL rollout; **production behavior for these Swiss tariffs still needs
manual verification**. Do not replace the Swiss disease fields with VWL's combined-question
fields or apply its proposed EUR 35,000 threshold to CHF products.
#### Swiss age, premium and term rules
| Rule | Duo | Junior | Wealth CH: single | Wealth CH: regular |
|---|---|---|---|---|
| Holder entry age | 18–75 | 18–75 | 18–65 | 18–75 |
| Relative entry age | 16–60 | 0–15 | Holder is insured | Holder is insured |
| Holder end age | At most 85 | At most 85 | 60–100 | 60–85 |
| Minimum policy term | 10 years | 10 years | 10 years | 10 years |
| Minimum payment term | 5 years | 5 years | Single payment | 5 years |
| Minimum regular premium per year | CHF 1,200 | CHF 1,200 | Not applicable | CHF 2,000 |
| Minimum agreed regular-premium sum | CHF 12,000 | CHF 12,000 | Not applicable | CHF 10,000 |
| Initial top-up | 0 or at least CHF 500 | 0 or at least CHF 500 | Premium at least CHF 20,000 | 0 or at least CHF 1,000 |
For regular premiums, omit `ageUntilPremiumIsPaid` to pay until policy end. When present, it is the **holder's** age when payments end. The payment term must not exceed the policy term.
Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order; these branches expose no alternate payment-method input. Omitted document language defaults to `DE_CH`; `DE_DE`, `FR_FR` and `IT_IT` are also available.
##### Guarantees and maturity management
Use `NO_GUARANTEE`, `SELECT50`, `SELECT80` or `SELECT100`. Omit `guarantee` for no guarantee. Any selected guarantee requires `maturityManagement: true`.
| Variant | Select50/Select80 minimum policy term | Select100 minimum policy term | Minimum payment term with a guarantee |
|---|---|---|---|
| Duo and Junior | 20 years | 30 years | 20 years for Select50/80; 30 years for Select100 |
| Wealth CH: regular | 20 years | 30 years | 20 years for every guarantee level |
| Wealth CH: single | 10 years | 10 years | Single payment |
For Duo and Junior, optional `premiumWaiver` covers the holder's occupational disability, with a waiting period of 6, 12 or 24 months. Holder entry age must not exceed 60. The policy can continue beyond the waiver coverage period under the product terms. Wealth CH exposes no premium-waiver input.
#### Swiss detailed health declarations
`policyHolderHealthStatus` is required for all three branches. For Duo and Junior, the policyholder is the insured provider. The relative's separate `INSURED_PERSON` role does not make that relative the subject of this health declaration.
Use the detailed grouped fields shown above. A positive grouped answer requires its details; a negative answer must omit details. For example:
```json
{
"knownDiseases": {
"hasHadKnownDiseases": true,
"diseaseDetails": "Synthetic example: condition, period, recovery and treating practitioner"
},
"smoking": {
"hasSmoked": true,
"smokingDetails": "Synthetic example: substance and daily quantity"
}
}
```
The same consistency rule applies to existing insurance, additional health risks, medication, hospitalization and drug-abuse disclosures. Drug-abuse disclosures require both treatment and substance details. Provide the actual physician/practitioner information, body measurements and workload. Do not use the German VWL `hasCriticalIllness` fields or a simplified questionnaire as a substitute for these detailed Swiss declarations.
Disability annuities for the relative are not exposed by these creation branches. Relative health mapping remains unresolved. Junior's in-app guardian signing journey is also outside this creation support.
#### Swiss results, errors and documents
Handle `__typename`, every `ErrorInterface` result, and top-level GraphQL errors. Examples of validation outcomes include `PRODUCT_CONFIGURATION_SWISS_SAVINGS`, `HEALTH_STATE_SWISS_SAVINGS`, person-role errors and fund-selection errors. A partner without the product grant receives `UnauthorizedOperationError`.
A successful `CreatedOffer.contractID` identifies the offer. Follow the existing [document retrieval flow](https://partner.life.li/integration-docs/platform-integrations/creating-offers#option-1-download-application-document) to obtain its application form after synchronization. Inspect the generated application when verifying an integration, including positive health answers and the persons named on the form.
Creation does not establish signing readiness, underwriting acceptance, submission or policy issuance. The separate relative-health and guardian requirements must be resolved before relying on an end-to-end Duo/Junior application journey. Cross-border tariffs and other tariff years are not exposed by these branches.
These creation checks use staging (`test2`). Stable and production behavior require separate verification; a staging result does not establish parity.
## Relevant schema types
The CreateOfferInput excerpt contains only the liechtensteinLifeWealthCH branch. The full schema also retains the other product branches.
```graphql
"""
Input for creating a new offer. Based on the selected product, different fields are required.
Each product option is mutually exclusive - only one can be provided.
"""
input CreateOfferInput @oneOf {
"""
Liechtenstein Life Wealth CH 2025: Swiss pillar 3b savings with a single or regular premium.
The policyholder is the insured person. Detailed policyholder health is required.
"""
liechtensteinLifeWealthCH: CreateLiechtensteinLifeWealthCHInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InsuranceSystemError | InputValidationError | UnauthorizedOperationError
"""
A product you can create an offer for. One vocabulary covers reading an offer's product
and discovering the funds it accepts.
For `availableFunds`, each value resolves to that product's **default** tariff. Three
products have a variant tariff chosen by an input on `createOffer` — cross-border on
`PROSPERITY_3A` and `PROSPERITY_PLUS`, and the GROSS tariff on `PROSPERITY_PLUS_GERMANY` —
and the variants are not covered yet. Ask us if you need one.
`Offer.product` identifies the product across its tariff variants; it does not identify the tariff.
"""
enum PlatformInsuranceProduct {
BEST_VALUE_RENT
LIECHTENSTEIN_LIFE_INVEST
LIECHTENSTEIN_LIFE_PENSION
LIECHTENSTEIN_LIFE_WEALTH
PROSPERITY_3A
PROSPERITY_PLUS
PROSPERITY_DUO
PROSPERITY_JUNIOR
LIECHTENSTEIN_LIFE_WEALTH_CH
PROSPERITY_PLUS_GERMANY
VALUE_INVEST_VWL
YOUR_LIFE_NETTO_PLUS
}
union AvailableFundsResult = AvailableFundsConnection | UnauthorizedOperationError | InputValidationError | UnexpectedError
"""
Cursor pagination. Omit it to get the first 50 funds.
Page in one direction at a time: `after` with `first` to go forwards, `before` with `last`
to go backwards. Mixing the two returns an `InputValidationError`.
"""
input FundsPaginationInput {
"""
Return the funds that come after this cursor. Take the value from `edges.cursor` or
`pageInfo.endCursor` of the previous page. Combine with `first`.
"""
after: String
"""Return the funds that come before this cursor. Combine with `last`."""
before: String
"""How many funds to return, counting forwards. Defaults to 50."""
first: Int @constraint(min: 1, max: 100)
"""
How many funds to return, counting backwards. Defaults to 50 when `before` is set.
"""
last: Int @constraint(min: 1, max: 100)
}
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
directive @oneOf on INPUT_OBJECT | FIELD_DEFINITION
"""
Creates a Wealth CH offer with one person holding every policy role and either a single or regular premium.
"""
input CreateLiechtensteinLifeWealthCHInput {
"""
Exactly one policyholder, who is also the insured person, payer, mailing recipient and beneficial owner.
"""
associatedPersons: [SwissSavingsAssociatedPersonInput!]!
"""The policyholder's financial position and source of funds."""
customerFinancialStatus: SwissSavingsFinancialStatusInput!
"""Detailed health answers from the policyholder and insured person."""
policyHolderHealthStatus: SwissSavingsDetailedHealthInput!
"""Premium variant, cover and investment choices."""
productConfiguration: LiechtensteinLifeWealthCHProductConfigurationInput!
"""
Accepted for compatibility with other creation branches. Currently does not disable the consultation protocol.
"""
disableConsultationWaiver: Boolean
"""The licensed broker's advice, to prefill the consultation protocol."""
consultation: SwissConsultationInput
}
"""
Information about the new offer that has been successfully created with the provided information.
"""
type CreatedOffer {
"""The contract number of the offer that has been successfully created."""
contractID: PolicyID!
}
"""
Error indicating that a customer record already exists in the core insurance system with the provided email address.
Resolution options:
- Query the `customers` field to get the identifier of the existing customer and use it to create an offer
- Use a different email address to create a new customer
"""
type CustomerAlreadyExistsError implements ErrorInterface {
message: String!
}
"""
Error indicating that the requested customer was not found in the system.
Common causes:
- Customer does not exist in the system
- Invalid customer identifier provided
- On test environment, the customers reset every Thursday and customers created before that date are not available anymore.
"""
type CustomerNotFoundError implements ErrorInterface {
message: String!
}
"""
Error indicating that the insurance system encountered an issue while processing the request that is not currently being handled by us. This includes
Common causes:
- System maintenance/downtime: The insurance system is undergoing maintenance or is down intermittently, please try again later.
- Invalid data combinations: The provided data is not valid, please check the `reasons` field for specific error details to fix the issue and try again..
"""
type InsuranceSystemError implements ErrorInterface {
message: String!
reasons: [String!]!
}
"""
Error indicating that the provided input data failed validation.
Resolution:
- Check the `invalidInput` field for specific validation errors
- Ensure all required fields are provided
- Verify that field values meet the specified constraints
"""
type InputValidationError implements ErrorInterface {
invalidInput: InvalidInputType!
}
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
- Missing permission to read policies
- Reading the policies of sub-brokers without entire-tree access
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""One page of the product's fund range."""
type AvailableFundsConnection {
edges: [AvailableFundEdge!]!
pageInfo: PageInfo!
"""How many funds the product offers in total, across every page."""
totalCount: Int!
"""
When this product's fund list was last refreshed from the insurance system. `null` means we
hold no fund rows for this product — either it has never been refreshed, or its most recent
refresh found none, and we cannot currently tell those two cases apart. Either way, an empty
page is not a promise that the product has no funds — contact us if you expected some.
"""
syncedAt: DateTime
}
"""
In case an unexpected error occurs during the update customer operation. Please contact customer support for assistance.
"""
type UnexpectedError implements ErrorInterface {
message: String!
}
"""
An individual participating in a Swiss savings offer. Companies are not supported by these branches.
"""
input SwissSavingsAssociatedPersonInput {
"""
Create an individual or reference an existing individual associated with the broker.
"""
person: CreateOfferCustomerByInput!
"""
The individual's roles. Do not duplicate or split a role across entries.
"""
role: [SwissSavingsPolicyPersonRole!]!
}
"""
Financial declarations for a Swiss savings offer. Premiums settle by bank transfer/standing order.
"""
input SwissSavingsFinancialStatusInput {
"""
Whether the policyholder has income in Switzerland. Supply the customer's actual answer;
Swiss residence or a CHF-denominated policy does not establish Swiss income.
"""
hasSwissIncome: Boolean!
"""
Whether overall wealth comes from a different source than the premium payments. Omit for false.
"""
differentWealthOrigin: Boolean
"""Source of funds used for premium payments."""
moneyOrigin: MoneyOrigin!
"""Required when moneyOrigin is OTHER; otherwise omit."""
moneyOriginOtherText: NonEmptyString
"""The policyholder's purpose for this policy."""
policyReason: PolicyReason!
"""Required when policyReason is OTHER; otherwise omit."""
policyReasonOtherText: NonEmptyString
"""Monthly expenses in CHF minor units: 100000 means CHF 1,000."""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""Monthly net income in CHF minor units: 100000 means CHF 1,000."""
totalMonthlyNetIncome: MonetaryFractionalAmount!
"""Required when differentWealthOrigin is true; otherwise omit."""
wealthOrigin: MoneyOrigin
"""Required when wealthOrigin is OTHER; otherwise omit."""
wealthOriginOtherText: NonEmptyString
}
"""
Detailed health declaration for the policyholder. For Duo/Junior this is the insured provider, not the relative. Simplified questionnaires and relative-health annuities are not supported. Positive answers require their details; negative answers must not carry details.
"""
input SwissSavingsDetailedHealthInput {
"""Additional health risk information from activities or occupation."""
additionalHealthRisk: ProsperityPlusAdditionalHealthRiskInformation!
"""Drug or alcohol abuse history and treatment details."""
drugAbuse: ProsperityPlusDrugAbuseInformation!
"""
Employment workload as a percentage (0–100). Full-time employment is 100.
"""
employmentWorkload: Int!
"""Existing insurance contract information."""
existingInsuranceContract: ProsperityPlusExistingInsuranceContractInformation!
"""
Whether the insured person has or has had an insurance contract with aggravated terms (e.g. exclusions, premium surcharges).
"""
hasAggravatedTermsContract: Boolean!
"""
Whether the insured person currently receives or has received a disability pension, or has a pending pension application.
"""
hasAnnuity: Boolean!
"""
Whether the insured person has any existing physical or mental disabilities, impairments, or congenital conditions.
"""
hasExistingDisabilities: Boolean!
"""Whether the insured person has been diagnosed with HIV/AIDS."""
hasHIV: Boolean!
"""Height in centimeters."""
height: Int!
"""Hospitalization, operations, and medical treatment history."""
hospitalization: ProsperityPlusHospitalizationInformation!
"""Known disease history in the last 10 years."""
knownDiseases: ProsperityPlusKnownDiseaseInformation!
"""
Name and address of the physician, therapist, or practitioner who can best provide information on the insured person's state of health.
Required outside production. Accepted but not sent to Lifeware in production during the health-question rollout.
"""
medicalPractitionerInformation: String
"""Regular medication history."""
medication: ProsperityPlusMedicationInformation!
"""
Smoking history and details. Required outside production.
When supplied in production, checked for consistency but not sent to Lifeware during the health-question rollout.
"""
smoking: ProsperityPlusSmokingInformation
"""Weight in kilograms."""
weight: Int!
"""Whether the insured person is self-employed."""
worksAsSelfEmployed: Boolean!
}
"""
Wealth CH choices for a single premium or regular premiums. The holder is also the insured person.
"""
input LiechtensteinLifeWealthCHProductConfigurationInput {
"""
End age: 60–100 for a single premium, or 60–85 for regular premiums. Policy term is at least ten years.
"""
ageWhenPolicyEnds: Int! @constraint(min: 60, max: 100)
"""
Minimum fiscal cover or a chosen amount. Lifeware also validates the applicable cover minimum.
"""
coverage: WealthCHCoverageInput!
"""Select the single-premium or regular-premium variant."""
premium: WealthCHPremiumInput!
"""
Omit or choose NO_GUARANTEE for no guarantee. Single-premium guarantees need ten years.
"""
guarantee: SwissSavingsGuarantee
"""
Customer investment choices, including an explicit low-risk declaration.
"""
investmentStrategy: SwissSavingsInvestmentStrategyInput!
"""Document language. Omit for DE_CH."""
language: SwissSavingsContractLanguage
"""Omit for false. Must be explicitly true with a premium guarantee."""
maturityManagement: Boolean
"""Whether to request postal delivery. Omit for false."""
postDelivery: Boolean
"""
Daily policy start, from today through three calendar months ahead. Backdating is not supported.
"""
startDate: Date!
}
"""
The advice you gave the customer before this application, for Swiss products.
Supplying this **pre-fills** the _Erklärungen und Einwilligungen_ section of the offer's
application form (Antrag). It does not remove that section: it is printed on every
application form whether you send this or not. Omitting it simply leaves it blank for the
customer to complete on paper.
The fields below cover every row of that section, so a submitted protocol leaves no row
for a human to tick. The form states that an application with an unticked row cannot be
accepted, which is why every field is mandatory.
Only a licensed broker may submit a consultation protocol. Unlicensed partners receive an
`UnauthorizedOperationError`.
"""
input SwissConsultationInput {
"""
Whether the consultation was conducted online rather than face to face.
"""
conductedConsultationOnline: Boolean!
"""The confirmations the customer gave during the consultation."""
protocol: SwissConsultationProtocolInput!
}
"""
Error interface for all errors that can be returned by the API.
Always include the `ErrorInterface` in your request so any error returned by the API will be returned.
"""
interface ErrorInterface {
"""A short description of the error."""
message: String!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""
best value rent configuration does not meet the product's age, term, premium, or guarantee requirements.
"""
PRODUCT_CONFIGURATION_BEST_VALUE_RENT
"""
Duo, Junior or Wealth CH configuration violates its age, premium, term, cover or guarantee rules.
"""
PRODUCT_CONFIGURATION_SWISS_SAVINGS
"""
A detailed Swiss health declaration is incomplete or its answer and details are inconsistent.
"""
HEALTH_STATE_SWISS_SAVINGS
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""
Two different associated persons were given the same email address.
The core insurance system identifies a person by their email address, so it would merge
the two into a single person and apply the wrong personal data (date of birth, gender,
name) to one of the policy roles. Give each person their own address. For a person
submitted through `newCustomer` the field can also be left out, unless they are the
policyholder; for a person submitted through `existingCustomer` the address is part of
their stored record and has to be corrected there first.
Submitting one person under several `associatedPersons` entries to split their roles is
not affected — their roles are merged as intended.
"""
ASSOCIATED_PERSONS_DUPLICATE_EMAIL
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""reducedPremium must be between 24% and 100% of monthlyPremium"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_OUT_OF_RANGE
"""premiumDurationInYears is longer than durationInYears of a quick offer"""
QUICK_OFFER_PREMIUM_TERM_EXCEEDS_POLICY_TERM
"""Quick-offer settings are outside the supported calculation subset."""
QUICK_OFFER_CONFIGURATION
"""
reducedPremium is only supported with brokerageFeePayoutMethod: NET (net tariff, 049-0-PPD 2025)
"""
PRODUCT_CONFIGURATION_REDUCED_PREMIUM_NET_TARIFF_ONLY
"""
Value Invest VWL only: the regular premium per year (`monthlyPremium` times the number of payments per year) is outside EUR 168 to EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_REGULAR_PREMIUM_OUT_OF_RANGE
"""Value Invest VWL only: `additionalPayment` is below EUR 50 and not 0"""
PRODUCT_CONFIGURATION_VWL_ADDITIONAL_PAYMENT_BELOW_MINIMUM
"""
Value Invest VWL only: the regular premium per year plus `additionalPayment` exceeds EUR 3,000
"""
PRODUCT_CONFIGURATION_VWL_TOTAL_PREMIUM_EXCEEDS_LIMIT
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""
paymentMethod.wireTransfer was sent as false on a product that does not support it. Only
Value Invest VWL can have the payer notified to set the standing order up; every other
product requires the payer to arrange it themselves (true).
"""
FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
ageWhenPolicyEnds must be greater than the customer's age at the policy start date
"""
PRODUCT_CONFIGURATION_AGE_WHEN_POLICY_ENDS
"""disabilityAnnuity requires premiumWaiver to also be set"""
PRODUCT_CONFIGURATION_DISABILITY_ANNUITY_REQUIRES_PREMIUM_WAIVER
"""
Invalid jobClass and jobRisk combination for disability annuity. See https://partner-docs.life.li/platform-integrations/job-classes for valid values.
"""
PRODUCT_CONFIGURATION_INVALID_JOB_CLASS
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, `insuredPersonsHealthStatusV2` was provided without any of its three variants populated, or a Liechtenstein Life Wealth offer has an additional insured person but no `additionalInsuredPersonsHealthStatus`.
"""
HEALTH_STATE_MISSING
"""
`insuredPersonsHealthStatusV2` was provided with more than one variant populated (`detailed`, `simplifiedDeathBenefit`, `simplifiedPremiumWaiver`). Exactly one must be set.
"""
HEALTH_STATE_MULTIPLE_VARIANTS_SET
"""
Both the legacy `insuredPersonsHealthStatus` and the new `insuredPersonsHealthStatusV2` were provided on the same offer input — they are mutually exclusive. Submit exactly one.
"""
HEALTH_STATE_BOTH_VERSIONS_SET
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `healthProblemsDetails` must be provided when `isHealthy` is `false`.
"""
HEALTH_STATE_PROBLEMS_DETAILS_MISSING
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
On the Liechtenstein Life Wealth, Best Value Rent and Value Invest VWL health questionnaires, `smoking.smokingDetails` must be provided when `smoking.hasSmoked` is `true`.
"""
HEALTH_STATE_SMOKED_DETAILS_MISSING
"""
Best Value Rent requires `medicalPractitionerInformation` when a smoking declaration is supplied. Value Invest VWL requires it outside production.
"""
HEALTH_STATE_MEDICAL_PRACTITIONER_MISSING
"""
Value Invest VWL requires the `smoking` declaration outside production.
"""
HEALTH_STATE_SMOKING_MISSING
"""
A follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, `seriousHandicapDetails` with `hasSeriousHandicap = false`, or `smoking.smokingDetails` with `smoking.hasSmoked = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
The selected `insuredPersonsHealthStatusV2` variant is incompatible with the offer's product configuration. Use `simplifiedPremiumWaiver` (or `detailed`) when `premiumWaiver` or `disabilityAnnuity` is set; use `simplifiedDeathBenefit` (or `detailed`) otherwise.
"""
HEALTH_STATE_VARIANT_INCOMPATIBLE_WITH_PRODUCT
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
"""
Pagination arguments contradict each other. Page forwards with `after` and `first`, or
backwards with `before` and `last` — never mix the two directions.
"""
PAGINATION_CONFLICTING_ARGUMENTS
"""
The pagination cursor does not match any record you can read. Cursors can expire when
the record behind them is removed; restart the walk without a cursor.
"""
PAGINATION_CURSOR_NOT_FOUND
"""
`consultation.protocol.agentAdvice` is `false`, so the customer waived advice and
`writtenAdvice` documents that waiver — send it as `true`.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MISSING
"""
`consultation.protocol.writtenAdvice` was sent while `agentAdvice` is `true`. A waiver
of advice cannot accompany advice that was given; omit it.
"""
CONSULTATION_PROTOCOL_WRITTEN_ADVICE_MUST_BE_OMITTED
}
type AvailableFundEdge {
"""
Pass this value as `after` or `before` to page from this fund. Opaque: do not build it
yourself, and do not store it beyond the walk — a fund the insurance system withdraws
takes its cursor with it, and the next page then returns an `InputValidationError` with
`PAGINATION_CURSOR_NOT_FOUND` rather than silently ending your walk.
"""
cursor: String!
node: AvailableFund!
}
"""Where the current page sits in the full list."""
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
"""
Information about the customer associated with an offer.
A customer can be:
- a new individual created inline via `newCustomer`,
- a new corporate entity created inline via `newCompanyCustomer` (used today only for the VWL employer in the PAYER role),
- an existing customer (individual or corporate) already linked to your broker account, referenced via `existingCustomer`.
Existing customers can be referenced by our internal Customer ID (retrievable via the customers query) or by the customer's registered email address.
"""
input CreateOfferCustomerByInput @oneOf {
"""
Information about a new individual customer for whom the offer will be created.
This also automatically creates the customer in the insurance system.
"""
newCustomer: NewCustomerInput
"""
Information about a new corporate-entity customer (a company) to be created
inline as part of the offer.
Currently only valid for the Value Invest VWL PAYER role (the employer).
Providing this value for any other role yields a validation error.
"""
newCompanyCustomer: CompanyTypeCustomerInput
"""
Use an existing customer to create an offer. The existing customer must be linked with your broker account in the Core Insurance System to be used here.
The ID for existing customers can be retrieved by querying for customers or by using the email address of the customer that is connected to this customer's policy in the insurance system.
"""
existingCustomer: ExistingCustomerInput
}
"""
Roles for Swiss savings offers. For Duo/Junior, INSURED_PERSON identifies the relative, not the insured provider.
"""
enum SwissSavingsPolicyPersonRole {
"""The beneficial owner."""
ECONOMIC_INTEREST
"""The relative for Duo/Junior, or the policyholder for Wealth CH."""
INSURED_PERSON
"""The policy correspondence recipient."""
MAILING
"""The premium payer."""
PAYER
"""The contract owner and, for Duo/Junior, the insured provider."""
POLICY_HOLDER
}
"""
Source of funds used for insurance premium payments.
This information is required for anti-money laundering (AML) compliance.
**Regulatory Context**:
- Required by EU Anti-Money Laundering Directive (AMLD)
- Part of Know Your Customer (KYC) requirements
- Used for risk assessment and monitoring
**Note**: If none of the standard options apply, use OTHER and provide details
in the corresponding text field.
"""
enum MoneyOrigin {
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
}
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""The policy as a private pension for the user."""
PRIVATE_PENSION
"""The policy to accumulate capital."""
CAPITAL_ACCUMULATION
"""The policy to transfer assets with tax benefits."""
TRANSFERRING_ASSETS_WITH_TAX_BENEFITS
"""The policy as risk coverage."""
RISK_COVERAGE
"""Other reason for obtaining the policy."""
OTHER
}
"""
Additional health risk information for dangerous activities, sports, or occupational hazards.
"""
input ProsperityPlusAdditionalHealthRiskInformation {
"""
Further information about the additional risks.
Required when hasAdditionalRisks is true.
"""
additionalRiskDetails: String
"""
Whether the insured person engages in activities with additional risk (e.g. dangerous sports, hazardous hobbies, or occupational hazards).
"""
hasAdditionalRisks: Boolean!
}
"""Drug or alcohol abuse history and treatment details."""
input ProsperityPlusDrugAbuseInformation {
"""
Whether the insured person has ever been treated for or consulted about drug or alcohol abuse.
"""
hasBeenTreatedForDrugAbuse: Boolean!
"""
Details about the substances consumed and quantity.
Required when hasBeenTreatedForDrugAbuse is true.
"""
substanceDetails: String
"""
Details about the treatment or consultation, including the reason and period.
Required when hasBeenTreatedForDrugAbuse is true.
"""
treatmentDetails: String
}
"""Existing insurance contract information."""
input ProsperityPlusExistingInsuranceContractInformation {
"""
Does the insured person already have life insurance, professional insurance, or disability insurance with another provider, or are you simultaneously submitting such applications?
"""
hasExistingInsuranceContract: Boolean!
"""
Name of the insurance provider, type and amount of the insurance, and date of application submission.
Required when hasExistingInsuranceContract is true.
"""
insuranceDetails: String
}
"""Hospitalization, operations, and medical treatment history."""
input ProsperityPlusHospitalizationInformation {
"""
Whether the insured person has been hospitalized, had operations, or received medical treatments in the last 10 years.
"""
hasBeenHospitalized: Boolean!
"""
Details about the hospitalization, including the time period and reason.
Required when hasBeenHospitalized is true.
"""
hospitalizationDetails: String
}
"""Known disease history in the last 10 years."""
input ProsperityPlusKnownDiseaseInformation {
"""
Further information about the diseases or complaints.
Required when hasHadKnownDiseases is true.
"""
diseaseDetails: String
"""
Whether the insured person has suffered from illnesses or complaints in the last 10 years, including conditions relating to the heart and cardiovascular system (e.g. high blood pressure, heart attack, stroke), brain (e.g. migraines), blood (e.g. clotting disorder), respiratory organs (e.g. asthma), hearing, eyes, thyroid, pancreas, liver (e.g. hepatitis), kidneys, urinary and genital organs, nervous system or mind (e.g. depression, multiple sclerosis), musculoskeletal system (spine, joints), skin (e.g. neurodermatitis), tumours (e.g. cancer), diabetes, allergies, rheumatic illnesses, or infectious diseases.
"""
hasHadKnownDiseases: Boolean!
}
"""Regular medication history."""
input ProsperityPlusMedicationInformation {
"""
Whether the insured person is currently taking, or has frequently taken, medicine, sleeping pills, or sedatives in the last 10 years.
"""
hasBeenRegularlyMedicated: Boolean!
"""
Details about the medication, including which medicine, in what quantity, and over which period.
Required when hasBeenRegularlyMedicated is true.
"""
medicationDetails: String
}
"""Smoking history and details."""
input ProsperityPlusSmokingInformation {
"""
Whether the insured person has smoked cigarettes, cigars, or similar substances in the last 12 months.
"""
hasSmoked: Boolean!
"""
What was smoked and in what quantity per day.
Required when hasSmoked is true.
"""
smokingDetails: String
}
"""
Choose exactly one Wealth CH cover variant. Beneficiaries remain the holder in life and statutory heirs in death.
"""
input WealthCHCoverageInput @oneOf {
"""Select the fiscal minimum cover."""
minimalTax: OnlyTrueValue
"""
Chosen cover in CHF minor units, positive and at most 200% of premium sum. Lifeware validates the dynamic minimum.
"""
chosenAmount: MonetaryFractionalAmount
}
"""
Choose exactly one Wealth CH premium variant. All amounts use CHF minor units.
"""
input WealthCHPremiumInput @oneOf {
"""
A single premium of at least 2000000 (CHF 20,000). Holder entry age: 18–65.
"""
singlePremium: MonetaryFractionalAmount
"""
Regular premiums with optional initial top-up. Holder entry age: 18–75.
"""
regularPremium: WealthCHRegularPremiumInput
}
"""Premium guarantee levels supported by Duo, Junior and Wealth CH."""
enum SwissSavingsGuarantee {
"""No premium guarantee."""
NO_GUARANTEE
"""Select50."""
SELECT50
"""Select80."""
SELECT80
"""Select100."""
SELECT100
}
"""
Customer fund selection, risk appetite and sustainability choices for Swiss savings offers.
"""
input SwissSavingsInvestmentStrategyInput {
"""
The funds that the customer/broker selected to invest in.
The sum of all the fund percentages must amount to 100 and there can be no more than 10 funds.
This API validates the sum of all percentages (100), uniqueness of fund ids, and the total number of funds (max 10).
"""
fundSelection: [FundSelectionInput!]!
"""The reasons why the customer is making this investment choice."""
goals: InvestmentGoalsInput!
"""
Whether this is a low-risk investment profile.
The insurance system uses this to validate the selected funds against the customer's risk appetite.
"""
lowRiskInvestment: Boolean!
"""
The customer's preferred way of re-balancing the investment.
The default value is `NORMAL`, i.e. the insurance company re-balances the portfolio once a year.
"""
rebalancingType: RebalancingType
"""
Maximum risk level the customer is willing to take with their investment.
The risk level must correspond to the selected funds — the insurance system validates this before issuing the policy.
"""
riskLevel: RiskLevel!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: ProsperityPlusSustainabilityDetailsInput!
}
"""Document language for Swiss savings offers."""
enum SwissSavingsContractLanguage {
"""Swiss German."""
DE_CH
"""Standard German."""
DE_DE
"""French."""
FR_FR
"""Italian."""
IT_IT
}
"""
Confirmations recorded in the _Erklärungen und Einwilligungen_ section for Swiss products.
Each field is one declaration printed on the application form, and sending it asserts the
customer gave you that confirmation — so submit a protocol only once you hold all of them.
Every field is `OnlyTrueValue` and mandatory: the insurance system will not accept an
application on which one is declined, so there is no way to express a partial protocol. If
any confirmation is missing, omit `consultation` entirely and the customer completes the
whole section on paper.
"""
input SwissConsultationProtocolInput {
"""
The policyholder was informed of their right of revocation (_Widerrufsrecht_).
"""
withdrawal: OnlyTrueValue!
"""
The policyholder was informed of the right of termination arising from a breach of the
duty to provide information (_Kündigungsrecht wegen Verletzung der Informationspflicht_).
"""
terminationRight: OnlyTrueValue!
"""
The policyholder was informed of the pre-contractual duty to notify
(_Vorvertragliche Anzeigepflicht_).
"""
preliminaryContract: OnlyTrueValue!
"""
The policyholder received all information the intermediary owes them under Article 45 of
the Swiss Insurance Supervision Act (_alle Informationen gemäss Artikel 45 VAG_).
"""
vagInfo: OnlyTrueValue!
"""
The policyholder received a duplicate or a copy of their insurance application.
"""
applicationCopy: OnlyTrueValue!
"""
The policyholder received the general terms and conditions of insurance (GTCI/AVB).
"""
receivedGeneralConditions: OnlyTrueValue!
"""The policyholder received the customer information."""
receivedCustomerInformation: OnlyTrueValue!
"""
The policyholder received the information on the fund selection (fund brochure and
PRIIP-KID).
"""
receivedInvestmentInformation: OnlyTrueValue!
"""The policyholder received the sample quotation (_Musterofferte_)."""
receivedOffer: OnlyTrueValue!
"""
The policyholder received the key information document for this insurance product
(_Das Basisinformationsblatt (BIB)_). This is the product's own BIB, distinct from the
per-fund PRIIP-KIDs covered by `receivedInvestmentInformation`.
"""
receivedBib: OnlyTrueValue!
"""
The policyholder agrees that the insurance cover begins before the right of revocation
expires.
"""
insuranceStartAgreement: OnlyTrueValue!
"""
The policyholder confirms they will comply with all tax obligations incumbent upon them
in their country of residence.
"""
taxObligations: OnlyTrueValue!
"""
All signatories confirm that the conclusion of, and the advice on, the insurance
contract took place exclusively in Switzerland.
"""
adviceConclusion: OnlyTrueValue!
"""
All signatories irrevocably release Liechtenstein Life Assurance AG from Liechtenstein
trade secrecy and any privacy policy, and consent to reports to domestic and foreign
(tax) authorities.
"""
privacyAcceptance: OnlyTrueValue!
"""
All signatories agree to delivery by email or electronic transmission, unless they
expressly chose "Paper Mail".
"""
communicationAgreement: OnlyTrueValue!
"""
The policyholder confirms they were given sufficient opportunity to study all insurance
documents, and have read and understood them.
"""
timeToStudyAllDocuments: OnlyTrueValue!
"""
All signatories confirm that the information provided is correct and accept the terms
and conditions of the contract.
"""
termAndConditionsAgreement: OnlyTrueValue!
"""
The policyholder and the premium payer confirm they have fulfilled all tax obligations
with regard to the premiums paid.
"""
policyholderPayerPremiumTaxObligations: OnlyTrueValue!
"""
The insured person — and, for minors and wards, their legal representative — consents to
the contract being concluded on their life and confirms the health questions were
answered truthfully and in full.
"""
healthsAgreement: OnlyTrueValue!
"""
The signatories declare they had the opportunity to read the data protection information
sheet and the section on data processing in the client information.
"""
dataProcessing: OnlyTrueValue!
}
"""A fund the product offers."""
type AvailableFund {
"""The value to pass as `FundSelectionInput.id` when creating an offer."""
isin: String!
"""The fund's name as the insurance system reports it."""
name: String
"""
The insurance system's own risk classification, from 1 (lowest) to 7 (highest). `null`
means the fund carries no risk profile. This is the fund's risk, not the customer's
appetite: we deliberately publish no rule mapping one to the other, because the ceiling
the insurer enforces at issuance is not ours to state. Selecting funds above a customer's
profile is validated by the insurance system before issuance, not by this API.
"""
riskLevel: Int
"""Whether the insurance system classes the fund as sustainable."""
isSustainable: Boolean!
"""Whether this is a guarantee fund."""
isGuaranteeFund: Boolean!
}
"""
Input to create a new customer in the insurance system and associate them with the offer that is being created.
"""
input NewCustomerInput {
"""
Email address of the customer.
**This field is optional unless the customer is a policyholder. Policyholders need access to this email to later activate the policy in the Prosperity App.**
"""
email: Email
"""First name of the customer (including any middle names)."""
firstName: String!
"""Last name of the customer."""
lastName: String!
"""
Date of birth of the customer, used to calculate entry age and populate the policy application.
The date cannot be in the future. Age limits depend on the product and the customer's policy role.
Prosperity Junior permits an insured child aged 0–15; the policyholder must satisfy the adult entry limits.
"""
dateOfBirth: Date!
"""The current gender of the customer."""
gender: Gender!
"""The current marital status of the customer."""
maritalStatus: MaritalStatus!
"""
The nationality of the customer.
The ISO 3166 country code for the current country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
nationality: Country!
"""Home address of the customer."""
address: AddressInput!
"""
Verified mobile phone number of the customer, in E.164 format (e.g. `+4917604069000`).
"""
phoneNumber: PhoneNumber @deprecated(reason: "Use `mobilePhone` instead. Mobile phone numbers are not used in the insurance system.")
"""
Verified mobile phone number of the customer, in E.164 format (e.g. `+4917604069000`).
"""
mobilePhone: PhoneNumber
"""
Landline phone number of the customer, in E.164 format (e.g. `+493023125000`).
"""
landline: PhoneNumber
"""
City or town where the customer was born, printed as "Geburtsort" on the application form (e.g. `Berlin`).
Send the place only: the country goes in `birthCountry`.
Not the same as `identification.birthPlace`, which records the place exactly as written on the identification document and is not printed on the application form.
"""
birthPlace: NonEmptyString
"""
Country where the customer was born, printed as "Geburtsland" on the application form.
The ISO 3166 country code for the country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
birthCountry: Country
"""What the customer studied and is qualified for."""
profession: String!
"""
What the customer presently does for a living.
Defaults to profession if not set.
"""
occupation: String
"""
Taxation information for the customer.
**This field is optional unless the customer is a policyholder**
"""
taxIdentification: TaxIdentificationInput
"""Information about the customer's identification document."""
identification: IdentificationInput
}
"""
Input to create a new corporate-entity customer (a company) inline as part of an offer.
Used today by Value Invest VWL where the offer's PAYER must be the employee's
employer — a corporate entity. The employee remains an individual and is provided
via `newCustomer` or `existingCustomer`.
"""
input CompanyTypeCustomerInput {
"""Official registered name of the corporate entity."""
name: String!
"""
Additional corporate name or trade name, if applicable (e.g. doing-business-as).
"""
additionalName: String
"""Name of the primary contact person at the corporate entity."""
contactName: String
"""
Legal form of the corporate entity (for example `AG`, `GmbH`, `OHG`, `KG`).
Passed through to the insurance system without translation.
"""
legalForm: String!
"""
Whether the corporate entity is a financial institution.
Required for KYC categorisation in the insurance system.
"""
financialInstitution: Boolean!
"""
Email address used to reach the corporate entity (typically the primary contact).
"""
email: Email
"""
Mobile phone number of the corporate entity's primary contact, in E.164 format
(e.g. `+4917604069000`).
"""
mobilePhone: PhoneNumber
"""
Landline phone number of the corporate entity, in E.164 format (e.g. `+493023125000`).
"""
landline: PhoneNumber
"""
Preferred communication language for the corporate entity. Defaults to `de_DE` if not provided.
"""
language: CustomerLanguage
"""Registered address of the corporate entity."""
address: AddressInput!
"""
Tax information of the corporate entity (VAT number, tax residency country, US tax status).
"""
taxInformation: CorporateEntityTaxIdentificationInput!
}
"""
Input for selecting an existing customer in the core insurance system for whom the offer needs to be created.
This input is essential for ensuring the offer is linked to the correct person.
"""
input ExistingCustomerInput @oneOf {
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
byID: ExistingCustomerByIDInput
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
byEmail: ExistingCustomerByEmailInput
}
"""
Wealth CH regular premiums. Minimum policy/payment terms are ten/five years before guarantee rules.
"""
input WealthCHRegularPremiumInput {
"""
Premium per payment in CHF minor units. Annualized premium must be at least CHF 2,000.
"""
regularPremium: MonetaryFractionalAmount!
"""Omit for MONTHLY."""
premiumMode: SwissSavingsPremiumMode
"""
Initial top-up in CHF minor units. Use 0 or at least 100000 (CHF 1,000).
"""
additionalPayment: MonetaryFractionalAmount!
"""
Holder's payment end age. Omit to pay until policy end. Guaranteed variants require at least twenty payment years.
"""
ageUntilPremiumIsPaid: Int @constraint(min: 18, max: 85)
}
"""
Input to provide details about a certain fund choice in which the customer would like to invest.
"""
input FundSelectionInput {
"""
The ID of the fund in the insurance provider's system. In most of the cases it is an ISIN, but in some cases it's a custom code.
Example of a custom code is when you have a custom strategy/fund basket.
An ISIN stands for international securities identification number and is a 12 digit code that assists in identifying securities such as stocks, equities, notes, bonds, debt, funds and more.
The same field is also used as an internal identifier by the underlying insurance system.
"""
id: String!
"""
Percentage of the total premium amount that should be invested in this fund.
Total sum of all the selected funds must be 100 with values must be between 1 and 100, e.g. 45 in `fund-A`, 25 in `fund-B`, and 30 in `fund-C`.
"""
percentage: Percentage!
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
Is the intention to provide for old age or to build up capital with insurance cover.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
longTerm: Boolean!
"""
Is the intention to obtain tax advantages.
Note: For Prosperity Plus (3B) products, this must be set to false.
"""
taxBenefit: Boolean!
"""
Is the intention the ability to influence the chosen investment of the insurance product and adjust it during the term.
Note: For Prosperity Plus (3B) products, at least one of longTerm or flexibility must be true.
"""
flexibility: Boolean!
}
"""
Types of re-balancing of the funds that the customer can choose from for their investment.
Re-balancing is the process of adjusting the proportions of the funds in the portfolio to the original fund allocation.
Over time, asset allocations can change as market performance alters the values of the assets. Rebalancing involves periodically buying or selling the assets in a portfolio to regain and maintain that original, desired level of asset allocation.
Take a portfolio with an original target asset allocation of 50% FUND1 and 50% FUND2. If the stocks' prices rose during a certain period of time, their higher value could increase their allocation proportion within the portfolio to, say, 70%.
The investor may then decide to sell some FUND1 and buy FUND2 to realign the percentages back to the original target allocation of 50%-50%.
"""
enum RebalancingType {
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
Re-balancing upon every investment-event (premium payment, one-time payments) based on the current portfolio allocation,
so that the portfolio is always in line with the original fund allocation after investing.
"""
DYNAMIC
"""
Re-balancing is done every year based on the current state of the portfolio allocation.
"""
NORMAL
}
"""
The risk the customer is willing to take with the investment.
The risk level also informs the fund selection process and validates if the right funds are selected for the customer.
The API does not validate the fund selection based on the risk, but the insurance company does validate this before issuing the policy.
"""
enum RiskLevel {
"""
Low risk is not recommended for the current product that we offer as it's unlikely to provide a good return on such a long-term policy.
Hence.
"""
LOW
"""Medium level investment risk."""
MEDIUM
"""High level investment risk."""
HIGH
}
"""
Input about the customer's knowledge of sustainable investing and sustainable investment choices for Prosperity Plus 3B.
Read more about the regulations: https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:32019R2088&rid=1
"""
input ProsperityPlusSustainabilityDetailsInput {
"""The current state of user's knowledge of sustainable investing."""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
if no value is provided, `EnvironmentalAndSocialInvestmentFocusLevel.NORMAL` is considered as the default value.
"""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
The percentage of the overall investment that should be in sustainable funds.
If `0` it indicates that the customer does not want a sustainable product.
"""
percentage: Int!
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid investing their funds in.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
}
"""
The gender of the customer.
**Important Limitation**: Currently, the core insurance system only supports binary gender options
(MALE/FEMALE). We are actively working with insurance providers to support more inclusive gender options in the future.
"""
enum Gender {
"""Male gender marker."""
MALE
"""Female gender marker."""
FEMALE
}
"""Types of marital states."""
enum MaritalStatus {
"""Single, never married."""
SINGLE
"""Officially registered, partnered."""
REGISTERED
"""Married, legally recognized."""
MARRIED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Divorced, legally recognized."""
DIVORCED
"""Partner has passed away."""
WIDOWED
}
"""Information about a physical address."""
input AddressInput {
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""House number information."""
houseNumber: String!
"""ZIP or postal code."""
zip: String!
"""City in which the address is located."""
city: String!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""
Input to provide information about taxation status in various country for the customer.
"""
input TaxIdentificationInput {
"""
Indicates whether the customer is liable to pay tax in the USA.
We are required to *explicitly* ask about the customer's tax status in the USA.
If it is clear at the time of application that the customer will return to the USA, the insurance company recommends to not continue with the application. If the customer moves out of the EEA, the insurance company will cancel their contract as per current business policy.
If the customer indicates that they are liable to pay tax in the USA, they will need to provide US-ITIN (Individual Taxpayer Identification Number) or US-SSN (Social Security Number) for USA within their `residencies` list, otherwise the `USATaxResidencyRequiredError` will be returned.
"""
taxLiableInUSA: Boolean!
"""
The countries the customer has residencies in along with the Tax identification number (TIN) for each country.
The API accepts both: no residencies or any number of residencies provided that Germany is included in the list.
"""
residencies: [TaxResidencyInput!]!
}
"""Information about the customer's identification document."""
input IdentificationInput {
"""Type of identification document."""
documentType: IdentificationDocumentType!
"""Date when the document was issued."""
issueDate: Date!
"""Date until which the document is valid."""
validUntil: Date!
"""
Place where the customer was born (e.g. Berlin, Germany) exactly what is mentioned in the document.
"""
birthPlace: NonEmptyString
"""Document number or identifier."""
documentNumber: NonEmptyString!
"""Authority that issued the document."""
issuedBy: NonEmptyString!
}
enum CustomerLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
"""French"""
FR_FR
"""English"""
EN_US
"""Italian"""
IT_IT
}
"""Input to provide tax information of the Corporate customer"""
input CorporateEntityTaxIdentificationInput {
"""The VAT ID of the employing company"""
vatNumber: String
"""The VAT ID country of the employing company"""
taxIDCountry: Country
"""Indicates if the employing company has a US tax status"""
taxLiableInUSA: Boolean!
}
"""
You can create a new offer for an existing customer by entering the customer ID in our system.
The customer might not be accessible to you if they have a policy/offer with Lichtenstein Life but not connected to your broker account.
The customer ID can be retrieved by querying for customers.
"""
input ExistingCustomerByIDInput {
"""ID of the existing customer in the our system."""
ID: ID!
}
"""
You can create a new offer for an existing customer by entering the email address that they used for their previous policies.
This input is essential for identifying the customer in the system and ensuring the offer is linked to the correct account.
The customer might not be accessible to you if they have a policy with Lichtenstein Life but not connected to your broker account.
"""
input ExistingCustomerByEmailInput {
"""
Email address to identify the customer.
This email address must be linked to the customer's existing policy in the insurance system.
"""
email: Email!
}
"""Number of regular premium payments per year."""
enum SwissSavingsPremiumMode {
"""One payment per year."""
ANNUALLY
"""Twelve payments per year."""
MONTHLY
"""Four payments per year."""
QUARTERLY
"""Two payments per year."""
SEMI_ANNUALLY
}
"""
Type to represent the state of customer's knowledge about sustainability, sustainable investing, and sustainable funds (ESG).
Brokers are legally required to ask customers about their knowledge of sustainable investing and funds.
If the customer does not have sufficient knowledge, the broker must consult with them until they are educated.
These are the only 2 cases we accept, if your use-case does not fit these cases do not pass sustainability and talk to the customer and the insurance provider.
More information about the legal requirements and what the customers need to be informed about can be found here: https://www.eiopa.europa.eu/sites/default/files/publications/reports/guidance_on_integration_of_customers_sustainability_preferences_under_idd.pdf
"""
enum CustomerSustainabilityKnowledgeStatus {
"""
The customer has sufficient knowledge about sustainable investing and funds as per the ESG guidelines and has waived the need for further consultation when the option is provided.
The broker needs to ensure the customer has the knowledge and if not it's mandatory to consult and educate them.
"""
WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE
"""
The customer did not have pre-existing knowledge of sustainable investing or ESG.
The broker has consulted with the customer and has informed them about sustainable investing and ESG funds.
This can only be selected only if the partner has their own broker license as only a licensed broker can educate the customers.
"""
NO_PRE_EXISTING_KNOWLEDGE_BUT_EDUCATED_BY_BROKER
}
"""
Indicates how strongly the customer wants to pursue sustainable environmental goals and social objectives as part of their fund selection.
Environmental considerations are specifically about adaptation to and mitigation of climate change, but also about general environmental issues and associated risks (e.g. natural disasters).
Social considerations can relate to issues related to inequality, participation, employment, and investments in people and communities.
Environmental and social considerations are often intertwined, as existing inequalities may be exacerbated, particularly by climate change.
"""
enum EnvironmentalAndSocialInvestmentFocusLevel {
"""
The customer wants to invest average percentage of their ESG fund allocation to pursue sustainable environmental goals and social objectives.
This is the default option if the customer does not specify any preference.
"""
NORMAL
"""
The customer wants to invest majority of their ESG funds into sustainable environmental goals and social objectives.
"""
SIGNIFICANT
"""
The investment strategy should invest significantly in funds that pursue sustainable environmental goals and social objectives.
In addition to that, any other funds that are selected should also consider not having adverse effects on the environment and society (outside the ESG allocated percentage of the investment)
"""
SIGNIFICANT_AND_CONSIDERING_ADVERSE_EFFECTS_IN_OVERALL_INVESTMENT
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as having an adverse impact for sustainability.
The funds associated with these topics could have adverse impact on Environmental, Social and Governance sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityAdverseInvestmentTopic {
FOSSIL_ENERGY
NUCLEAR_ENERGY
GAMBLING
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
NUCLEAR_WEAPONS
EROTIC_INDUSTRY
TOBACCO_INDUSTRY
}
"""
Represents a set of topics defined by the law markers as topics funds can be associated with and are considered as favorable investments for sustainability.
These enums and their wordings are designed by the compliance team and government laws and regulations. If there are questions, please contact our business team.
"""
enum SustainabilityFavorableInvestmentTopic {
CLIMATE_PROTECTION
ADAPTATION_TO_CLIMATE_CHANGE
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
POLLUTION_PREVENTION_AND_CONTROL
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
COMBATING_INEQUALITIES
PROMOTING_LABOR_RELATIONS
INVESTING_IN_HUMAN_CAPITAL
}
"""
Information about the tax information for a given country the customer has residency in.
The customer may have one or more residency countries. We currently only validate Tax ID for Germany.
"""
input TaxResidencyInput {
"""
The Tax identification number (TIN) of the customer in the given country that is issued by the taxation authority.
If the country is Germany, the tax ID will be validated and if invalid then the response will be of type `TaxResidencyInputInvalidError`.
In this case we recommend re-trying the request without tax residency.
**Note:** For testing purposes you can generate valid testing tax IDs using e.g. https://generator.avris.it/.
"""
id: String!
"""
The ISO 3166 country code for the current country (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
"""Type of identification document provided by the customer."""
enum IdentificationDocumentType {
"""Passport"""
PASSPORT
"""Driving license"""
DRIVERS_LICENSE
"""National Identity card"""
ID_CARD
"""Residence permit"""
RESIDENCE_PERMIT
"""Commerce register certificate"""
COMMERCE_REGISTER_CERTIFICATE
}
```
## Important
- All monetary amounts are in Rappen (1 CHF = 100 Rappen). Example: 15000 = CHF 150.00, 1000000 = CHF 10,000.00
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
Source: https://partner.life.li/integration-docs/platform-integrations/creating-offers#example-liechtenstein-life-wealth-ch
Use the deployed API schema for shared scalar definitions and the current broker's product fund catalogue.Example: Liechtenstein Life Wealth CH (Swiss Pillar 3b)
Use liechtensteinLifeWealthCH with one individual carrying all five roles: POLICY_HOLDER, INSURED_PERSON, PAYER, MAILING and ECONOMIC_INTEREST. The holder supplies the financial and detailed health declarations. Choose exactly one premium variant and one death-cover variant.
These examples reference a synthetic holder born in 1985. Replace the customer reference, date and fund selection before sending a request. Collect every declaration from the customer; the example answers are not defaults.
Single premium
This example invests CHF 50,000 and selects fiscal minimum death cover.
{
"input": {
"liechtensteinLifeWealthCH": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST",
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"premium": {
"singlePremium": 5000000
},
"coverage": {
"minimalTax": true
},
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "IE00B8J37J31",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
Regular premiums
This example pays CHF 200 each month and CHF 1,000 initially. regularPremium is the amount per payment, not an annual amount.
{
"input": {
"liechtensteinLifeWealthCH": {
"associatedPersons": [
{
"role": [
"POLICY_HOLDER",
"PAYER",
"MAILING",
"ECONOMIC_INTEREST",
"INSURED_PERSON"
],
"person": {
"existingCustomer": {
"byEmail": {
"email": "swiss-holder@example.com"
}
}
}
}
],
"customerFinancialStatus": {
"hasSwissIncome": true,
"moneyOrigin": "EARNED_INCOME",
"policyReason": "PRIVATE_PENSION",
"totalMonthlyExpenses": 300000,
"totalMonthlyNetIncome": 600000,
"differentWealthOrigin": false
},
"policyHolderHealthStatus": {
"worksAsSelfEmployed": false,
"employmentWorkload": 100,
"height": 180,
"weight": 75,
"existingInsuranceContract": {
"hasExistingInsuranceContract": false
},
"hasAggravatedTermsContract": false,
"additionalHealthRisk": {
"hasAdditionalRisks": false
},
"knownDiseases": {
"hasHadKnownDiseases": false
},
"hasExistingDisabilities": false,
"medication": {
"hasBeenRegularlyMedicated": false
},
"hospitalization": {
"hasBeenHospitalized": false
},
"hasAnnuity": false,
"drugAbuse": {
"hasBeenTreatedForDrugAbuse": false
},
"smoking": {
"hasSmoked": false
},
"hasHIV": false,
"medicalPractitionerInformation": "Synthetic practitioner, Teststrasse 2, 8001 Zürich"
},
"productConfiguration": {
"startDate": "2026-11-01",
"ageWhenPolicyEnds": 66,
"premium": {
"regularPremium": {
"regularPremium": 20000,
"premiumMode": "MONTHLY",
"additionalPayment": 100000
}
},
"coverage": {
"minimalTax": true
},
"guarantee": "SELECT50",
"maturityManagement": true,
"language": "DE_CH",
"investmentStrategy": {
"riskLevel": "HIGH",
"fundSelection": [
{
"id": "IE00B8J37J31",
"percentage": 100
}
],
"goals": {
"longTerm": true,
"taxBenefit": false,
"flexibility": true
},
"lowRiskInvestment": false,
"rebalancingType": "NONE",
"sustainabilityDetails": {
"customerKnowledgeStatus": "WAIVED_CONSULTATION_DUE_TO_PRE_EXISTING_KNOWLEDGE",
"percentage": 0,
"topicsToInclude": [],
"topicsToExclude": []
}
}
}
}
}
}
- Single premium: at least CHF 20,000; holder entry age 18–65; policy end age 60–100; minimum policy term ten years, including guarantees.
- Regular premiums: holder entry age 18–75; policy end age 60–85; minimum policy/payment terms ten/five years; at least CHF 2,000 annually and CHF 10,000 in agreed regular premiums. Initial top-up is 0 or at least CHF 1,000.
- Regular-premium Select50/80 require twenty policy years; Select100 requires thirty. Every regular-premium guarantee requires at least twenty payment years. Any guarantee requires
maturityManagement: true. premiumaccepts exactly one ofsinglePremiumorregularPremium. All amounts use CHF minor units.coverageacceptsminimalTax: trueor a positivechosenAmount. Chosen cover cannot exceed 200% of the applicable premium sum; Lifeware also validates its calculated minimum.- Retrieve funds with
availableFunds(product: LIECHTENSTEIN_LIFE_WEALTH_CH). No premium-waiver input is exposed. - Follow the shared Swiss requirements, including the environment-specific health questions and consultation protocol.
Swiss savings requirements
The Duo, Junior and Wealth CH branches require an explicit product grant for the acting partner. Existing access to another Swiss product does not grant access automatically. These branches support the listed tariffs only; companies, cross-border tariffs and other tariff years are not exposed.
Each individual can use the normal newCustomer or existingCustomer selector. Existing individuals must be linked to the acting broker and have a stored date of birth. For Duo and Junior, that requirement applies to both the holder and the relative. The holder needs an email address and tax-residency information. Do not give different individuals the same email address.
Collect every investment, financial and health answer from the customer. customerFinancialStatus.hasSwissIncome is required and records whether the holder has income in Switzerland. Supply the actual answer, including false for a holder without Swiss income; residence, nationality and CHF premiums do not establish it. Synthetic negative answers in examples are not defaults to fill on a customer's behalf.
All amounts are integer CHF minor units (Rappen): 20000 is CHF 200 and 100000 is CHF 1,000. regularPremium is the amount per payment. With MONTHLY, 20000 means CHF 200 twelve times a year; with ANNUALLY, it means only CHF 200 per year.
lowRiskInvestment is required. Supply the customer's actual declaration, including an explicit false when appropriate. Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order. Omitted document language defaults to DE_CH; DE_DE, FR_FR and IT_IT are also available.
Swiss consultation protocol
The application includes the consultation protocol even when consultation is omitted. The legacy disableConsultationWaiver input currently cannot remove those pages: the API always sends external_advice_protocol: false. A licensed broker can supply consultation to prefill the advice and confirmations. Omitting it leaves the protocol for completion rather than removing it.
Retrieve Swiss product funds
Use the product-specific fund catalogue before building the investment selection. Select free investment funds; the insurance system adds the applicable guarantee fund when a guarantee is selected.
query SwissSavingsFunds($product: PlatformInsuranceProduct!) {
availableFunds(product: $product, pagination: { first: 100 }) {
__typename
... on AvailableFundsConnection {
edges {
node {
isin
name
isGuaranteeFund
}
}
pageInfo {
hasNextPage
endCursor
}
}
... on ErrorInterface {
message
}
}
}
Use PROSPERITY_DUO, PROSPERITY_JUNIOR or LIECHTENSTEIN_LIFE_WEALTH_CH for $product. Continue pagination when hasNextPage is true. Pass the selected isin as fundSelection[].id; percentages must sum to 100, with no duplicate funds and at most ten funds.
Swiss health questions by environment
The new Swiss branches follow the same temporary production split as Value Invest VWL for smoking and physician details. All other detailed health declarations remain required.
| Declaration | Staging (test2) and Stable (test) | Production |
|---|---|---|
| Disease, medication and other detailed answers | Required and sent using the Swiss questionnaire keys | Required and sent using the same Swiss keys |
smoking | Required and sent | Optional; validated for consistency when supplied, then omitted from the Lifeware request |
medicalPractitionerInformation | Required and nonblank; sent as medic | Optional; omitted from the Lifeware request |
Both fields are nullable in the GraphQL schema because production permits their omission. Staging and Stable validate the requirements during offer creation. An integration can send the complete example payload in every environment; production currently leaves smoking and physician details out of its provider request. Never invent a missing health answer.
Staging application PDFs verify the Swiss detailed mapping. Stable follows the non-production mapping but has not been tested against Lifeware. The production split is a provisional mapping based on the documented VWL rollout; production behavior for these Swiss tariffs still needs manual verification. Do not replace the Swiss disease fields with VWL's combined-question fields or apply its proposed EUR 35,000 threshold to CHF products.
Swiss age, premium and term rules
| Rule | Duo | Junior | Wealth CH: single | Wealth CH: regular |
|---|---|---|---|---|
| Holder entry age | 18–75 | 18–75 | 18–65 | 18–75 |
| Relative entry age | 16–60 | 0–15 | Holder is insured | Holder is insured |
| Holder end age | At most 85 | At most 85 | 60–100 | 60–85 |
| Minimum policy term | 10 years | 10 years | 10 years | 10 years |
| Minimum payment term | 5 years | 5 years | Single payment | 5 years |
| Minimum regular premium per year | CHF 1,200 | CHF 1,200 | Not applicable | CHF 2,000 |
| Minimum agreed regular-premium sum | CHF 12,000 | CHF 12,000 | Not applicable | CHF 10,000 |
| Initial top-up | 0 or at least CHF 500 | 0 or at least CHF 500 | Premium at least CHF 20,000 | 0 or at least CHF 1,000 |
For regular premiums, omit ageUntilPremiumIsPaid to pay until policy end. When present, it is the holder's age when payments end. The payment term must not exceed the policy term.
Start dates can be daily, from today through three calendar months ahead. Backdating is unavailable. Premiums settle by bank transfer/standing order; these branches expose no alternate payment-method input. Omitted document language defaults to DE_CH; DE_DE, FR_FR and IT_IT are also available.
Guarantees and maturity management
Use NO_GUARANTEE, SELECT50, SELECT80 or SELECT100. Omit guarantee for no guarantee. Any selected guarantee requires maturityManagement: true.
| Variant | Select50/Select80 minimum policy term | Select100 minimum policy term | Minimum payment term with a guarantee |
|---|---|---|---|
| Duo and Junior | 20 years | 30 years | 20 years for Select50/80; 30 years for Select100 |
| Wealth CH: regular | 20 years | 30 years | 20 years for every guarantee level |
| Wealth CH: single | 10 years | 10 years | Single payment |
For Duo and Junior, optional premiumWaiver covers the holder's occupational disability, with a waiting period of 6, 12 or 24 months. Holder entry age must not exceed 60. The policy can continue beyond the waiver coverage period under the product terms. Wealth CH exposes no premium-waiver input.
Swiss detailed health declarations
policyHolderHealthStatus is required for all three branches. For Duo and Junior, the policyholder is the insured provider. The relative's separate INSURED_PERSON role does not make that relative the subject of this health declaration.
Use the detailed grouped fields shown above. A positive grouped answer requires its details; a negative answer must omit details. For example:
{
"knownDiseases": {
"hasHadKnownDiseases": true,
"diseaseDetails": "Synthetic example: condition, period, recovery and treating practitioner"
},
"smoking": {
"hasSmoked": true,
"smokingDetails": "Synthetic example: substance and daily quantity"
}
}
The same consistency rule applies to existing insurance, additional health risks, medication, hospitalization and drug-abuse disclosures. Drug-abuse disclosures require both treatment and substance details. Provide the actual physician/practitioner information, body measurements and workload. Do not use the German VWL hasCriticalIllness fields or a simplified questionnaire as a substitute for these detailed Swiss declarations.
Disability annuities for the relative are not exposed by these creation branches. Relative health mapping remains unresolved. Junior's in-app guardian signing journey is also outside this creation support.
Swiss results, errors and documents
Handle __typename, every ErrorInterface result, and top-level GraphQL errors. Examples of validation outcomes include PRODUCT_CONFIGURATION_SWISS_SAVINGS, HEALTH_STATE_SWISS_SAVINGS, person-role errors and fund-selection errors. A partner without the product grant receives UnauthorizedOperationError.
A successful CreatedOffer.contractID identifies the offer. Follow the existing document retrieval flow to obtain its application form after synchronization. Inspect the generated application when verifying an integration, including positive health answers and the persons named on the form.
Creation does not establish signing readiness, underwriting acceptance, submission or policy issuance. The separate relative-health and guardian requirements must be resolved before relying on an end-to-end Duo/Junior application journey. Cross-border tariffs and other tariff years are not exposed by these branches.
These creation checks use staging (test2). Stable and production behavior require separate verification; a staging result does not establish parity.
Preview prompt
I need to fetch an offer and download the application form PDF via the Prosperity Partner Platform GraphQL API.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Query
```graphql
query Offer($contractId: PolicyID!) {
offer(contractID: $contractId) {
... on ErrorInterface {
__typename
message
}
... on Offer {
contractID
applicationFormDownloadLink {
... on FileDownload {
link
}
}
}
}
}
```
## Variables
```json
{
"contractId": "THE-CONTRACT-ID-FROM-CREATE-OFFER"
}
```
## Important
- Wait approximately 30 seconds after creating an offer before requesting documents (system sync delay)
- PDF download links are valid for 5 minutes only
- The contractID is returned from the createOffer mutation
## What I need
Build the integration to fetch offer details and download the application form PDF. Handle the timing constraint (30s wait after offer creation) and the link expiry (5 min).Fetching the PDF Document
Wait ~30 seconds after offer creation before requesting documents to avoid offer not found errors.
query Offer($contractId: PolicyID!) {
offer(contractID: $contractId) {
... on ErrorInterface {
__typename
message
}
... on Offer {
contractID
applicationFormDownloadLink {
... on FileDownload {
link
}
}
}
}
}
Value Invest VWL: who sets the standing order up
VWL premiums are paid by the employer, never by the employee, so arranging the payment happens outside the offer. customerFinancialStatus.paymentMethod: { "wireTransfer": ... } says who does the arranging, and on VWL both answers are open to you:
| Value | What Liechtenstein Life does | What you have to do |
|---|---|---|
true (default) | Nothing. The employer is expected to arrange the transfer alone. | Forward the standing-order page to the employer yourself — see below. |
false | Notifies the employer to set the standing order up. | Nothing. |
Omitting the value is the same as true.
false is accepted on Value Invest VWL only. Every other product returns InputValidationError with invalidInput: FINANCIAL_STATE_WIRE_TRANSFER_FALSE_NOT_SUPPORTED, because there the payer is the person signing the offer and there is nobody else to notify.
Forwarding the standing-order page
This applies when you send true, or send nothing. The application document fetched above contains a page written for exactly this purpose:
VWL Antrag auf Überweisung vermögenswirksamer Leistungen durch den Arbeitgeber
Forward that page to the employer. Nothing else in the flow does it — the employee signs the application form, but the employer only learns the amount, the account and the reference from this page. Forward it per offer, not per employer: the contribution amount and the personalNumber differ for every employee.
Skipping this step stalls the policy: the contributions never arrive and nobody is told to send them. If you would rather Liechtenstein Life contacted the employer, send false.
Uploading Required Documents
Once the customer has signed the application form, upload it back along with an identity document using the uploadDocument mutation. Both documents are typically required by the insurance system before issuance. If either is missing, submitOffer will return SubmitOfferValidationError listing the specific issues from the insurance system.
mutation UploadDocument($input: UploadDocumentInput!) {
uploadDocument(input: $input) {
__typename
... on DocumentUploaded {
contractID
documentId
}
... on ErrorInterface {
message
}
}
}
Input fields:
contractID— theContract IDreturned bycreateOfferfile— a multipartUpload(see note below)documentType— one of:SIGNED_APPLICATION_FORM— the application form signed by both the customer and the brokerIDENTITY_VERIFICATION— an identity document (passport, ID card, etc.) for the customer. It is the partner's responsibility to ensure the document is legitimate and belongs to the customer.
File requirements:
- Formats:
pdf,doc,docx - Maximum size: 5 MB
- Files that exceed the limit or have an unsupported format return
InvalidDocumentFormatError
The file argument uses the GraphQL multipart request spec. Send the request as multipart/form-data with an operations field containing the GraphQL payload, a map field binding the file variable, and the file itself. The request must also carry an apollo-require-preflight: true header — Apollo Server's CSRF prevention blocks multipart requests without it and returns a BAD_REQUEST error otherwise.
curl https://api.stable.life.li/graphql/partner-platform \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "x-partner-id: YOUR-PARTNER-ID" \
-H "apollo-require-preflight: true" \
-F operations='{ "query": "mutation ($input: UploadDocumentInput!) { uploadDocument(input: $input) { __typename ... on DocumentUploaded { documentId } ... on ErrorInterface { message } } }", "variables": { "input": { "contractID": "YOUR-CONTRACT-ID", "file": null, "documentType": "SIGNED_APPLICATION_FORM" } } }' \
-F map='{ "0": ["variables.input.file"] }' \
-F 0=@./signed-application.pdf
The example above uses POSIX shell quoting and works in bash, zsh, and PowerShell. On Windows cmd.exe, use PowerShell or WSL, or use a GraphQL client library (Apollo, urql) instead.
Most GraphQL clients (Apollo, urql, graphql-request) have first-class support for Upload via plugins such as apollo-upload-client.
Possible responses:
| Type | When |
|---|---|
DocumentUploaded | Upload succeeded; documentId identifies the file |
OfferNotFoundError | No offer exists for contractID under your partner account |
InvalidDocumentFormatError | Unsupported file type, or file exceeds the 5 MB limit |
UnexpectedError | System failure — retry once. If the error persists, contact support. |
Submitting the Offer
Once you have uploaded the documents needed by the insurance system, submit the offer for issuance with the submitOffer mutation. Submission is protected against duplicates: a second call for the same contractID returns OfferAlreadySubmittedError, which indicates the offer is already in the submission pipeline — no further action is required. This makes submitOffer safe to retry after a network timeout: if the first call actually reached the server, the retry will report OfferAlreadySubmittedError rather than re-submitting.
mutation SubmitOffer($input: SubmitOfferInput!) {
submitOffer(input: $input) {
__typename
... on SubmittedOffer {
contractID
}
... on SubmitOfferValidationError {
message
validationErrors {
title
description
}
}
... on ErrorInterface {
message
}
}
}
Possible responses:
| Type | When |
|---|---|
SubmittedOffer | Offer was accepted by the insurance system and enters the issuance workflow |
OfferNotFoundError | No offer exists for contractID under your partner account |
OfferAlreadySubmittedError | Offer was already submitted (or a submission is in progress) — no action needed |
SubmitOfferValidationError | Insurance system rejected the offer with validation errors listed in validationErrors. Fix the flagged data (or re-upload documents) and retry. |
UnexpectedError | System failure — retry once. If the error persists, contact support. |
When SubmitOfferValidationError is returned, the offer's submission state is rolled back internally so you can fix the data and call submitOffer again. No manual reset step is required.
Checking Offer Status
Use the offerStatus query to check the lifecycle state of an offer and whether it has any open reworks. This is a lightweight read and can be polled after submitOffer to track progress without fetching the full offer.
query OfferStatus($contractID: PolicyID!) {
offerStatus(contractID: $contractID) {
__typename
... on OfferStatus {
contractID
status
isSubmitted
isIssued
hasOpenReworks
openReworks {
taskId
openedOn
reason
status
}
}
... on ErrorInterface {
message
}
}
}
Lifecycle states (status):
| Value | Meaning |
|---|---|
OFFER | Offer created, not yet submitted |
SUBMITTED | Offer sent to the insurance system, processing in progress |
ISSUED | Offer has been converted into an active policy |
CANCELLED | Offer has been cancelled (terminal — overrides ISSUED if cancelled after issuance) |
Responding to Open Reworks
If the insurance system needs additional information or corrections, it opens a rework against the offer. Unlike the openReworks field inside offerStatus (which returns reworks for a single offer), the openReworks query returns all open reworks across every offer under your partner account — useful for building a rework dashboard. Use it to list all open reworks:
query OpenReworks {
openReworks {
__typename
... on OpenReworks {
totalCount
reworks {
taskId
contractID
openedOn
reason
status
}
}
... on ErrorInterface {
message
}
}
}
Only reworks with status WAITING (awaiting a response from the broker) are returned. After you address the flagged items (typically by re-uploading a corrected document with uploadDocument), the rework automatically transitions from WAITING to FROZEN (broker responded, internal confirmation pending). The transition to FINISHED is completed by the insurance system and may take additional processing time.
Preview prompt
I need to update customer information via the Prosperity Partner Platform GraphQL API.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Mutation
```graphql
mutation UpdateCustomer($customerBy: CustomerByInput!, $input: UpdateCustomerInput!) {
updateCustomer(customerBy: $customerBy, input: $input) {
... on ErrorInterface {
message
}
... on DataNotUpdatedError {
message
reason
}
... on InsuranceSystemError {
message
reasons
}
... on UpdatedCustomer {
customer {
... on IndividualPersonCustomer {
ID
}
}
}
}
}
```
## Variables — look up by email
```json
{
"customerBy": {
"email": "customer@example.com"
},
"input": {
"phoneNumber": "+49123456789",
"address": {
"country": "DE",
"city": "Munich",
"street": "Maximilianstrasse",
"zip": "80539",
"houseNumber": "1"
}
}
}
```
## Schema — UpdateCustomerInput
```graphql
"""
Input for editing a customer. Fields that are not provided will remain unchanged.
"""
input UpdateCustomerInput @oneOf {
"""
Fields to update for an individual person customer.
"""
individualCustomer: UpdateIndividualCustomerInput
"""
Fields to update for a corporate entity customer.
CURRENTLY NOT SUPPORTED
"""
corporateEntityCustomer: UpdateCorporateEntityCustomerInput
}
"""
Information about a physical address.
"""
input CustomerAddressInput {
"""
Street information.
"""
street: NonEmptyString!
"""
Additional information related to the street/location.
"""
streetAppendix: NonEmptyString
"""
House number information.
"""
houseNumber: NonEmptyString!
"""
Post box information.
"""
poBox: NonEmptyString
"""
ZIP or postal code.
"""
zip: NonEmptyString!
"""
City in which the address is located.
"""
city: NonEmptyString!
"""
The ISO 3166 country code for the current address (ISO 3166 alpha-2/alpha-3 standards supported).
"""
country: Country!
}
input CustomerIdentificationInput {
"""
Customer's name on the identification document
"""
name: String!
"""
Type of identification document.
"""
documentType: IdentificationDocumentType!
"""
Date when the document was issued.
"""
issueDate: Date!
"""
Date until which the document is valid.
"""
validUntil: Date!
"""
Place where the customer was born (e.g. Berlin, Germany) exactly what is mentioned in the document.
"""
birthPlace: String
"""
Document number or identifier.
"""
documentNumber: String!
"""
Authority that issued the document.
"""
issuedBy: String!
}
"""
Input for editing an individual person customer.
"""
input UpdateIndividualCustomerInput {
"""
First name of the customer
Note: Changeable only while the customer is related to offers alone. Sending it for any other customer makes the insurance system reject the whole request — see `DataNotUpdatedError`.
"""
firstName: NonEmptyString
"""
Last name of the customer
Note: Changeable only while the customer is related to offers alone. Sending it for any other customer makes the insurance system reject the whole request — see `DataNotUpdatedError`.
"""
lastName: NonEmptyString
"""
Date of birth of the customer
Note: Changeable only while the customer is related to offers alone. Sending it for any other customer makes the insurance system reject the whole request — see `DataNotUpdatedError`.
"""
dateOfBirth: Date
"""
Gender of the customer
Note: Changeable only while the customer is related to offers alone. Sending it for any other customer makes the insurance system reject the whole request — see `DataNotUpdatedError`.
"""
gender: Gender
"""
Marital status of the customer (e.g., Single, Married, Divorced)
"""
maritalStatus: MaritalStatus
"""
Nationality of the customer
"""
nationality: NonEmptyString
"""
Profession of the customer (e.g., Engineer, Teacher)
"""
profession: NonEmptyString
"""
Occupation of the customer (e.g., Job title or role)
"""
occupation: NonEmptyString
"""
Email address of the customer
"""
email: Email
"""
Landline phone number of the customer
"""
landline: NonEmptyString
"""
Mobile phone number of the customer
"""
mobilePhone: NonEmptyString
"""
Preferred language of the customer
"""
language: String
"""
Address of the customer
"""
address: CustomerAddressInput
"""
Tax related information of the customer
"""
taxIdentification: TaxIdentificationInput
"""
Identification information of the customer
"""
identification: CustomerIdentificationInput
}
enum CustomerLanguage {
"""
Swiss German
"""
DE_CH
"""
German
"""
DE_DE
"""
French
"""
FR_FR
"""
English
"""
EN_US
"""
Italian
"""
IT_IT
}
"""
Input for editing a corporate entity customer.
"""
input UpdateCorporateEntityCustomerInput {
"""
Official name of the corporate entity
"""
name: String
"""
Additional corporate entity name or trade name, if applicable
"""
additionalName: String
"""
Contact person's name within the corporate entity
"""
contactName: String
"""
Email address of the customer
"""
email: String
"""
Landline phone number of the customer
"""
landline: String
"""
Mobile phone number of the customer
"""
mobilePhone: String
"""
Preferred language of the customer
"""
language: CustomerLanguage
"""
Address of the customer
"""
address: CustomerAddressInput
"""
Taxation details of the corporate entity
"""
taxInformation: CorporateEntityTaxIdentificationInput
}
"""
Results of an edit customer operation.
"""
union UpdateCustomerResult =
| UpdatedCustomer
| CustomerNotFoundError
| MultipleCustomersFoundError
| InsuranceSystemError
| DataNotUpdatedError
| UnexpectedError
"""
Successful result of an edit customer operation.
"""
type UpdatedCustomer {
"""
The updated customer information.
"""
customer: Customer!
}
"""
When multiple customers are found based on the provided input.
This error indicates that the input was not specific enough to identify a single customer.
"""
type MultipleCustomersFoundError implements ErrorInterface {
message: String!
}
"""
The insurance system applied no change. Read `reason` for which situation applies and what to do about it.
"""
type DataNotUpdatedError implements ErrorInterface {
message: String!
"""
Which of the two situations applies, so the outcome can be branched on in code
rather than by reading `message`.
"""
reason: DataNotUpdatedReason!
}
"""
Which of the two situations behind "no change" applies.
The insurance system reports both the same way and does not say which, so this reports
what the request shows — whether it carried a field the insurance system can lock — and
each value names the retry that settles it.
"""
enum DataNotUpdatedReason {
"""
The request carried none of the lockable fields, so in almost every case no value in it
differed from the record already held: query the customer and compare. If the values do
differ, the update is not permitted for this customer and Liechtenstein Life Assurance AG
customer service can make it.
"""
NO_RESTRICTED_FIELD_PRESENT
"""
The request carried `firstName`, `lastName`, `gender` or `dateOfBirth`. Those are locked
for any customer that is not related to offers alone — no application, no broker relation
and no contract — and such a request is rejected in full, so the permitted fields in it
were not applied either. Resend those on their own: if that succeeds, a locked field was
the cause and Liechtenstein Life Assurance AG customer service can correct it; if it also
reports no change, no value in the request differed from the stored record.
"""
RESTRICTED_FIELD_PRESENT
}
"""
In case an unexpected error occurs during the update customer operation. Please contact customer support for assistance.
"""
type UnexpectedError implements ErrorInterface {
message: String!
}
```
## Restrictions
- Customer must be linked to your partner account
- First name, last name, gender and date of birth can only be changed while the customer is related to offers alone — no application, no broker relation and no contract
- A request that includes one of them for any other customer is rejected in full, so the permitted fields in that same request are not applied either; resend those on their own
- Contact Liechtenstein Life Assurance AG customer service to correct a locked field
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## What I need
Build the integration to update customer information. Look up customers by email or ID, and update allowed fields.Updating Customer Information
You can update existing customer information through the API if:
- They are linked to your partner account
- The information is allowed to be updated (some fields are restricted once contracts exist)
mutation UpdateCustomer(
$customerBy: CustomerByInput!
$input: UpdateCustomerInput!
) {
updateCustomer(customerBy: $customerBy, input: $input) {
... on ErrorInterface {
message
}
... on InsuranceSystemError {
message
reasons
}
... on UpdatedCustomer {
customer {
... on IndividualPersonCustomer {
ID
}
}
}
}
}
First name, last name, gender and date of birth can only be changed while the customer is related to offers alone — no application, no broker relation and no contract. A request that includes one of them for any other customer is rejected in full, so the permitted fields in that same request are not applied either. Resend those on their own, and contact Liechtenstein Life Assurance AG customer service to correct a locked field.
Preview prompt
I need to look up a customer by email via the Prosperity Partner Platform GraphQL API.
## Authentication
- Endpoint: https://api.stable.life.li/graphql/partner-platform (test) or https://api.life.li/graphql/partner-platform (production)
- Set header: Authorization: Bearer YOUR-API-KEY
- Set header: x-partner-id: YOUR-PARTNER-ID
- All requests are POST with Content-Type: application/json
- The body is: { "query": "...", "variables": { ... } }
## GraphQL Query
```graphql
query Customer($input: CustomerByInput!) {
customer(input: $input) {
__typename
... on ErrorInterface {
message
}
... on IndividualPersonCustomer {
ID
}
... on CorporateEntityCustomer {
ID
}
}
}
```
## Variables
```json
{
"input": {
"email": "customer@example.com"
}
}
```
## Error Handling
All mutations return union types. Always handle errors via ErrorInterface:
\`\`\`graphql
... on ErrorInterface {
__typename
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
message
}
\`\`\`
## What I need
Build the integration to look up customers by email and retrieve their ID for use in other operations (e.g., creating offers for existing customers).Looking Up Customer ID
You can retrieve a customer's ID using their email address:
query Customer($input: CustomerByInput!) {
customer(input: $input) {
__typename
... on ErrorInterface {
message
}
... on IndividualPersonCustomer {
ID
}
... on CorporateEntityCustomer {
ID
}
}
}
Registering a Customer
If your flow creates the customer before the offer — or without one — createCustomer registers them in the insurance system, assigned to the broker in your x-partner-id header, and returns their ID in the same call.
mutation CreateCustomer($input: CreateCustomerInput!) {
createCustomer(input: $input) {
__typename
... on CreatedCustomer {
customerID
}
... on ErrorInterface {
message
}
... on InsuranceSystemError {
reasons
}
... on InputValidationError {
invalidInput
}
}
}
{
"input": {
"firstName": "Ada",
"lastName": "Lovelace",
"dateOfBirth": "1990-05-17",
"gender": "FEMALE",
"maritalStatus": "MARRIED",
"nationality": "CH",
"email": "ada.lovelace@example.com",
"profession": "Analyst",
"mobilePhone": "+41791234567",
"address": {
"street": "Bahnhofstrasse",
"houseNumber": "1",
"zip": "9490",
"city": "Vaduz",
"country": "LI"
}
}
}
Response
{
"data": {
"createCustomer": {
"__typename": "CreatedCustomer",
"customerID": "af2490b7-a779-11f1-93fd-0050568cdbcc"
}
}
}
Pass the returned customerID as existingCustomer.byID.ID when you create the offer.
Error Handling
The API uses a schema-based error handling approach:
- All errors implement
ErrorInterface - Errors are self-documenting
- Never query error types directly
- Access errors through
ErrorInterfaceto avoid breaking changes
Common error responses:
{
"data": {
"createOffer": {
"__typename": "InsuranceSystemError",
"message": "Offer can not be created due to some insurance system errors",
"reasons": [
"Negative projection: The model cannot be computed. The basic data must be changed",
"Premium: Application limits regular premium (yearly): EUR 1,200.00 - EUR 1,000,000.00"
]
}
}
}
Learn more about our error handling pattern.