This guide explains the integration process of Solaris' Fronting Loan product for retail customers (Consumers) as a standalone solution, including the mandatory information you must collect from your customers and the necessary endpoints and webhooks you must integrate into your solution.
Consumer fronting loans are currently only available for customers in Germany with a German bank account.
Check the overview page for more details on the product specifications.
Your customers can apply for a fronting loan by completing the following steps:
- Application: The customer applies for a loan on your frontend and provides the mandatory information.
- Consent: The customer consents to Solaris' terms and conditions and the credit scoring process (SCHUFA).
- Approval: If the application is approved, the customer must complete the identification process and sign the loan contract.
- Payout: The loan amount will be credited to their account immediately.
Before integrating Solaris' Consumer Fronting Loans, you must 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.
Solaris recommends subscribing to the following webhook events to better automate your processes:
IDENTIFICATION: The status of a person identification has changed.IDENTIFICATION_ORIGINATION: Triggered when the identification origination status changes and the payload includes thesigning_idand/oridentification_id, needed to trigger the identification flow.PERSON_CHANGED: One or more attributes of the person object changed.PERSON_DELETED: Solaris deletes all personal data related to the given person from its system according to GDPR regulations. You are legally required to delete all personal information related to the customer specified in the payload as soon as you receive this webhook notification.ACCOUNT_SNAPSHOT: The status of a customer's account snapshot has changed.CONSUMER_FRONTING_APPLICATION: Triggered when the status of the consumer loan application changes.
The following sequence diagram gives an overview of the integration flow for the Consumer Fronting Loans solution:

Integrate Solaris' Consumer Fronting Loans by completing the following steps:
| Category | Step | Description |
|---|---|---|
| Registration | Step 1 | Collect data and create a person resource. |
| Credit | Step 2 | Create a credit record (SCHUFA). |
| Application | Step 3 | Create the loan application. |
| Snapshot | Step 4 | Create and link an account snapshot (if required). |
| Docs | Step 5 | Upload and link supporting documents. |
| ID & Sign | Step 6 | Complete video identification and QES signing. |
| Payout | Step 7 | Trigger the loan payout. |
Note: After the loan payout, Solaris immediately sells the loan's contract and receivables back to you (or your investors). Solaris does not perform any loan servicing, dunning, or collection.
You must integrate all mandatory features for Consumer Fronting highlighted in the Onboarding requirements guide before going live.
The customer must provide the mandatory data points in your sign-up flow, including all the timestamps of the customer's consent to the legal and compliance screens. Afterward, pass all the data points to Solaris by creating a person resource to represent your customer.
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/personsIn this step, you must create a consumer credit record and link it to the person resource of the relevant customer.
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.
After collecting the mandatory personal information and creating a person resource, you must collect additional information related to the loan application and pass it to Solaris using the following endpoint.
This endpoint creates a consumer fronting loan application. The application includes all required information (applicant info, credit record, loan terms, IBAN) which Solaris' credit scorer uses to initiate credit checks.
Mandatory Properties:
SEPA References:
transaction_description: Reference visible to the recipient. Constraint: SEPA characters only.transaction_end_to_end_id: ID routed through the payment process. Constraint: String, max 35 characters, no whitespace.
Loan Terms:
requested_loan_amount,requested_loan_term,requested_interest_rate.repayment_day_of_month: Day for monthly installments.loan_purpose: Reason for the application.
Recipient Details:
recipient_name&recipient_iban: Payout destination.partner_snapshot_allowed: (boolean) Determines if a partner snapshot is required.
Financial & Scoring Data:
net_income_amount: Monthly net income object.living_situation: Housing status (e.g.,LIVING_IN_RENTED_HOUSE).living_situation_amount: Monthly housing costs object.existing_credit_repayment_excluding_mortgage: Other debt obligations object.private_insurance_amount: Monthly insurance costs (Default:0).number_of_kids: Children under 18 (Default:0).credit_record_id: The ID of the credit record created for the customer.
Request URL
POST /v1/consumers/persons/{person_id}/fronting_loan_applicationsResponse example
{ "account_snapshot_id": null, "agio": 0, "credit_record_id": "fbb7d15fa4c54ba0b077592665ef04a4ccrd", "decision": "OFFERED", "id": "bed381b116074b948f5c7619c60b53cacfla", "partner_snapshot_allowed": true, "person_id": "c32a42cbf2ed71fff0c29303b6efff2bcper", "recipient_iban": "DE92370601930002130041", "requested_interest_rate": 0.04, "requested_loan_amount": { "currency": "EUR", "unit": "cents", "value": 10000 }, "requested_loan_term": 6, "status": "account_snapshot_pending" }
This endpoint returns the current status and details of an existing consumer fronting loan application.
Request URL
GET /v1/consumers/persons/{person_id}/fronting_loan_applications/{application_id}For a list of possible values of the application status and their descriptions, check the appendix.
In this step, you must create an account snapshot for the customer and link it to their consumer loan application. Complete this step only if the field partner_snapshot_allowed is set to true.
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.
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.
After creating an account snapshot, use this endpoint to link it to the application. You must add the account_snapshot_id in the request body.
After linking, the application status changes to scoring_pending.
Request example
{ "account_snapshot_id": "0a3f28733f9a4842842aae2804f80eb4snap" }
In this step, you must upload the required documents and link them to the consumer fronting loan application. The necessary documents are agreed upon with Solaris' credit risks team and legal team during the project phase (e.g., proof of income).
You have to make a separate API call for each document.
For a complete list of endpoints, properties, and examples related to the person document resource, visit the following links:
This endpoint uploads a document and links it to the person with the person_id specified in the request URL.
You have to add the following properties to the request body:
document_type: The document type. For a list of possible values, check the appendices section.file: The file to be uploaded.
:::note The request body of this endpoint is a multipart/form-data content type and parameters are transmitted as form-data and not as a raw JSON string. :::
Request URL
POST /v1/persons/{person_id}/documents
# request parameters
..
Content-Disposition: form-data; name="file"; filename="filename.png"
Content-Type: image/png
..
Content-Disposition: form-data; name="document_type"
OTHER
..Click here to view the full API reference
After linking the required resources, Solaris' credit scoring system analyzes the application data, financial information, and transaction history to assess creditworthiness.
Outcomes:
Identification Required (Standard):
- If the application passes scoring, the status transitions to
offered. - Proceed to Step 6.
- If the application passes scoring, the status transitions to
Identification Skipped (Existing Customer):
- If the customer is already identified (and no new identification is required), the status directly transitions to
accepted. - You can skip Step 6 and trigger the loan payout immediately in Step 7.
- If the customer is already identified (and no new identification is required), the status directly transitions to
Rejected:
- If the application fails scoring, the status transitions to
rejected. - Action: Notify the customer of the rejection.
- If the application fails scoring, the status transitions to
Regardless of the identification route, you must generate the loan offer and send it to the customer. You must collect their explicit acceptance of the loan agreement before triggering the payout.
In this step, you must prompt the customer to complete the identification process via a video identification session (IDnow). During this session, an agent will verify the customer's data and collect the customer's qualified electronic signature (QES) on the loan contract.
This endpoint creates a customer identification for the purpose of issuing the loan. It also triggers the e-signing process for the QES.
Request example
{ "method": "idnow", "additional_documents": [ { "signature_position": { … }, "identifier": "XXXX", "document_id": "69ec2a9d8dbaf5ea1b13124098a34ea3cdoc" } ] }
Response: Returns an identification_origination_id. Status is initially identification_trigger_pending.
Link the identification resource to the loan application. The status transitions to identification_trigger_pending.
Request example
{ "identification_origination_id": "589e12da53154010ad180894acbe07ebio" }
Call this endpoint to check the identification_origination_status and get the esigning_id and identification_id required to prompt your customer to complete the process.
Once the identification flow is created, the loan application status transitions to identification_pending.
Request URL
GET /v1/identification_origination/persons/{person_id}/identifications/{identification_origination_id}For a list of possible values of the status of the identification origination and their descriptions, check the appendix.
Use the identification_id to get the video identification details, such as the IDnow reference and url. Redirect the customer to this URL.
Request URL
GET /v1/persons/{person_id}/signings/{id}For a list of possible values of the status of the IDnow process and their descriptions, check the appendix.
After successful identification (status: successful), call this endpoint to retrieve the signed documents.
Request URL
GET /v1/persons/{person_id}/signings/{id}The loan-related documents will have a document_type value of SIGNED_CONTRACT. You can distinguish them by the document ID suffix:
_ldoc: Indicates a signed SDD mandate._cdoc: Indicates a signed Loan Contract.
After the identification and e-signing reaches the status successful (or if ID was skipped), trigger the loan payout. The fronting application status must be set to accepted before you can proceed.
This endpoint triggers the transfer from the Solaris settlement account to the customer.
Request example
{ "settlement_account_iban": "DE07110101014503906016" }
Response: Returns loan_id and status payout_pending.
Retrieve loan details and track the CONSUMER_FRONTING_LOAN_PAYOUT webhook.
Request URL
GET /v1/consumers/persons/{person_id}/fronting_loans/{loan_id}See Appendix I for a full list of status values and descriptions.
After triggering payout, you must execute the following transfers:
- Payout: Solaris transfers funds from the Settlement Account -> Customer Account.
- Agio (If applicable): Solaris transfers the agio (commission) from the Settlement Account -> Your Collection Account.
- Settlement: You must transfer the full loan amount (Net + Agio) from Your Collateral Account -> Solaris Settlement Account.
- Sale: Solaris sells back the loan agreement and receivables to you (or other investors).
The loan payout amount must equal the minimum balance of the collateral account. Otherwise, the payout will fail.
When all transfers complete, the status changes to payout_issued.
- Consumer Fronting API Reference
- Identification Origination API Reference
- Video Identification Guide
- SEPA Transfers Guide
| Status | Description |
|---|---|
account_snapshot_pending | If partner_snapshot_allowed is true, status is account_snapshot_pending until you link a snapshot. |
binding_offer_scoring_pending | If partner_snapshot_allowed is false, status is binding_offer_scoring_pending. Scoring follows. |
scoring_pending | An account snapshot has been linked. Credit scoring is in progress. |
offered | Scoring passed. Identification is pending. |
identification_trigger_pending | Identification resource linked. |
identification_pending | Identification flow triggered. Waiting for customer action. |
accepted | Identification successful (or skipped). Application approved. |
rejected | Scoring or Identification failed. |
expired | Application expired (time limit exceeded). |
loan_created | Payout triggered. |
| Status | Description |
|---|---|
payout_pending | Payout triggered. |
payout_issued | Transfers completed. Money sent to customer. |
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. |
- List of accepted passports for video identification via IDnow: here
- List of accepted passports for postIdent: here
- Search for an identification document: here
The following table lists all ID types that include the bearer's address, which you can use to perform identification without having to provide a proof of address document.
| Document | Issuer Country | Type (ID/PP) |
|---|---|---|
| BGR-AO-01005 | Bulgaria | Passport |
| CHN-AO-04003 | China | Passport |
| HRV-BO-02001 | Croatia | ID |
| HRV-AO-02001 | Croatia | Passport |
| CZE-BO-04001 | Czech Republic | ID |
| CZE-BO-04002 | Czech Republic | ID |
| FRA-BO-02002 | France | ID |
| FRA-AO-03001-03003 | France | Passport |
| DEU-BO-01003 | Germany | ID |
| DEU-BO-02001 | Germany | ID |
| IND-AO-01001 | India | Passport |
| ITA-BO-04003 | Italy | ID |
| ITA-BO-03004 | Italy | ID |
| ITA-BO-03002 | Italy | ID |
| ITA-BO-03001 | Italy | ID |
| ITA-BO-03003 | Italy | ID |
| MLT-BO-02001 | Malta | ID |
| MLT-BO-03001 | Malta | ID |
| MAR-AO-02001 | Morocco | Passport |
| POL-BO-02001-02003 | Poland | ID |
| SGP-BO-01001-A | Singapore | ID |
| SGP-BO-01001 | Singapore | ID |
| SVK-BO-02001 | Slovakia | ID |
| SVK-BO-05001 | Slovakia | ID |
| SVK-BO-04001 | Slovakia | ID |
| SVN-AO-02001-02003 | Slovenia | Passport |
| SVN-AO-02004 | Slovenia | Passport |
| SVN-BO-02001 | Slovenia | ID |
| SVN-AO-01004 | Slovenia | Passport |
| ESP-BO-03001 | Spain | ID |
| ESP-BO-05001 | Spain | ID |
| Status | Description |
|---|---|
identification_trigger_pending | The identification origination resource has been created, which triggers both the video identification and e-signing process. |
esign_pending | The e-signing process has been generated. You have to call the GET identification origination method to get the identification_id and the esigning_id you need to prompt your customers to complete both processes. |
identification_completion_pending | The customer's identification process must be completed. You have to obtain the video identification URL by calling the GET signing method using the esigning_id and redirect your customer to complete the video identification with IDnow. |
screening_pending | The customer has completed the video identification and e-signing and Solaris is performing the customer's screening and risk checks. |
failed | The customer's e-signing or identification or risk screening has failed. |
completed | The customer identification process is successful. |
expired | The customer identification has expired, i.e., the customer has failed to complete the required identification steps within the specifed period. |
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.