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.
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
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) {
... 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) {
... 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 {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: 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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""Input to associated persons for the policy"""
input LiechtensteinLifeInvestAssociatedPersonInput {
"""Information about the person associated with the policy."""
person: CreateOfferCustomerByInput!
"""The roles of the person in the policy."""
role: [LiechtensteinLifeInvestPolicyPersonRole!]!
}
"""
Information about the policy beneficiaries for both death and policy maturity.
"""
input LiechtensteinLifeInvestBeneficiariesInput {
"""
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 nominated beneficiaries in case of maturity of the policy and the insured person is alive.
"""
lifeBeneficiary: LifeBeneficiaryInput
}
enum LiechtensteinLifeInvestContractLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
"""English"""
EN_US
}
"""Information about the customer's current financial state."""
input LiechtensteinLifeInvestFinancialStatusInput {
"""
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 to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
"""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 (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
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!
}
"""
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 {
"""
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
"""
Indicates if the customer has a critical illness.
Set to false to mark the Health topic as completed in the insurance system.
"""
hasCriticalIllness: Boolean!
"Insured person's height in centimeters.\nRequired based on conditions described in the input type documentation.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
height: Int
"Insured person's weight in kilograms.\nRequired based on conditions described in the input type documentation.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
weight: Int
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input LiechtensteinLifeInvestInvestmentStrategyInput {
"""
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!]!
"""The reasons why the customer is making this investment choice."""
goals: InvestmentGoalsInput!
"""
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.
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!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: LiechtensteinLifeInvestSustainabilityDetailsInput!
}
"""Different products can support different roles."""
enum LiechtensteinLifeInvestPolicyPersonRole {
ECONOMIC_INTEREST
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Configuration for creating an offer for the Liechtenstein Life Invest insurance product.
"""
input LiechtensteinLifeInvestProductConfigurationInput {
"The reduction of the fund administration cost that the customer will have to pay to the broker.\nThe value is between 0 and 1.\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `1`\n"
absoluteReductionFundAdministrationCost: Float
"""
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!
"Age until which the customer will pay premiums.\n\nConstraints:\n- Minimum: 18 years\n- Maximum: 85 years\n- Must be greater than start date age\n- Must be at least 5 years from policy start\n\nDefault: Same as policy end age\n\n_Constraints_:\n\n\n* Minimal value: `18`\n* Maximal value: `85`\n"
ageUntilPremiumIsPaid: Int
"Age at which the policy ends and the customer can withdraw funds.\n\nConstraints:\n- Minimum: 62 years\n- Maximum: 85 years\n- Must be greater than the customer's age at start date\n\n_Constraints_:\n\n\n* Minimal value: `62`\n* Maximal value: `85`\n"
ageWhenPolicyEnds: Int!
"""
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!
"""
Investment strategy configuration including fund selection, risk level,
and sustainability preferences.
"""
investmentStrategy: LiechtensteinLifeInvestInvestmentStrategyInput!
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: LiechtensteinLifeInvestContractLanguage
"""
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!
"Annual premium increase percentage.\n\nConstraints:\n- Minimum: 1%\n- Maximum: 10%\n\nOmit this field for no annual adjustment.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n* Maximal value: `10`\n"
premiumDynamicPercentage: Int
"Premium payment frequency.\n\nValid values:\n- 0: Single premium\n- 1: Annual\n- 2: Semi-annual\n- 4: Quarterly\n- 12: Monthly (default)\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(0|1|2|4|12)$`\n"
premiumMode: Int
"""
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!
}
"""
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!
"""
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!
"""
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!]
"""
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!]
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
```
## 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
{
"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) {
... 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 {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: String!
}
"""
Enum for death beneficiary rights and termfix rights options for beneficiary.
"""
enum BeneficiaryRightsAndTermFixRightsOption {
"""
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
"""
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
"""Revocable rights."""
REVOCABLE
}
"""
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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""Input to associated persons for the policy"""
input LiechtensteinLifeWealthAssociatedPersonInput {
"""Input to provide details about a persons legal representatives"""
legalRepresentatives: [LegalRepresentativeInput!]
"""Information about the person associated with the policy."""
person: CreateOfferCustomerByInput!
"""The roles of the person in the policy."""
role: [LiechtensteinLifeWealthPolicyPersonRole!]!
}
"""
Information about the policy beneficiaries for both death and policy maturity.
"""
input LiechtensteinLifeWealthBeneficiariesInput {
"""
Beneficiary rights (“Bezugsrecht”) for the contract when one of two policyholders dies.
"""
beneficiaryRights: BeneficiaryRightsAndTermFixRightsOption
"""
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
"""
Information about the nominated beneficiaries in case of maturity of the policy and the insured person is alive.
"""
lifeBeneficiary: LifeBeneficiaryInput
"""
Rights for adjust the termfix of the contract when one of two policyholders dies.
"""
termFixRights: BeneficiaryRightsAndTermFixRightsOption
}
enum LiechtensteinLifeWealthContractLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
"""English"""
EN_US
}
"""
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
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input LiechtensteinLifeWealthDeathBeneficiaryInput {
"""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
}
"""Information about the customer's current financial state."""
input LiechtensteinLifeWealthFinancialStatusInput {
"""
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 to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
"""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 (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
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!
}
"""
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 {
"""
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
"""
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!
"""
Indicates if the insured person has had medical conditions in the last 2 years.
"""
hasNoMedicalConditions: Boolean!
"""
Indicates if the insured person has had medical consultations in the last 2 years.
"""
hasNoMedicalConsultation: Boolean!
"Insured person's height in centimeters at the time of the policy application.\nMandatory if either no_medical_conditions or no_medical_consultation are set to false\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
height: Int
"Insured person's weight in kilograms at the time of the policy application. \nMandatory if either no_medical_conditions or no_medical_consultation are set to false\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
weight: Int
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input LiechtensteinLifeWealthInvestmentStrategyInput {
"""
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!]!
"""The reasons why the customer is making this investment choice."""
goals: InvestmentGoalsInput!
"""
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.
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!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: LiechtensteinLifeWealthSustainabilityDetailsInput!
}
"""Different products can support different roles."""
enum LiechtensteinLifeWealthPolicyPersonRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICY_HOLDER
ECONOMIC_INTEREST
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Configuration for creating an offer for the Liechtenstein Life Invest insurance product.
"""
input LiechtensteinLifeWealthProductConfigurationInput {
"The reduction of the fund administration cost that the customer will have to pay to the broker.\nThe value is between 0 and 1.\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `1`\n"
absoluteReductionFundAdministrationCost: Float
"Additional death benefit for the policy.\nDefault is 0.\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `200`\n"
additionalDeathBenefit: Int
"""
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 many % of the contract entitles the additional policyholder.
Mandatory when there is an additional policyholder.
"""
additionalPolicyHolderPercentage: Percentage
"At what age would the customer like to stop paying premiums.\nThe age value can be between 5 and the policy end age (it needs to be greater than the start date age).\nThe default value is the policy end age.\n\n_Constraints_:\n\n\n* Minimal value: `18`\n* Maximal value: `104`\n"
ageUntilPremiumIsPaid: Int
"At what age would the customer like to stop paying for the policy / withdraw the money.\nThe age needs to be greater than the age of the customer at the start date.\nThe age value can be between 62 and 104 years.\n\n_Constraints_:\n\n\n* Minimal value: `62`\n* Maximal value: `104`\n"
ageWhenPolicyEnds: Int!
"""
Indicates when the death_coverage is paid out: when the… FIRST_TO_DIE", or "LAST_TO_DIE"
Default: LAST_TO_DIE
"""
deathCoveragePayout: DeathCoveragePayoutType
"""Specifics on how the money needs to be invested in the policy."""
investmentStrategy: LiechtensteinLifeWealthInvestmentStrategyInput!
"""Preferred Language of the contract and documents. Default `DE_DE`"""
language: LiechtensteinLifeWealthContractLanguage
"""
The minimum death benefit for the policy.
Default is `TAX_MINIMUM`.
"""
minimumDeathBenefit: MinimumDeathBenefit
"""
Details of payout
Default: No payout plan
"""
payoutPlan: PayoutPlanInput
"Indicates how much the premium amount is adjusted annually.\nWhen no amount is provided, the premium is not adjusted annually (set to 0).\n\n_Constraints_:\n\n\n* Minimal value: `3`\n* Maximal value: `10`\n"
premiumDynamicPercentage: Int
"The mode of the policy. The mode defines how often the customer would like to pay into the policy. \nOptions: 0, 1, 2, 4, 12 - Default is 12.\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(0|1|2|4|12)$`\n"
premiumMode: Int
"""
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!
"""
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!
"""
The waiting period for premium in death case
If not provided, the default is no waiting period.
"""
termFix: TermFixInput
}
"""
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!
"""
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!
"""
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!]
"""
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!]
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
```
## 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) {
... 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 {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: String!
}
"""Method for paying out brokerage fees"""
enum BrokerageFeePayoutMethod {
GROSS
NET
}
"""
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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""Input to associated persons for the policy"""
input ProsperityPlusGermanyAssociatedPersonInput {
"""Information about the person associated with the policy."""
person: CreateOfferCustomerByInput!
"""The roles of the person in the policy."""
role: [ProsperityPlusGermanyPolicyPersonRole!]!
}
"""
Information about the policy beneficiaries for both death and policy maturity.
"""
input ProsperityPlusGermanyBeneficiariesInput {
"""
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 nominated beneficiaries in case of maturity of the policy and the insured person is alive.
"""
lifeBeneficiary: LifeBeneficiaryInput
}
"""Language options for contract documents."""
enum ProsperityPlusGermanyContractLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
}
enum ProsperityPlusGermanyDeathBeneficiary {
"""The partner of the insured person at the time of death."""
PARTNER
}
input ProsperityPlusGermanyDeathBeneficiaryInput {
"""The beneficiary type."""
beneficiaryType: ProsperityPlusGermanyDeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries (or cases where beneficiaries are not partners, or policyholder) and percentage.
"""
customBeneficiaries: [CustomBeneficiaryRankInput!]
}
"""Information about the customer's current financial state."""
input ProsperityPlusGermanyFinancialStatusInput {
"""
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 to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
"""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 (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
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!
}
"""
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 {
"""
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
"""
Indicates if the customer has a critical illness.
Set to false to mark the Health topic as completed in the insurance system.
"""
hasCriticalIllness: Boolean!
"Insured person's height in centimeters.\nRequired based on conditions described in the input type documentation.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
height: Int
"Insured person's weight in kilograms.\nRequired based on conditions described in the input type documentation.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
weight: Int
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input ProsperityPlusGermanyInvestmentStrategyInput {
"""
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!]!
"""The reasons why the customer is making this investment choice."""
goals: InvestmentGoalsInput!
"""
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.
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!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: ProsperityPlusGermanySustainabilityDetailsInput!
}
"""Different products can support different roles."""
enum ProsperityPlusGermanyPolicyPersonRole {
ECONOMIC_INTEREST
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Configuration for creating an offer for the Prosperity Plus Germany insurance product.
"""
input ProsperityPlusGermanyProductConfigurationInput {
"""
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!
"Age until which the customer will pay premiums.\n\nConstraints:\n- Minimum: 18 years\n- Maximum: 85 years\n- Must be greater than start date age\n- Must be at least 5 years from policy start\n\nDefault: Same as policy end age\n\n_Constraints_:\n\n\n* Minimal value: `18`\n* Maximal value: `85`\n"
ageUntilPremiumIsPaid: Int
"Age at which the policy ends and the customer can withdraw funds.\n\nConstraints:\n- Minimum: 62 years\n- Maximum: 85 years\n- Must be greater than the customer's age at start date\n\n_Constraints_:\n\n\n* Minimal value: `62`\n* Maximal value: `85`\n"
ageWhenPolicyEnds: Int!
"""
Method for paying out brokerage fees, which determines the tariff to be used.
"""
brokerageFeePayoutMethod: BrokerageFeePayoutMethod!
"""
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!
"""
Investment strategy configuration including fund selection, risk level,
and sustainability preferences.
"""
investmentStrategy: ProsperityPlusGermanyInvestmentStrategyInput!
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: ProsperityPlusGermanyContractLanguage
"""
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
"""
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!
"Annual premium increase percentage.\n\nConstraints:\n- Minimum: 1%\n- Maximum: 10%\n\nOmit this field for no annual adjustment.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n* Maximal value: `10`\n"
premiumDynamicPercentage: Int
"Premium payment frequency.\n\nValid values:\n- 0: Single premium\n- 1: Annual\n- 2: Semi-annual\n- 4: Quarterly\n- 12: Monthly (default)\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(0|1|2|4|12)$`\n"
premiumMode: Int
"""
Indicates if the customer wants the option for premium waiver.
Default is false.
"""
premiumWaiver: Boolean
"""
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!
}
"""
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!
"""
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!
"""
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!]
"""
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!]
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
```
## 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
{
"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) {
... 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-05-01",
"language": "DE_DE",
"deathCoveragePercentage": 0,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [{ "id": "AT0000A08LD9", "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 {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: 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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""Input to associated persons for the policy"""
input LiechtensteinLifePensionAssociatedPersonInput {
"""Information about the person associated with the policy."""
person: CreateOfferCustomerByInput!
"""The roles of the person in the policy."""
role: [LiechtensteinLifePensionPolicyPersonRole!]!
}
"""
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
}
"""Language options for contract documents."""
enum LiechtensteinLifePensionContractLanguage {
"""German (Switzerland)"""
DE_CH
"""German"""
DE_DE
"""English"""
EN_US
}
"""
Death beneficiary options for Liechtenstein Life Pension.
Basisrente law (Schicht 1) restricts death beneficiaries to the partner only.
"""
enum LiechtensteinLifePensionDeathBeneficiary {
"""
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.")
"""
The partner (spouse/civil partner) of the insured person.
This is the only value accepted by the insurance system for Basisrente.
"""
PARTNER
}
"""Information about the customer's current financial state."""
input LiechtensteinLifePensionFinancialStatusInput {
"""
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 to use for payment of the policy premium and the one-time opt-in payment.
"""
paymentMethod: PaymentMethodInput!
"""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 (cents for EUR) to avoid floating point math.
Example: 100000 represents €1,000.00
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
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!
}
"""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
}
"""
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 {
"""
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
"""
Indicates if the customer has a critical illness.
Set to false to mark the Health topic as completed in the insurance system.
"""
hasCriticalIllness: Boolean!
"Insured person's height in centimeters.\nRequired based on conditions described in the input type documentation.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
height: Int
"Insured person's weight in kilograms.\nRequired based on conditions described in the input type documentation.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n"
weight: Int
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input LiechtensteinLifePensionInvestmentStrategyInput {
"""
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!]!
"""
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!
"""
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.
"""
riskLevel: RiskLevel!
"""
Information about the customer's knowledge of sustainable investing and the choices they have made.
"""
sustainabilityDetails: LiechtensteinLifePensionSustainabilityDetailsInput!
}
"""Different products can support different roles."""
enum LiechtensteinLifePensionPolicyPersonRole {
ECONOMIC_INTEREST
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Configuration for creating an offer for the Liechtenstein Life Pension insurance product.
"""
input LiechtensteinLifePensionProductConfigurationInput {
"The reduction of the fund administration cost that the customer will have to pay to the broker.\nThe value is between 0 and 1.\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `1`\n"
absoluteReductionFundAdministrationCost: Float
"""
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!
"Age until which the customer will pay premiums.\n\nConstraints:\n- Minimum: 18 years\n- Maximum: 75 years\n- Must be greater than start date age\n- Must be at least 5 years from policy start (enforced by insurance system)\n\nDefault: Same as policy end age\n\n_Constraints_:\n\n\n* Minimal value: `18`\n* Maximal value: `75`\n"
ageUntilPremiumIsPaid: Int
"Age at which the policy ends and the customer can withdraw funds.\n\nConstraints:\n- Minimum: 62 years\n- Maximum: 85 years\n- Must be greater than the customer's age at start date\n\n_Constraints_:\n\n\n* Minimal value: `62`\n* Maximal value: `85`\n"
ageWhenPolicyEnds: Int!
"""
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!
"""
Capital guarantee level for the policy.
Default is NO_GUARANTEE.
"""
guarantee: LiechtensteinLifePensionGuarantee
"""
Investment strategy configuration including fund selection, risk level,
and sustainability preferences.
"""
investmentStrategy: LiechtensteinLifePensionInvestmentStrategyInput!
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: LiechtensteinLifePensionContractLanguage
"""
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
"""
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.\n\nValid values:\n- 0: Single premium\n- 1: Annual\n- 2: Semi-annual\n- 4: Quarterly\n- 12: Monthly (default)\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(0|1|2|4|12)$`\n"
premiumMode: Int
"""
Indicates if the customer wants the option for premium waiver.
Default is false.
"""
premiumWaiver: Boolean
"""
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!
}
"""
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 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!
"""
Indicates the various topics/fund-classifications that have an adverse impact on sustainability that the customer want to avoid.
"""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""
Indicates the various ESG topics that the customer want to invest their funds in.
"""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
```
## 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-05-01",
"language": "DE_DE",
"deathCoveragePercentage": 0,
"investmentStrategy": {
"riskLevel": "MEDIUM",
"fundSelection": [
{
"id": "AT0000A08LD9",
"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) {
... 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",
"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": "PARTNER",
"isDeathBeneficiaryIrrevocable": false
}
}
}
}
```
## Relevant Schema Types (from SDL)
```graphql
"""Information about a physical address."""
input AddressInput {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: 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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
"""Input to associated persons for the policy."""
input ValueInvestVWLAssociatedPersonInput {
"""
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!
"""
Roles of this person in the policy. See `ValueInvestVWLPolicyPersonRole` for the
required combinations.
"""
role: [ValueInvestVWLPolicyPersonRole!]!
}
"""Information about the policy beneficiaries."""
input ValueInvestVWLBeneficiariesInput {
"""Death beneficiary. Defaults to `PARTNER` if omitted."""
deathBeneficiary: ValueInvestVWLDeathBeneficiary
"""Whether the death beneficiary is irrevocable. Default is false."""
isDeathBeneficiaryIrrevocable: Boolean
}
"""Language options for contract documents."""
enum ValueInvestVWLContractLanguage {
"""German. VWL is a German-market product; only German is supported."""
DE_DE
}
"""Death beneficiary options for Value Invest VWL."""
enum ValueInvestVWLDeathBeneficiary {
"""The legal heirs of the insured employee."""
HEIRS
"""The partner (spouse/civil partner) of the insured employee."""
PARTNER
}
"""Information about the customer's current financial state."""
input ValueInvestVWLFinancialStatusInput {
"""The origin of the money used to pay premiums."""
moneyOrigin: MoneyOrigin!
"""Required when `moneyOrigin` is `OTHER`."""
moneyOriginOtherText: String
"""Payment method used for the policy premium."""
paymentMethod: PaymentMethodInput!
"""The reason the customer is applying for a policy."""
policyReason: PolicyReason!
"""Required when `policyReason` is `OTHER`."""
policyReasonOtherText: String
"""
Total monthly expenses of the employee (smallest monetary unit, i.e. cents for EUR).
"""
totalMonthlyExpenses: MonetaryFractionalAmount!
"""
Monthly net income of the employee (smallest monetary unit, i.e. cents for EUR).
"""
totalMonthlyNetIncome: MonetaryFractionalAmount!
}
"""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
}
"""Investment strategy configuration for Value Invest VWL."""
input ValueInvestVWLInvestmentStrategyInput {
"""
Selected funds — percentages must sum to 100 and no more than 10 funds.
"""
fundSelection: [FundSelectionInput!]!
"""Customer's stated investment goals."""
goals: InvestmentGoalsInput!
"""Preferred rebalancing type. Default: `NORMAL` (yearly rebalance)."""
rebalancingType: RebalancingType
"""Maximum risk level the employee is willing to take."""
riskLevel: RiskLevel!
"""Sustainability preferences."""
sustainabilityDetails: ValueInvestVWLSustainabilityDetailsInput!
}
"""
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 {
ECONOMIC_INTEREST
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""Configuration for creating an offer for Value Invest VWL."""
input ValueInvestVWLProductConfigurationInput {
"Optional reduction of fund administration cost; value between 0 and 1.\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `1`\n"
absoluteReductionFundAdministrationCost: Float
"""
One-time additional payment paid into the policy at start (smallest monetary unit).
"""
additionalPayment: MonetaryFractionalAmount!
"Age until which the employee will pay premiums.\nConstraints: minimum 18 years, maximum 75 years. Must be greater than the employee's current age\nand at least 5 years from policy start (enforced by the insurance system).\nDefault: same as `ageWhenPolicyEnds`.\n\n_Constraints_:\n\n\n* Minimal value: `18`\n* Maximal value: `75`\n"
ageUntilPremiumIsPaid: Int
"Age at which the policy ends and the employee can withdraw funds.\nConstraints: minimum 60 years, maximum 85 years, must be greater than the employee's current age.\n\n_Constraints_:\n\n\n* Minimal value: `60`\n* Maximal value: `85`\n"
ageWhenPolicyEnds: Int!
"""
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
"""Investment strategy configuration."""
investmentStrategy: ValueInvestVWLInvestmentStrategyInput!
"""Preferred contract language. Default: `DE_DE`."""
language: ValueInvestVWLContractLanguage
"""Monthly premium (smallest monetary unit, i.e. cents for EUR)."""
monthlyPremium: MonetaryFractionalAmount!
"Personnel/employee number assigned by the employer.\nRequired by Lifeware (`policy_information.personal_number`). Free text — letters, digits, hyphens\nare accepted. Must not be empty.\n\n_Constraints_:\n\n\n* Minimal length: `1`\n* Maximal length: `32`\n"
personalNumber: String!
"Premium payment frequency.\nValid values: 0 (single premium), 1 (annual), 2 (semi-annual), 4 (quarterly), 12 (monthly, default).\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(0|1|2|4|12)$`\n"
premiumMode: Int
"""
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!
}
"""Sustainability investment preferences for Value Invest VWL."""
input ValueInvestVWLSustainabilityDetailsInput {
"""Customer's knowledge of sustainable investing."""
customerKnowledgeStatus: CustomerSustainabilityKnowledgeStatus!
"""Strength of the environmental/social focus."""
environmentalAndSocialInvestmentFocusLevel: EnvironmentalAndSocialInvestmentFocusLevel
"""
Percentage of the overall investment in sustainable funds. `0` indicates no sustainability preference.
"""
percentage: Int!
"""Sustainability topics the customer wants to exclude."""
topicsToExclude: [SustainabilityAdverseInvestmentTopic!]
"""Sustainability topics the customer wants to favour."""
topicsToInclude: [SustainabilityFavorableInvestmentTopic!]
}
```
## 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
- No health questionnaire — `insuredPersonsHealthStatus` is omitted
- Guarantee options: `NO_GUARANTEE`, `SELECT_50`, `SELECT_80`
- Death beneficiary: `PARTNER` or `HEIRS`
- Typical monthly premium: EUR 40 (4000 cents) — the standard VWL employer contribution
## 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:
- 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 - Required:
personalNumber— the employer's internal payroll identifier for the employee - No premium dynamic:
premiumDynamicPercentageis not part of the schema - No health questionnaire:
insuredPersonsHealthStatusis omitted - Guarantee options:
NO_GUARANTEE,SELECT_50,SELECT_80 - Death beneficiary:
PARTNERorHEIRS
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",
"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": "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) {
... 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 {
"""
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 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
"""
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
}
"""
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 {
"""
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
"""
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
}
```
## 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) {
... 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 {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: 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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""Additional health risk information from activities or occupation."""
input Prosperity3AAdditionalHealthRiskInformation {
"""
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!
}
"""Input to associated persons for the policy"""
input Prosperity3AAssociatedPersonInput {
"""Information about the person associated with the policy."""
person: CreateOfferCustomerByInput!
"""The roles of the person in the policy."""
role: [Prosperity3APolicyPersonRole!]!
}
"""
A single beneficiary allotment for a Prosperity 3A policy.
Provide either personalData (for an individual) or companyData (for a company), not both.
"""
input Prosperity3ABeneficiaryAllotmentInput {
"""Current address of the beneficiary."""
address: AddressInput!
"""
Percentage allotment for this beneficiary.
All allotments within a level must sum to 100.
"""
allotmentPercentage: Percentage!
"""
Company data for a corporate beneficiary. Mutually exclusive with personalData.
"""
companyData: Prosperity3ACompanyBeneficiaryInput
"""
Personal data for an individual beneficiary. Mutually exclusive with companyData.
"""
personalData: Prosperity3APersonalBeneficiaryInput
}
"""Company data for a corporate beneficiary in a Prosperity 3A policy."""
input Prosperity3ACompanyBeneficiaryInput {
"""Legal name of the company."""
name: String!
}
"""Language options for Prosperity 3A contract documents."""
enum Prosperity3AContractLanguage {
"""Swiss German (Switzerland)"""
DE_CH
"""Standard German (Germany)"""
DE_DE
"""French"""
FR_FR
"""Italian"""
IT_IT
}
"""Death coverage configuration for Prosperity 3A policies."""
input Prosperity3ACoverageInput {
"""
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: Prosperity3ACoverageType!
}
"""Type of death coverage for Prosperity 3A."""
enum Prosperity3ACoverageType {
"""A chosen death coverage amount."""
CHOSEN
"""101% of actuarial reserve at maturity."""
PERCENTAGE
}
"""
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!]
}
"""
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 {
"""
Configure custom beneficiaries at level 2 and/or level 3.
Level 1 is always the statutory beneficiary order defined by Swiss law.
"""
customBeneficiaries: Prosperity3ACustomDeathBeneficiariesInput
"""Use the default statutory beneficiary order (heirs)."""
defaultBeneficiary: Prosperity3ADefaultDeathBeneficiary
}
"""Marker enum for selecting the default statutory beneficiary order."""
enum Prosperity3ADefaultDeathBeneficiary {
"""Statutory heirs as defined by Swiss law."""
DEFAULT
}
"""
Disability annuity configuration for Prosperity 3A.
Provides a yearly pension if the insured person becomes occupationally disabled.
"""
input Prosperity3ADisabilityAnnuityInput {
"""
Whether the disability annuity increases by 1% per year to account for inflation.
"""
annuityIncrease: Boolean!
"""
Whether to exclude accident-related disability from coverage.
When true, only illness-related disability is covered.
"""
excludeAccident: Boolean!
"""
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.\nEach job class has one or more valid risk levels — see https://partner-docs.life.li/platform-integrations/job-classes for the mapping.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n* Maximal value: `5`\n"
jobRisk: Int!
"Waiting period in months before the disability annuity payments begin.\n\nValid values: 12, 24\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(12|24)$`\n"
waitingPeriodMonths: Int!
"""
Yearly disability pension amount in the smallest monetary unit (Rappen for CHF).
Example: 300000 represents CHF 3,000.00
"""
yearlyPensionAmount: MonetaryFractionalAmount!
}
"""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 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 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
}
"""
Information about the customer's current financial state for Prosperity 3A.
"""
input Prosperity3AFinancialStatusInput {
"""
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. 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
"""
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
"""The reason the customer is applying for a policy. Example: RETIREMENT"""
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
}
"""
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
}
"""
Health questionnaire for Prosperity 3A insured persons.
Swiss-specific questions required for underwriting when premium waiver or disability annuity coverage is selected.
"""
input Prosperity3AHealthInput {
"""Additional health risk information from activities or occupation."""
additionalHealthRisk: Prosperity3AAdditionalHealthRiskInformation!
"""Drug or alcohol abuse history and treatment details."""
drugAbuse: Prosperity3ADrugAbuseInformation!
"""
Employment workload as a percentage (0–100). Full-time employment is 100.
"""
employmentWorkload: 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!
"""
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: Prosperity3AHospitalizationInformation!
"""Known disease history in the last 10 years."""
knownDiseases: Prosperity3AKnownDiseaseInformation!
"""
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: Prosperity3AMedicationInformation!
"""Smoking history and details."""
smoking: Prosperity3ASmokingInformation!
"""Weight in kilograms."""
weight: Int!
"""Whether the insured person is self-employed."""
worksAsSelfEmployed: Boolean!
}
"""
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 {
"""
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
}
"""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
}
"""
Input to provide a collection of attributes that define how the money is to be invested for the current policy.
"""
input Prosperity3AInvestmentStrategyInput {
"""
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: Prosperity3ASustainabilityDetailsInput!
}
"""Known disease history in the last 10 years."""
input Prosperity3AKnownDiseaseInformation {
"""
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!
}
"""LSV+ direct debit details for Prosperity 3A."""
input Prosperity3ALSVPlusInput {
"""The BIC (Bank Identifier Code) of the bank."""
bic: String!
"""The IBAN of the bank account to debit via LSV+."""
iban: IBAN!
"""The date the LSV+ authorization was signed by the account holder."""
signatureDate: Date!
}
"""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
}
"""
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 {
"""ESR (Einzahlungsschein mit Referenznummer) — Swiss payment slip."""
esr: OnlyTrueValue
"""
Bank transfer — the customer will wire the payment to the given bank account.
"""
wireTransfer: OnlyTrueValue
}
"""Personal data for an individual beneficiary in a Prosperity 3A policy."""
input Prosperity3APersonalBeneficiaryInput {
"""
Date of birth of the beneficiary. Example: "1985-06-15"
"""
dateOfBirth: Date!
"""
First name of the beneficiary. Example: "Maria"
"""
firstName: String!
"""Gender of the beneficiary."""
gender: Gender!
"""
Last name of the beneficiary. Example: "Mueller"
"""
lastName: String!
}
"""Different products can support different roles."""
enum Prosperity3APolicyPersonRole {
"""The person with economic interest in the policy (beneficial owner)."""
ECONOMIC_INTEREST
"""The person whose life is insured under the policy."""
INSURED_PERSON
"""The person who receives correspondence related to the policy."""
MAILING
"""The person responsible for premium payments."""
PAYER
"""The person who owns the policy and is the contractual party."""
POLICY_HOLDER
}
"""Premium payment frequency for Prosperity 3A policies."""
enum Prosperity3APremiumMode {
"""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
}
"""
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.\n\nValid values: 6, 12, 24\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(6|12|24)$`\n"
waitingPeriodMonths: Int!
}
"""
Configuration for creating an offer for the Prosperity 3A insurance product.
"""
input Prosperity3AProductConfigurationInput {
"""
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!
"Age at which the policy ends. Swiss pillar 3a policies have a retirement age range of 60–70.\n\nConstraints:\n- Minimum: 60 years\n- Maximum: 70 years\n- Must be greater than the customer's age at start date\n\n_Constraints_:\n\n\n* Minimal value: `60`\n* Maximal value: `70`\n"
ageWhenPolicyEnds: Int!
"""Death coverage configuration for the 3A policy."""
coverage: Prosperity3ACoverageInput!
"""
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
"""
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
"""
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 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
"""
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!
"""
Preferred language for contract documents.
Default: DE_DE (German)
"""
language: Prosperity3AContractLanguage
"""
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
"""
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!
"Annual premium increase percentage.\n\nConstraints (when provided):\n- Minimum: 1%\n- Maximum: 10%\n\nOmit this field for no annual adjustment.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n* Maximal value: `10`\n"
premiumDynamicPercentage: Int
"""
Premium payment frequency. Defaults to monthly if omitted. Example: MONTHLY
"""
premiumMode: Prosperity3APremiumMode
"""
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
"""
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!
"""
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
}
"""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
}
"""
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 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!]
}
"""Transfer from an existing pillar 3a account into this policy."""
input Prosperity3ATransfer3aInput {
"""
Street address of the source institution. Example: "Bahnhofstrasse 9"
"""
address: String
"""
Transfer amount in the smallest monetary unit (Rappen for CHF).
Example: 500000 represents CHF 5,000.00
"""
amount: MonetaryFractionalAmount!
"""
City of the source institution. Example: "Zuerich"
"""
city: String
"""
Name of the source institution (bank or insurance company). Example: "Zuercher Kantonalbank"
"""
name: String
"""
PO Box of the source institution, if applicable. Example: "Postfach 1234"
"""
poBox: String
"""
Policy number of the existing 3a contract. Required when sourceType is INSURANCE.
"""
policyNumber: String
"""Source of the 3a transfer."""
sourceType: Prosperity3ATransferSourceType!
"""
ZIP/postal code of the source institution. Example: "8001"
"""
zip: String
}
"""Source of the pillar 3a transfer."""
enum Prosperity3ATransferSourceType {
"""Transfer from a bank 3a account."""
BANK
"""Transfer from an insurance company 3a policy."""
INSURANCE
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
```
## 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) {
... 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 {
"""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!
"""House number information."""
houseNumber: String!
"""Street information."""
street: String!
"""Additional information related to the street/location."""
streetAppendix: String
"""ZIP or postal code."""
zip: 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 {
"""
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 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
"""
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
}
"""
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 {
"""
Liechtenstein Life Invest is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
liechtensteinLifeInvest: CreateLiechtensteinLifeInvestInput
"""
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
"""
Liechtenstein Life Wealth is a premium pension solution combining long-term protection with sophisticated investment strategies.
Market: Germany
"""
liechtensteinLifeWealth: CreateLiechtensteinLifeWealthInput
"""
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
"""
Prosperity Plus Germany is a pension solution that combines long-term protection with individual investment strategies.
Market: Germany
"""
prosperityPlusGermany: CreateProsperityPlusGermanyInput
"""
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 product has no
health questionnaire.
Market: Germany
"""
valueInvestVWL: CreateValueInvestVWLInput
"""
Your Life Netto Plus.
Market: Germany
"""
yourLifeNettoPlus: CreateYourLifeNettoPlusInput
}
union CreateOfferResult = CreatedOffer | CustomerAlreadyExistsError | CustomerNotFoundError | InputValidationError | InsuranceSystemError | UnauthorizedOperationError
"""
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 how much percent of the valuation sum is paid as compensation to the broker monthly over 5 years.\nfrom 0 to 7 in 0.25 increments without dynamic\nfrom 0 to 9 in 0.25 increments with dynamic\n\n_Constraints_:\n\n\n* Minimal value: `0`\n* Maximal value: `9`\n"
percentage: Float!
"""
Indicates whether the customer pays the broker’s provision right now or monthly over 5 years.
"""
type: CreditInstructionsType!
}
"""
Input to provide information about the critical illness the customer has/had.
"""
input CriticalIllnessDetailsInput {
"""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!
"""
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!
"""
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!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
}
"""
Input to provide details about a beneficiary, address, personal details, and allotment amount.
"""
input CustomBeneficiaryRankInput {
"""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!
"""Date of birth of the beneficiary."""
dateOfBirth: Date!
"""The first name of the beneficiary (including any middle names)."""
firstName: 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!
"""The last name of the beneficiary."""
lastName: String!
"""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 author of the document."""
authorFirstName: String!
"""The last name of the author of the document."""
authorLastName: String!
"""The type of the author of the document."""
authorType: AuthorType!
"""The date of the document."""
date: Date!
"""The first name of the beneficiary (including any middle names)."""
documentTitle: String!
"""The place the document was created."""
place: String!
}
"""
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!
}
enum CustomerPolicyRole {
ADDITIONAL_INSURED_PERSON
ADDITIONAL_POLICYHOLDER
ECONOMIC_INTEREST
EMPLOYER
INSURED_PERSON
MAILING
PAYER
POLICY_HOLDER
}
"""
Person (multiple in case of heirs) who is nominated as beneficiary in case of death of the insured person.
"""
enum DeathBeneficiary {
"""The legal heirs of the insured person."""
HEIRS
"""The partner of the insured person at the time of death."""
PARTNER
}
"""
Input to define the people who are nominated as beneficiaries in case of death of the insured person.
"""
input DeathBeneficiaryInput {
"""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 {
"""
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
"""
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
}
"""
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 {
"""Female gender marker."""
FEMALE
"""Male gender marker."""
MALE
}
"""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!]!
}
"""
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!
"""A short description of the error."""
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!]!
}
"""
Various possible errors that can happen related to the input data that has been provided.
"""
enum InvalidInputType {
"""Tax identification is not valid"""
ASSOCIATED_PERSONS_MISSING_ROLE
"""Custom beneficiaries allotment total should be 100%"""
BENEFICIARIES_CUSTOM_BENEFICIARIES_ALLOTMENT_TOTAL
"""
When death beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_DEATH_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
When death beneficiary has subscription rights and term fix rights, both must be the same
"""
BENEFICIARIES_DEATH_BENEFICIARY_SUBSCRIPTION_AND_TERMFIX_RIGHTS_MISMATCH
"""
When death beneficiary type is not allowed for product specific reasons
"""
BENEFICIARIES_DEATH_BENEFICIARY_TYPE_NOT_ALLOWED
"""
When life beneficiary is custom - Custom Beneficiaries need to be provided
"""
BENEFICIARIES_LIFE_BENEFICIARY_CUSTOM_BENEFICIARY_MISSING
"""
Existing customer is corporate customer - Corporate customers are not supported right now
"""
CUSTOMER_CORPORATE_CUSTOMERS_NOT_SUPPORTED
"""Existing customer is missing date of birth"""
CUSTOMER_DATE_OF_BIRTH_MISSING
"""Customer is missing email"""
CUSTOMER_EMAIL_MISSING
"""Tax identification is not valid"""
CUSTOMER_TAX_IDENTIFICATION
"""When MoneyOrigin is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_MONEY_ORIGIN_OTHER_MISSING
"""When PolicyReason is sent as OTHER - OtherReason can not be null"""
FINANCIAL_STATE_POLICY_REASON_OTHER_MISSING
"""
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
"""
When HealthState is sent as CRITICAL_ILLNESS - CriticalIllnessDetails can not be null
"""
HEALTH_STATE_CRITICAL_ILLNESS_DETAILS_MISSING
"""
On a simplified health questionnaire, a follow-up `*Details` field was supplied together with a boolean answer that makes that detail irrelevant (for example `healthProblemsDetails` with `isHealthy = true`, or `seriousHandicapDetails` with `hasSeriousHandicap = false`). Omit the detail or flip the boolean so the two agree.
"""
HEALTH_STATE_DETAILS_MUST_BE_OMITTED
"""
On the simplified premium-waiver health questionnaire, `mentalIllnessDetails` must be provided when `hasMentalIllness` is `true`.
"""
HEALTH_STATE_MENTAL_ILLNESS_DETAILS_MISSING
"""
Health questionnaire is required when premiumWaiver or disabilityAnnuity is set, or `insuredPersonsHealthStatusV2` was provided without any of its three variants populated.
"""
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
"""
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 the simplified premium-waiver health questionnaire, `seriousHandicapDetails` must be provided when `hasSeriousHandicap` is `true`.
"""
HEALTH_STATE_SERIOUS_HANDICAP_DETAILS_MISSING
"""
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
"""
On a simplified health questionnaire (death-benefit or premium-waiver variant), `visitsDetails` must be provided when `hasNoMultipleMedicalVisits` is `false`.
"""
HEALTH_STATE_VISITS_DETAILS_MISSING
"""
When weight and height becomes mandatory based on the input of the other health questions
"""
HEALTH_STATE_WEIGHT_HEIGHT_NECESSARY
"""Tax identification is mandatory for policyholder"""
POLICY_HOLDER_TAX_IDENTIFICATION_MISSING
"""
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
"""Fund selection is not valid"""
PRODUCT_CONFIGURATION_FUND_SELECTION
"""
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
"""
Policy start date can not be before the start date of the current month
"""
PRODUCT_CONFIGURATION_POLICY_START_DATE
"""
policyNumber is required when transferExisting3APolicy sourceType is INSURANCE
"""
PRODUCT_CONFIGURATION_TRANSFER_POLICY_NUMBER_MISSING
}
"""Input that defines the various reasons to make an investment."""
input InvestmentGoalsInput {
"""
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!
"""
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!
}
"""
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 {
"""
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 {
"""Divorced, legally recognized."""
DIVORCED
"""Married, legally recognized."""
MARRIED
"""Officially registered, partnered."""
REGISTERED
"""Separated and not living together but not officially divorced."""
SEPARATED
"""Single, never married."""
SINGLE
"""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
}
"""
The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification.
"""
scalar MonetaryFractionalAmount
"""
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 {
"""
Income from employment or business activities.
Examples:
- Salary
- Business profits
- Professional fees
- Rental income
"""
EARNED_INCOME
"""
Money received as a gift.
Requires documentation of:
- Gift origin
- Donor relationship
- Gift tax compliance
"""
GIFT
"""
Money received through inheritance.
Must be documented with:
- Inheritance certificate
- Probate documents
- Transfer records
"""
INHERITANCE
"""
Other sources not covered by standard categories.
When selecting this option, additional documentation
and explanation must be provided.
"""
OTHER
"""
Funds from personal or business savings accounts.
Examples:
- Bank deposits
- Investment accounts
- Emergency funds
"""
SAVINGS
}
"""
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.**
"""
input PaymentMethodInput {
"""
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 customer.
"""
directDebit: DirectDebitInput
"""
In case the customer wants to wire transfer the payment, this option can be used.
The customer will be requested to wire transfer the payment to the given bank account to initiate the policy.
"""
wireTransfer: OnlyTrueValue
}
"""Indicate how the amount should be paid out to the beneficiaries."""
input PayoutPlanInput {
"""The account holder of the account that payouts will be made to."""
accountHolder: String!
"""The IBAN number of the account that payouts will be made to."""
iban: IBAN!
"""
Schedules for the payout plan.
The payout plan can have multiple schedules, each with a start and end date.
"""
schedules: [PaymentPlanScheduleInput!]!
}
"""
A number between 0 and 100, inclusive, representing a percentage value.
"""
scalar Percentage
scalar PhoneNumber
scalar PolicyID
"""Various reasons for obtaining the policy."""
enum PolicyReason {
"""Other reason for obtaining the policy."""
OTHER
"""The policy as a private pension for the user."""
PRIVATE_PENSION
}
"""
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!
}
"""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!]!
}
"""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
}
"""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
}
"""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 {
"""The beneficiary type."""
beneficiaryType: ProsperityPlusDeathBeneficiary
"""
Configure custom beneficiaries with multiple beneficiaries and percentage allotments.
"""
customBeneficiaries: [CustomBeneficiaryInput!]
}
"""
Disability annuity configuration for Prosperity Plus 3B.
Provides a yearly pension if the insured person becomes occupationally disabled.
"""
input ProsperityPlusDisabilityAnnuityInput {
"""Whether the disability pension increases by 1% per year."""
annuityIncrease: Boolean!
"""
Whether to exclude accident-related disability from coverage.
When true, only illness-related disability is covered.
"""
excludeAccident: Boolean!
"""
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.\nEach job class has one or more valid risk levels — see https://partner-docs.life.li/platform-integrations/job-classes for the mapping.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n* Maximal value: `5`\n"
jobRisk: Int!
"Waiting period in months before the disability annuity payments begin.\n\nValid values: 12, 24\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(12|24)$`\n"
waitingPeriodMonths: Int!
"""
Yearly disability pension amount in the smallest monetary unit (Rappen for CHF).
Example: 300000 represents CHF 3,000.00
"""
yearlyPensionAmount: MonetaryFractionalAmount!
}
"""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
}
"""
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
}
"""
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
}
"""
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 {
"""
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
}
"""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
}
"""
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!
}
"""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
}
"""
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 {
"""ESR (Einzahlungsschein mit Referenznummer) — Swiss payment slip."""
esr: OnlyTrueValue
"""
Bank transfer — the customer will wire the payment to the given bank account.
"""
wireTransfer: OnlyTrueValue
}
"""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
}
"""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
}
"""
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.\n\nValid values: 6, 12, 24\n\n_Constraints_:\n\n\n* Must match RegEx pattern: `^(6|12|24)$`\n"
waitingPeriodMonths: Int!
}
"""
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.\n\nConstraints:\n- Minimum: 18 years\n- Maximum: 85 years\n- Must be greater than the customer's age at start date\n\n_Constraints_:\n\n\n* Minimal value: `18`\n* Maximal value: `85`\n"
ageWhenPolicyEnds: Int!
"""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.\n\nConstraints (when provided):\n- Minimum: 1.0%\n- Maximum: 3.0%\n\nOmit this field or set it to null for no annual adjustment.\n\n_Constraints_:\n\n\n* Minimal value: `1`\n* Maximal value: `3`\n"
premiumDynamicPercentage: Float
"""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!
}
"""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
}
"""
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!]
}
"""
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 {
"""
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
"""No re-balancing is done after the initial fund allotment."""
NONE
"""
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 {
"""High level investment risk."""
HIGH
"""
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
}
"""
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 {
CONVENTIONAL_AND_UNCONVENTIONAL_WEAPONS
EROTIC_INDUSTRY
FOSSIL_ENERGY
GAMBLING
NUCLEAR_ENERGY
NUCLEAR_WEAPONS
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 {
ADAPTATION_TO_CLIMATE_CHANGE
CLIMATE_PROTECTION
COMBATING_INEQUALITIES
COMPLIANCE_WITH_HUMAN_AND_LABOR_RIGHTS
INVESTING_IN_HUMAN_CAPITAL
POLLUTION_PREVENTION_AND_CONTROL
PROMOTING_LABOR_RELATIONS
PROMOTION_OF_SOCIAL_INTEGRATION_AND_SOCIAL_COHESION
PROTECTION_AND_RESTORATION_OF_BIODIVERSITY_AND_ECOSYSTEMS
RESOURCE_EFFICIENCY
SUSTAINABLE_WATER_USE_AND_PROTECTION_OF_WATER_AND_MARINE_RESOURCES
}
"""
Tax residency information for a customer.
Used for regulatory compliance and tax reporting purposes.
"""
type TaxResidency {
"""
Country of tax residency.
Must be a valid ISO 3166-1 alpha-2 country code.
Example: "DE" for Germany
"""
country: Country!
"""
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!
"""
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 {
"""
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!]!
"""Designated date when the beneficiary should be paid out."""
term: Date!
}
"""
A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt.
"""
scalar URL
scalar UUID
"""
Error indicating the partner lacks required authorization for the requested operation.
Common causes:
- Missing permissions to sell the specific product
"""
type UnauthorizedOperationError implements ErrorInterface {
message: String!
}
```
## 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
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
}
}
}
}
}
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 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
"""Information about a physical address."""
input CustomerAddressInput {
"""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!
"""House number information."""
houseNumber: NonEmptyString!
"""Post box information."""
poBox: NonEmptyString
"""Street information."""
street: NonEmptyString!
"""Additional information related to the street/location."""
streetAppendix: NonEmptyString
"""ZIP or postal code."""
zip: NonEmptyString!
}
input CustomerIdentificationInput {
"""
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!
"""Type of identification document."""
documentType: IdentificationDocumentType!
"""Date when the document was issued."""
issueDate: Date!
"""Authority that issued the document."""
issuedBy: String!
"""Customer's name on the identification document"""
name: String!
"""Date until which the document is valid."""
validUntil: Date!
}
enum CustomerLanguage {
"""Swiss German"""
DE_CH
"""German"""
DE_DE
"""English"""
EN_US
"""French"""
FR_FR
"""Italian"""
IT_IT
}
"""
No changes can be made via API if no data has been modified, or if the update is not permitted.
The following fields can only be modified via API if the customer is related to any object other than an offer
First name
Last name
Gender
Date of birth
If the data shall still be changed, the insurance company technical service needs to be contacted.
"""
type DataNotUpdatedError implements ErrorInterface {
message: String!
}
"""
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!
}
"""
In case an unexpected error occurs during the update customer operation. Please contact customer support for assistance.
"""
type UnexpectedError implements ErrorInterface {
message: String!
}
"""Input for editing a corporate entity customer."""
input UpdateCorporateEntityCustomerInput {
"""Additional corporate entity name or trade name, if applicable"""
additionalName: String
"""Address of the customer"""
address: CustomerAddressInput
"""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
"""Preferred language of the customer"""
language: CustomerLanguage
"""Mobile phone number of the customer"""
mobilePhone: String
"""Official name of the corporate entity"""
name: String
"""Taxation details of the corporate entity"""
taxInformation: CorporateEntityTaxIdentificationInput
}
"""
Input for editing a customer. Fields that are not provided will remain unchanged.
"""
input UpdateCustomerInput {
"""
Fields to update for a corporate entity customer.
CURRENTLY NOT SUPPORTED
"""
corporateEntityCustomer: UpdateCorporateEntityCustomerInput
"""Fields to update for an individual person customer."""
individualCustomer: UpdateIndividualCustomerInput
}
"""Results of an edit customer operation."""
union UpdateCustomerResult = CustomerNotFoundError | DataNotUpdatedError | InsuranceSystemError | MultipleCustomersFoundError | UnexpectedError | UpdatedCustomer
"""Input for editing an individual person customer."""
input UpdateIndividualCustomerInput {
"""Address of the customer"""
address: CustomerAddressInput
"""
Date of birth of the customer
Note: This field can not be updated via API if the customer already has an open application or a contract.
"""
dateOfBirth: Date
"""Email address of the customer"""
email: Email
"""
First name of the customer
Note: This field can not be updated via API if the customer already has an open application or a contract.
"""
firstName: NonEmptyString
"""
Gender of the customer
Note: This field can not be updated via API if the customer already has an open application or a contract.
"""
gender: Gender
"""Identification information of the customer"""
identification: CustomerIdentificationInput
"""Landline phone number of the customer"""
landline: NonEmptyString
"""Preferred language of the customer"""
language: String
"""
Last name of the customer
Note: This field can not be updated via API if the customer already has an open application or a contract.
"""
lastName: NonEmptyString
"""Marital status of the customer (e.g., Single, Married, Divorced)"""
maritalStatus: MaritalStatus
"""Mobile phone number of the customer"""
mobilePhone: NonEmptyString
"""Nationality of the customer"""
nationality: NonEmptyString
"""Occupation of the customer (e.g., Job title or role)"""
occupation: NonEmptyString
"""Profession of the customer (e.g., Engineer, Teacher)"""
profession: NonEmptyString
"""Tax related information of the customer"""
taxIdentification: TaxIdentificationInput
}
"""Successful result of an edit customer operation."""
type UpdatedCustomer {
"""The updated customer information."""
customer: Customer!
}
```
## Restrictions
- Customer must be linked to your partner account
- First name, last name, gender, and date of birth CANNOT be changed if the customer has open applications or existing contracts
- Contact support for restricted field updates
## 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
}
}
}
}
}
For security reasons, certain fields (first name, last name, gender, date of birth) cannot be changed through the API if the customer has open applications or existing contracts. Contact support for such updates.
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
}
}
}
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.