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.
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.
Consumer loans are currently only offered to customers in Germany with at least one German bank account.
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.
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:
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.
The following sequence diagram outlines the integration flow for the Consumer Loans solution:
- 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:
| Stage | Step | Description |
|---|---|---|
| Registration | Step 1 (Optional) | Generate an anonymous loan offer. |
| Registration | Step 2 | Collect mandatory customer data, consent to legal requirements, and create a person resource. |
| Application | Step 3 | Create a credit record for the customer. |
| Application | Step 4 | Create a loan application with mandatory data points for the scorer. |
| Application | Step 5 | Create an account snapshot and link it to the loan application. |
| Contract | Step 6 | Send the SECCI form and final loan contract. |
| Identification | Step 7 | Trigger KYC and e-signing (IDnow). Ensure the customer is identified and passes risk screening. |
| Payout | Step 8 | Create the loan to trigger the payout. |
| Servicing | Step 9 | Implement loan servicing and maintenance endpoints. |
Subscribe to the following webhook events to automate your processes:
ACCOUNT_SNAPSHOTCONSUMER_LOAN_APPLICATIONIDENTIFICATIONPERSON_CHANGEDPERSON_DELETEDPERSON_MOBILE_NUMBER_CREATEDPERSON_MOBILE_NUMBER_DELETEDLOAN
Integrate all mandatory features for B2C Loans highlighted in the Onboarding requirements guide before going live.
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).
Call this endpoint to generate the offer.
Mandatory fields: The following fields are strictly required by the schema:
requested_loan_termrequested_loan_amountnumber_of_dependentsnet_income_amountliving_situation_amountliving_situationprivate_insurance_amount
Optional fields: Include these if available to improve scoring accuracy:
requested_emiexisting_credit_repayment_excluding_mortgage
Request URL
POST /v1/anonymous_consumer_loan_offersResponse
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.
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
- 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, andbirth_date. If you create over 1000 identical person resources, the API will return a400error. - Privacy: Do not use real personal data when testing in Sandbox.
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:
salutationfirst_namelast_nameemailmobile_numberbirth_datebirth_citybirth_countrynationalityemployment_statusaddress:line_1line_2(optional)postal_codecitycountry
tax_information:marital_status
terms_conditions_signed_atdata_terms_signed_atown_economic_interest_signed_at
Request URL
POST /v1/personsThis endpoint updates one or more properties on a person resource. You can only update the following properties using this endpoint:
titlesalutationaddress(line_1,line_2,postal_code,city,state,country)contact_address(line_1,line_2,postal_code,city,state,country)employment_statusjob_titleemailtax_information(tax_assessment,marital_status)fatca_relevantfatca_crs_confirmed_atbusiness_purposeindustryindustry_keyown_economic_interest_signed_ataml_confirmed_on(only with today or tomorrow's date)expected_monthly_revenue_centsvat_numberwebsite_social_mediabusiness_trading_namenace_codebusiness_address_line_1business_address_line_2business_postal_codebusiness_citybusiness_countryannual_income_rangedata_terms_signed_atbranchbirth_provincebirth_post_codesocioprofessional_categorypurpose_of_account_openingmain_income_sourcework_countrywork_provinceself_declared_as_pepinternational_operativity_expectationregistration_number
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_statustoFREELANCERorSELF_EMPLOYED, you must include one of the following in the request to avoid an error:- The customer's
nace_code(Recommended for data quality). - Set
industryandindustry_keytonull.
- The customer's
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" } }
Create a consumer credit record and link it to the customer's person resource.
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.
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.
To create a credit record, you must choose a source in the request body:
source: solarisBank(Automated) Solaris retrieves the customer's record directly from SCHUFA. This is the standard recommended process.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
filefield.
- Requirement: You must Base64-encode the file and pass the content in the
Endpoints:
Depending on your customer type, use one of the following endpoints:
Retail Customers
POST /v1/persons/{person_id}/credit_recordsFreelancers
POST /v1/freelancers/persons/{person_id}/credit_recordsCall 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.
Collect loan-specific information and create the 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_termrequested_loan_amountrepayment_day_of_monthprivate_insurance_amountnumber_of_dependentsnet_income_amountliving_situation_amountliving_situationmoved_in_last_two_yearscredit_record_idloan_purposepartner_reference_number
Financed goods properties: For loans financing a purchase, include:
cash_pricesellerfinanced_good
Request URL
POST /v1/persons/{person_id}/consumer_loan_applicationsScoring & Response
The system automatically scores the application:
Approved:
statusbecomesoffered. Returns a binding offer (amount, term, interest rate, installment).Rejected:
statusbecomesrejected.
Track the application lifecycle using this endpoint.
Request URL
GET /v1/persons/{person_id}/consumer_loan_applications/{application_id}💡 Webhook: Subscribe to
CONSUMER_LOAN_APPLICATIONto receive automatic updates whenever the application status changes (e.g., fromscreening_pendingtoapproved).
The following diagram illustrates the application status transitions:
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}/subsidizeCreate an account snapshot and link it to the application when the status is offered.
To skip this step and proceed directly to approved:
Request URL
PUT /v1/persons/{person_id}/consumer_loan_applications/{application_id}/skip_account_snapshotThe 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.
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_snapshotsUse this method to integrate the FTS wizard.
- Integrate the FTS wizard in your solution (see FTS Documentation).
- Call the endpoint with
source: FIN_TECH_SYSTEMS. Optionally, include theiban. - Use the returned
wizard_session_keyto initialize the FTS wizard. - 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 }
Use this method to integrate the FinX widget.
- Integrate the FinX widget (see FinX Documentation).
- Call the endpoint with
source: FINREACH. - Redirect the customer to the URL provided in the
locationfield.
Request:
{ "source": "FINREACH" }
Response:
{ "wizard_session_key": null, "location": "https://ui.solaris-i.prod.finleap.cloud?token=xxxxxx", "id": "8df2a8ba713c43dc9cb481b9cceed487snap", "account_id": null }
Use this method if you have your own connection to a third-party provider and want to upload the data directly.
- Set
sourcetoPARTNER. - 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": [ { … } ] } }
Use this method if the customer already has a Solaris account.
- Set
sourcetoSOLARISBANK. - Include the
account_idof the Solaris account.
Request:
{ "source": "SOLARISBANK", "account_id": "adc123a45d6d7cf8fbfeed537ba919d5cacc" }
Response:
{ "wizard_session_key": null, "location": null, "id": "0a3f28733f9a4842842aae2804f80eb4snap", "account_id": "adc123a45d6d7cf8fbfeed537ba919d5cacc" }
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_SNAPSHOTwebhook 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_SNAPSHOTwebhook to be notified when the snapshot is successfully created and verified.
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_contractYou must provide the customer with the Standard European Consumer Credit Information (SECCI) form and the final contract for review.
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_contractAfter 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}/contractThe customer must also sign a SEPA Direct Debit (SDD) mandate. See the SEPA Direct Debit guide for details.
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.
When the status is esign_pending, call GET Retrieve consumer loan application to obtain the signing_id.
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
IDENTIFICATIONwebhook. It will send a notification (e.g.,status: successful) when the customer completes the video interview.
After successful identification, retrieve the signed documents.
Request URL
GET /v1/persons/{person_id}/signings/{id}Document Types:
SIGNED_CONTRACTwithldocsuffix: Signed SDD mandate.SIGNED_CONTRACTwithcdocsuffix: Signed loan contract.
Download specific signed files to share with the customer.
Request URL
GET /v1/persons/{person_id}/documents/{id}/fileVerify the identification status is successful.
Request URL
GET /v1/persons/{person_id}/identifications/{id}Create the loan to trigger the payout when the application status is loan_creation_pending.
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_loanResponse
Returns the loan_id. The application status changes to loan_created.
Retrieve loan details, status, and overdue amounts.
Request URL
GET /v1/loans/{loan_id}💡 Webhook: Subscribe to the
LOANwebhook to track ongoing status changes during the loan lifecycle (e.g., repayments, overdue alerts).
Implement endpoints for servicing and maintaining consumer loans.
Implement these endpoints to manage the active loan lifecycle, including retrieving status, schedules, and history.
Key Endpoints:
- GET Retrieve a loan
- GET Index all loans
- GET Retrieve a loan schedule
- GET Retrieve repayment history
- GET Retrieve credit line mandate
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_scheduleCall 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_historyThe following guides and API references are relevant to the Consumer Loans integration:
- Consumer Loans API Reference
- Loan Servicing API Reference
- Video Identification Guide
- SEPA Transfers Overview
- SEPA Direct Debit Transfers
| Status | Description |
|---|---|
offered | Application passed initial scoring. |
account_snapshot_verification | Account snapshot required for final verification. |
approved | Application approved. |
esign_pending | Identification and e-signing triggered. signing_id is available. |
screening_pending | Undergoing internal risk screening. |
esign_failed | Identification failed. Trigger a new process. |
loan_creation_pending | Identification and screening successful. Ready for loan creation. |
loan_created | Loan created and payout triggered. |
rejected | Application rejected. |
deleted | Application deleted. |
expired | Application expired (credit record or snapshot validity exceeded). |
The following table includes the possible values for the field document_type and their descriptions.
| Enum | Description |
|---|---|
ANNUAL_FINANCIAL_STATEMENT | A business or company's annual financial statement. |
KYC_REPORT | The KYC report generated after successful customer identification. |
ID_DOCUMENT | A person's identification document, such as a passport or ID card. |
SIGNATURE | A signature sample. |
PICTURE | A picture or scanned document of any other type. |
QES_DOCUMENT | A document related to a Qualified Electronic Signature (QES). |
SIGNED_CONTRACT | A signed contract of any kind. |
SIGNED_QES_DOCUMENT | A document signed by a Qualified Electronic Signature (QES). |
REGISTER_APPLICATION | A document proving the application for registration (Gründungsurkunde), used for companies "in formation". |
REGISTER_CHECK | A register check. |
REGISTER_EXTRACT | A commercial register excerpt or similar document. |
FOUNDATION_DOCUMENT | The foundation document of a company or business. |
SCHUFA_COMPACT_REPORT | A compact SCHUFA report. |
SCHUFA_GWG_REPORT | A GWG (Money Laundering Act) SCHUFA report. |
SCHUFA_FULL_REPORT | A full SCHUFA report about a person. |
SCHUFA_SHORT_REPORT | A short SCHUFA report about a person. |
CREDIT_AGENCY_REPORT | A report issued by a credit agency. |
SHARE_HOLDERS_AGREEMENT | A shareholder agreement. |
SHAREHOLDERS_LIST | A list of shareholders. |
TRADING_LICENSE | A trading license. |
TRANSPARENCY_REGISTER_EXTRACT | An extract from the transparency register. |
INVOICE | An invoice of any kind. |
OTHER | Any other type of document. |
VIDEO | A video of any kind. |
VAT_CERTIFICATE | VAT registration certificate. |
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.
| Status | Description |
|---|---|
created | The identification resource has been created for the customer. |
pending | The 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_failed | The identification is currently under review by the provider. You cannot offer banking services to the customer at this stage. |
successful | The video identification was successful. The customer can be onboarded. Note that the customer's data might have been updated during the identification session. |
aborted | The customer aborted the identification process. They can retry using the same URL. |
canceled | The provider canceled the video identification. The customer should retry using the same URL. |
failed | The identification was unsuccessful. You cannot onboard the customer or offer any banking services to them. |
expired | The 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.