Skip to content
Last updated

Consumer loans

Introduction

This guide explains the integration process for the Solaris Consumer Loans product for retail customers as a standalone solution. It covers the mandatory information you must collect and the endpoints and webhooks required for integration.

Product specifications

The Solaris Consumer Loans product enables you to offer loans to retail customers through an efficient workflow. Using the API and an automated credit scoring system, you can create loan applications, identify customers, issue payouts, and service consumer loans.

Solaris loans are versatile and customizable. The standard offering includes loan amounts ranging from EUR 1,000 to 50,000 and terms from 12 to 84 months. You can choose between a standard loan or a loan tied to financing the purchase of goods.

Important

Consumer loans are currently only offered to customers in Germany with at least one German bank account.

Credit scoring

Solaris uses an automated retail credit scoring system to make informed credit decisions. The scorer analyzes financial information, credit data, transaction history, and outstanding loans to assess creditworthiness, risk level, and eligibility.

Based on checks performed throughout the application lifecycle, the scorer estimates the probability of default (PD) and determines whether to offer a loan, including the specific amount, term, and interest rate.

Interaction with the consumer loan service

The consumer loan service handles requests and collects applicant information, such as self-declared financial data, credit records, and account snapshots. The scorer provides decisions based on the information provided at each stage:

  • Anonymous offer: Evaluates self-declared information provided during the non-binding offer request. Returns an immediate decision. (Only applies if you implement the anonymous offer endpoint).
  • Binding offer: Decides whether to make a binding offer by analyzing the loan application and external credit records (e.g., SCHUFA).
  • Verification: Uses the account snapshot to verify financial information. This is the final check before the final decision. This step can be skipped based on your configuration.

System prerequisites

Before integrating Solaris Consumer Loans, implement the following requirements:

1. Technical setup

Set up your environment and get your authentication keys. For step-by-step instructions, check the Technical setup guide.

2. Legal and compliance screens

Build the necessary legal and compliance screens in your sign-up flow to collect your customers' consent. The Legal and compliance screens guide contains step-by-step instructions on how to create these screens and what they must contain.

The following screens are required to onboard B2C customers for lending standalone products:

  1. Terms and Conditions
  2. Customer information
  3. Economic interest

Consent timestamps

You must record the customer's consent on each screen as a UTC timestamp (e.g., 2019-01-01T00:00:00Z) and pass it to Solaris in the following fields:

  • Solaris Terms and Conditions: terms_conditions_signed_at
  • Data Processing Terms: data_terms_signed_at
  • Economic Interest Declaration: own_economic_interest_signed_at

These fields are part of the person resource where all customer data points are stored.


Integration overview

The following sequence diagram outlines the integration flow for the Consumer Loans solution:

Diagram: Consumer Loans flow

Important
  • This guide details the standalone solution (loan credited to an external account).
  • For existing customers with a Solaris current account, skip Step 2.

Integrate Solaris Consumer Loans by completing the following steps:

StageStepDescription
RegistrationStep 1 (Optional)Generate an anonymous loan offer.
RegistrationStep 2Collect mandatory customer data, consent to legal requirements, and create a person resource.
ApplicationStep 3Create a credit record for the customer.
ApplicationStep 4Create a loan application with mandatory data points for the scorer.
ApplicationStep 5Create an account snapshot and link it to the loan application.
ContractStep 6Send the SECCI form and final loan contract.
IdentificationStep 7Trigger KYC and e-signing (IDnow). Ensure the customer is identified and passes risk screening.
PayoutStep 8Create the loan to trigger the payout.
ServicingStep 9Implement loan servicing and maintenance endpoints.

Webhooks

Subscribe to the following webhook events to automate your processes:

Mandatory features

Integrate all mandatory features for B2C Loans highlighted in the Onboarding requirements guide before going live.


Step 1: Generate an anonymous offer for a loan (Optional)

You may offer customers a non-binding anonymous loan offer before they provide personal data or start the application. This optional step allows customers to check eligibility early.

How it works

The customer enters their desired loan amount, duration, and self-declared financial information. The scoring system evaluates eligibility and provides an initial approval or rejection.

  • Approval: Returns a non-binding offer (amount, term, interest rate, monthly installment).
  • Rejection: Returns a rejection or an adjusted offer (e.g., lower amount).

POST Generate anonymous loan offer

Call this endpoint to generate the offer.

Mandatory fields: The following fields are strictly required by the schema:

  • requested_loan_term
  • requested_loan_amount
  • number_of_dependents
  • net_income_amount
  • living_situation_amount
  • living_situation
  • private_insurance_amount

Optional fields: Include these if available to improve scoring accuracy:

  • requested_emi
  • existing_credit_repayment_excluding_mortgage

Request URL

POST /v1/anonymous_consumer_loan_offers

Response

The API returns a loan_decision (OFFERED or REJECTED) and the offer details.

Note: The decision is not final and the offer is not binding. The customer must complete the full application process to receive a binding offer.


Step 2: Collect customer data and create person resource

Collect the mandatory customer data, including timestamps for the legal and compliance screens. Create a person resource to send this data to Solaris.

API reference

For a complete list of endpoints, properties, and examples related to the person resource, visit the following links:

Related webhook events

Important points about data collection
  • Review the special requirements in the Onboarding requirements guide.
  • Submit information exactly as it appears in official documents.
  • Sandbox Testing: Ensure that each person you create has unique values for first_name, last_name, birth_city, and birth_date. If you create over 1000 identical person resources, the API will return a 400 error.
  • Privacy: Do not use real personal data when testing in Sandbox.

POST Create person

Create a person resource to represent your customer. You must include the following data points in the request body to satisfy the requirements for German Consumer Loans.

Mandatory fields for retail customers in Germany:

  • salutation
  • first_name
  • last_name
  • email
  • mobile_number
  • birth_date
  • birth_city
  • birth_country
  • nationality
  • employment_status
  • address:
    • line_1
    • line_2 (optional)
    • postal_code
    • city
    • country
  • tax_information:
    • marital_status
  • terms_conditions_signed_at
  • data_terms_signed_at
  • own_economic_interest_signed_at

Request URL

POST /v1/persons

PATCH update person

This endpoint updates one or more properties on a person resource. You can only update the following properties using this endpoint:

  • title
  • salutation
  • address (line_1, line_2, postal_code, city, state, country)
  • contact_address (line_1, line_2, postal_code, city, state, country)
  • employment_status
  • job_title
  • email
  • tax_information (tax_assessment, marital_status)
  • fatca_relevant
  • fatca_crs_confirmed_at
  • business_purpose
  • industry
  • industry_key
  • own_economic_interest_signed_at
  • aml_confirmed_on (only with today or tomorrow's date)
  • expected_monthly_revenue_cents
  • vat_number
  • website_social_media
  • business_trading_name
  • nace_code
  • business_address_line_1
  • business_address_line_2
  • business_postal_code
  • business_city
  • business_country
  • annual_income_range
  • data_terms_signed_at
  • branch
  • birth_province
  • birth_post_code
  • socioprofessional_category
  • purpose_of_account_opening
  • main_income_source
  • work_country
  • work_province
  • self_declared_as_pep
  • international_operativity_expectation
  • registration_number
Important

Restricted Updates:

  • Fields not mentioned in this list can only be updated via Customer Support.

Freelancer & Self-Employed Requirements (B2C):

  • If a customer changes their employment_status to FREELANCER or SELF_EMPLOYED, you must include one of the following in the request to avoid an error:
    1. The customer's nace_code (Recommended for data quality).
    2. Set industry and industry_key to null.

Request URL

PATCH /v1/persons/{id}

Request example

{ "email": "new.email@example.com", "address": { "line_1": "New Street", "line_2": "1", "postal_code": "10119", "city": "Berlin", "country": "DE" } }

Step 3: Create customer credit record

Create a consumer credit record and link it to the customer's person resource.

What is a credit record?

The credit record contains the customer's credit data and history. Creating a credit record is mandatory for Lending integrations, as it is used for credit scoring to determine the customer's creditworthiness and eligibility.

Important

Regional Availability:

  • Germany: The credit record is required. Information is retrieved from SCHUFA (German credit bureau).
  • France, Italy, Spain: A credit record is not required. Instead, creating a tax identification for the customer substitutes this requirement.

Create a credit record

To create a credit record, you must choose a source in the request body:

  1. source: solarisBank (Automated) Solaris retrieves the customer's record directly from SCHUFA. This is the standard recommended process.

  2. source: partner (Manual Upload) You collect the credit record manually from SCHUFA or third-party providers and upload it to Solaris.

    • Requirement: You must Base64-encode the file and pass the content in the file field.

Endpoints:

Depending on your customer type, use one of the following endpoints:

Retail Customers

POST /v1/persons/{person_id}/credit_records

Freelancers

POST /v1/freelancers/persons/{person_id}/credit_records

GET Retrieve a credit record

Call this endpoint to check the status and validity of an existing credit record.

Request URL

GET /v1/persons/{person_id}/credit_records/{credit_record_id}

Expiry Logic: If the status of the retrieved credit record is expired, you must create a new record for the customer before proceeding with a loan application.


Step 4: Create customer loan application

Collect loan-specific information and create the application.

POST Create consumer loan application

This endpoint creates the application and assigns it to the person specified in the URL. The payload initiates the credit checks.

Mandatory properties:

  • requested_loan_term
  • requested_loan_amount
  • repayment_day_of_month
  • private_insurance_amount
  • number_of_dependents
  • net_income_amount
  • living_situation_amount
  • living_situation
  • moved_in_last_two_years
  • credit_record_id
  • loan_purpose
  • partner_reference_number

Financed goods properties: For loans financing a purchase, include:

  • cash_price
  • seller
  • financed_good

Request URL

POST /v1/persons/{person_id}/consumer_loan_applications

Scoring & Response

The system automatically scores the application:

  • Approved: status becomes offered. Returns a binding offer (amount, term, interest rate, installment).

  • Rejected: status becomes rejected.

  • API Reference: Create application

GET Retrieve consumer loan application

Track the application lifecycle using this endpoint.

Request URL

GET /v1/persons/{person_id}/consumer_loan_applications/{application_id}

💡 Webhook: Subscribe to CONSUMER_LOAN_APPLICATION to receive automatic updates whenever the application status changes (e.g., from screening_pending to approved).

Application status flow

The following diagram illustrates the application status transitions:

Diagram: Consumer loan application flow

POST Generate a subsidized offer (Optional)

Create a subsidized offer with a reduced interest rate by adding the interest_rate in the request body.

You must compensate Solaris for the difference between the initial offered rate and the subsidized rate.

Request URL

POST /v1/persons/{person_id}/consumer_loan_applications/{consumer_loan_application_id}/offers/{offer_id}/subsidize

Step 5: Create account snapshot

Create an account snapshot and link it to the application when the status is offered.

PUT Skip account snapshot (Optional)

To skip this step and proceed directly to approved:

Request URL

PUT /v1/persons/{person_id}/consumer_loan_applications/{application_id}/skip_account_snapshot

What is an account snapshot?

The account snapshot contains a breakdown of the customer's account information, such as balance, transactions, bookings, and recurrent repayment amounts over a specific period. It is mandatory for Lending integrations, as it is used for credit scoring to verify the customer's financial data.

Create an account snapshot

Call the endpoint below to create a snapshot. You must specify the source field to determine the integration method.

Request URL

POST /v1/persons/{person_id}/account_snapshots

Method 1: FinTecSystems (FTS)

Use this method to integrate the FTS wizard.

  1. Integrate the FTS wizard in your solution (see FTS Documentation).
  2. Call the endpoint with source: FIN_TECH_SYSTEMS. Optionally, include the iban.
  3. Use the returned wizard_session_key to initialize the FTS wizard.
  4. The customer enters their credentials in the wizard.

Request:

{ "source": "FIN_TECH_SYSTEMS" }

Response:

{ "wizard_session_key": "Hm7jUSC7XU2nQjPqJO8dl39eDkdjtOdCtywcmv3x", "location": null, "id": "8df2a8ba713c43dc9cb481b9cceed487snap", "account_id": null }

Method 2: Finreach

Use this method to integrate the FinX widget.

  1. Integrate the FinX widget (see FinX Documentation).
  2. Call the endpoint with source: FINREACH.
  3. Redirect the customer to the URL provided in the location field.

Request:

{ "source": "FINREACH" }

Response:

{ "wizard_session_key": null, "location": "https://ui.solaris-i.prod.finleap.cloud?token=xxxxxx", "id": "8df2a8ba713c43dc9cb481b9cceed487snap", "account_id": null }

Method 3: Partner (Manual Upload)

Use this method if you have your own connection to a third-party provider and want to upload the data directly.

  • Set source to PARTNER.
  • Include the full data structure in snapshot_data.

Request:

{ "source": "PARTNER", "snapshot_data": { "account": { "bank_name": "", "bic": "", "country_id": "", "description": "", "holder": "John Smith", "iban": "DE92370601930002130041", "joint_account": false }, "balance": { "balance": 3720.2, "currency": "EUR", "date": "2022-02-03", "limit": 0 }, "date": "2022-02-03", "days": 90, "turnovers": [ {} ] } }

Method 4: Solaris (Internal)

Use this method if the customer already has a Solaris account.

  • Set source to SOLARISBANK.
  • Include the account_id of the Solaris account.

Request:

{ "source": "SOLARISBANK", "account_id": "adc123a45d6d7cf8fbfeed537ba919d5cacc" }

Response:

{ "wizard_session_key": null, "location": null, "id": "0a3f28733f9a4842842aae2804f80eb4snap", "account_id": "adc123a45d6d7cf8fbfeed537ba919d5cacc" }

GET Retrieve account snapshot

Call this endpoint to check the status and validity of an existing snapshot.

Request URL

GET /v1/persons/{person_id}/account_snapshots/{account_snapshot_id}
  • If the status is expired, you must create a new snapshot.
  • Subscribe to the ACCOUNT_SNAPSHOT webhook for status updates.

Link the snapshot to the application using the account_snapshot_id. This changes the status to account_snapshot_verification and triggers the final credit check.

Request URL

PUT /v1/persons/{person_id}/consumer_loan_applications/{application_id}/account_snapshot
{
  "account_snapshot_id": "0a3f28733f9a4842842aae2804f80eb4snap"
}

💡 Webhook: Subscribe to the ACCOUNT_SNAPSHOT webhook to be notified when the snapshot is successfully created and verified.

PUT Upload purchase contract (Optional)

If financing a specific asset (e.g., a car), upload the purchase contract.

Request URL

PUT /v1/persons/{person_id}/consumer_loan_applications/{application_id}/upload_purchase_contract

Step 6: Send SECCI form and loan contract

You must provide the customer with the Standard European Consumer Credit Information (SECCI) form and the final contract for review.

GET Retrieve SECCI form

Generate the SECCI form as a PDF and share it with the customer before sending the final contract.

Request URL

GET /v1/persons/{person_id}/consumer_loan_applications/{application_id}/offers/{offer_id}/pre_contract

GET Retrieve final contract

After the customer approves the SECCI form, generate the final contract for e-signing.

Request URL

GET /v1/persons/{person_id}/consumer_loan_applications/{application_id}/offers/{offer_id}/contract

The customer must also sign a SEPA Direct Debit (SDD) mandate. See the SEPA Direct Debit guide for details.


Step 7: Complete the customer identification and e-signing process

Trigger the video identification session (IDnow). The agent verifies the customer's identity and mobile number, and collects the Qualified Electronic Signature (QES) on the loan contract, SDD mandate, and terms.

Proceed when the application status is esign_pending.

GET Retrieve the signing ID

When the status is esign_pending, call GET Retrieve consumer loan application to obtain the signing_id.

GET Retrieve e-signing and identification details

Use the signing_id to get IDnow details (reference and URL). Redirect the customer to the returned URL.

Request URL

GET /v1/persons/{person_id}/signings/{signing_id}

💡 Webhook: Subscribe to the IDENTIFICATION webhook. It will send a notification (e.g., status: successful) when the customer completes the video interview.

GET Retrieve signed contracts

After successful identification, retrieve the signed documents.

Request URL

GET /v1/persons/{person_id}/signings/{id}

Document Types:

  • SIGNED_CONTRACT with ldoc suffix: Signed SDD mandate.
  • SIGNED_CONTRACT with cdoc suffix: Signed loan contract.

GET Download a document

Download specific signed files to share with the customer.

Request URL

GET /v1/persons/{person_id}/documents/{id}/file

GET Retrieve identification details

Verify the identification status is successful.

Request URL

GET /v1/persons/{person_id}/identifications/{id}

Step 8: Create the loan

Create the loan to trigger the payout when the application status is loan_creation_pending.

PUT Pay out a customer loan

This endpoint assigns the loan and issues the payout to the recipient IBAN.

Request URL

PUT v1/persons/{person_id}/consumer_loan_applications/{application_id}/consumer_loan

Response

Returns the loan_id. The application status changes to loan_created.

GET Retrieve consumer loan information

Retrieve loan details, status, and overdue amounts.

Request URL

GET /v1/loans/{loan_id}

💡 Webhook: Subscribe to the LOAN webhook to track ongoing status changes during the loan lifecycle (e.g., repayments, overdue alerts).


Step 9: Loan servicing

Implement endpoints for servicing and maintaining consumer loans.

Loan Servicing Endpoints

Implement these endpoints to manage the active loan lifecycle, including retrieving status, schedules, and history.

Key Endpoints:

GET Retrieve a loan schedule

Call this endpoint to retrieve the latest repayment schedule for a specific loan. The response includes:

  • Loan balance: The remaining amount to be paid.
  • Loan installments: A list of past and future scheduled payments.

Request URL

GET /v1/loans/{loan_id}/repayment_schedule

GET Retrieve repayment history

Call this endpoint to view the history of all payments made towards the loan. The response includes:

  • SEPA Direct Debits (SDD): Automatic monthly installments pulled from the reference account.
  • SEPA Credit Transfers (SCT): Manual transfers made by the customer for partial or full early repayment (if applicable).

Request URL

GET /v1/loans/{loan_id}/repayment_history

The following guides and API references are relevant to the Consumer Loans integration:


Appendix I: Enums

Consumer loan application status

StatusDescription
offeredApplication passed initial scoring.
account_snapshot_verificationAccount snapshot required for final verification.
approvedApplication approved.
esign_pendingIdentification and e-signing triggered. signing_id is available.
screening_pendingUndergoing internal risk screening.
esign_failedIdentification failed. Trigger a new process.
loan_creation_pendingIdentification and screening successful. Ready for loan creation.
loan_createdLoan created and payout triggered.
rejectedApplication rejected.
deletedApplication deleted.
expiredApplication expired (credit record or snapshot validity exceeded).

Document types

The following table includes the possible values for the field document_type and their descriptions.

EnumDescription
ANNUAL_FINANCIAL_STATEMENTA business or company's annual financial statement.
KYC_REPORTThe KYC report generated after successful customer identification.
ID_DOCUMENTA person's identification document, such as a passport or ID card.
SIGNATUREA signature sample.
PICTUREA picture or scanned document of any other type.
QES_DOCUMENTA document related to a Qualified Electronic Signature (QES).
SIGNED_CONTRACTA signed contract of any kind.
SIGNED_QES_DOCUMENTA document signed by a Qualified Electronic Signature (QES).
REGISTER_APPLICATIONA document proving the application for registration (Gründungsurkunde), used for companies "in formation".
REGISTER_CHECKA register check.
REGISTER_EXTRACTA commercial register excerpt or similar document.
FOUNDATION_DOCUMENTThe foundation document of a company or business.
SCHUFA_COMPACT_REPORTA compact SCHUFA report.
SCHUFA_GWG_REPORTA GWG (Money Laundering Act) SCHUFA report.
SCHUFA_FULL_REPORTA full SCHUFA report about a person.
SCHUFA_SHORT_REPORTA short SCHUFA report about a person.
CREDIT_AGENCY_REPORTA report issued by a credit agency.
SHARE_HOLDERS_AGREEMENTA shareholder agreement.
SHAREHOLDERS_LISTA list of shareholders.
TRADING_LICENSEA trading license.
TRANSPARENCY_REGISTER_EXTRACTAn extract from the transparency register.
INVOICEAn invoice of any kind.
OTHERAny other type of document.
VIDEOA video of any kind.
VAT_CERTIFICATEVAT registration certificate.

IDnow status

The following table includes the possible values for the field status for the video identification process carried out by IDnow and the related description of each status.

StatusDescription
createdThe identification resource has been created for the customer.
pendingThe identification process has been triggered, and the video identification URL and reference have been generated. Redirect the customer to the URL to complete the identification.
pending_failedThe identification is currently under review by the provider. You cannot offer banking services to the customer at this stage.
successfulThe video identification was successful. The customer can be onboarded. Note that the customer's data might have been updated during the identification session.
abortedThe customer aborted the identification process. They can retry using the same URL.
canceledThe provider canceled the video identification. The customer should retry using the same URL.
failedThe identification was unsuccessful. You cannot onboard the customer or offer any banking services to them.
expiredThe identification link has expired (validity period passed). You must create a new identification request.

IDnow provides a reason whenever the identification has a canceled or aborted status. No reason is disclosed for the final failed status.