Loan Onboarding

Transfer approved loans from LOS to LMS using a single API call. Complete loan setup including borrower, business, bank details, and payment schedule.

Loan Onboarding

📘

Seamless LOS to LMS Transition

Once a loan application is approved in the Loan Origination System (LOS), you can onboard it to the Loan Management System (LMS) using a single API call. This process transfers all application data, sets up the loan account, and prepares it for funding.

The loan onboarding process bridges the gap between loan origination and loan servicing, enabling seamless transfer of approved applications from LOS to LMS for ongoing management.


Onboarding Overview

When a loan application is approved in LOS, it's ready to be onboarded to LMS. The onboarding process:

  • Transfers complete application data - Borrower, business, loan terms, and bank account information
  • Creates loan account - Sets up the loan in LMS with unique loan number
  • Generates payment schedule - Creates payment schedule based on loan terms
  • Prepares for funding - Loan status set to "Unfunded" until funding is processed

LOS to LMS Flow

%%{init: {'theme': 'base', 'themeVariables': {'background': '#ffffff', 'mainBkg': '#ffffff', 'clusterBkg': '#ffffff', 'clusterBorder': '#2563eb', 'titleColor': '#000000', 'primaryColor': '#2563eb', 'primaryTextColor': '#ffffff', 'lineColor': '#374151'}, 'flowchart': {'padding': 20, 'nodeSpacing': 25, 'rankSpacing': 35}}}%%
flowchart LR
    subgraph MainContainer[🔄 Loan Onboarding Flow]
        direction LR
        A[✅ Approved] --> B[🔄 Board API] --> C[🏦 Created] --> D[📅 Schedule] --> E[💵 Fund]
        
        style A fill:#059669,stroke:#047857,color:#fff
        style B fill:#d97706,stroke:#b45309,color:#fff
        style C fill:#059669,stroke:#047857,color:#fff
        style D fill:#2563eb,stroke:#1e40af,color:#fff
        style E fill:#2563eb,stroke:#1e40af,color:#fff
    end

Flow Steps:

  • Approved - Loan application approved in LOS
  • Board API - Single API call to onboard loan
  • Created - Loan account created in LMS
  • Schedule - Payment schedule generated
  • Fund - Loan ready for funding

Board Approved Loan API

The Board Approved Loan API is a single endpoint that transfers all application data from LOS to LMS and creates a complete loan setup.

Endpoint

POST /v1/lms-application-processor/application/submit/business/onboard

Request Structure

The API accepts a comprehensive payload that includes:

SectionDescriptionRequired
Loan DetailsProduct, amount, rate, termYes
Borrower InformationName, SSN, contact detailsYes
Business InformationBusiness name, EIN, addressConditional
Bank AccountAccount and routing numbersYes
Payment ScheduleFirst payment date, frequencyYes

Required Fields

Loan Details

FieldTypeRequiredDescription
AdditionalRefIdstringYesApplication number from LOS (e.g., APP-2024-001234)
LoanProductIdstringYesProduct identifier (e.g., termloan, loc)
ProductCategorystringYesBusiness or Consumer
ProductPortfolioTypestringYesInstallment, Revolving, or MCA
LoanAmountnumberYesTotal loan amount
InterestRatenumberYesAnnual interest rate percentage
TermintegerYesLoan term in months
LoanOnboardedDatedateYesDate loan is onboarded

Screenshots

📷

Screenshot: Loan Information Tab

This screenshot shows the Loan Information tab in LMS displaying detailed loan information including product, amount, rate, and term that correspond to the onboarding API payload.

Loan Information Tab

Borrower Information

FieldTypeRequiredDescription
FirstNamestringYesBorrower first name
LastNamestringYesBorrower last name
EmailstringYesEmail address
PhonestringYesPhone number
SSNstringYesSocial Security Number (masked)

Business Information (Business Loans)

FieldTypeRequiredDescription
BusinessNamestringYesLegal business name
EINstringYesEmployer Identification Number
AddressobjectYesBusiness address

Bank Account Details

FieldTypeRequiredDescription
BankNamestringYesBank name
AccountNumberstringYesBank account number
RoutingNumberstringYesBank routing number
AccountTypestringYesChecking or Savings

Payment Schedule

FieldTypeRequiredDescription
FirstPaymentDatedateYesDate of first scheduled payment
PaymentFrequencystringYesMonthly, Biweekly, Weekly

Complete Request Example

curl -X POST 'https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/submit/business/onboard' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "AdditionalRefId": "APP-2024-001234",
    "LoanProductId": "termloan",
    "ProductCategory": "Business",
    "ProductPortfolioType": "Installment",
    "LoanAmount": 50000,
    "InterestRate": 8.5,
    "Term": 36,
    "LoanOnboardedDate": "2024-01-15",
    "Comments": "Approved loan from LOS",
    "BusinessRequest": [
      {
        "BusinessName": "Acme Corp",
        "EIN": "12-3456789",
        "Address": {
          "AddressLine1": "123 Main St",
          "City": "New York",
          "State": "NY",
          "ZipCode": "10001"
        }
      }
    ],
    "ApplicantRequest": [
      {
        "FirstName": "John",
        "LastName": "Doe",
        "Email": "[email protected]",
        "Phone": "555-123-4567",
        "SSN": "***-**-1234"
      }
    ],
    "BankDetails": {
      "BankName": "Chase Bank",
      "AccountNumber": "****1234",
      "RoutingNumber": "021000021",
      "AccountType": "Checking"
    },
    "LoanScheduleRequest": {
      "FirstPaymentDate": "2024-02-15",
      "PaymentFrequency": "Monthly"
    }
  }'
const onboardLoan = async (applicationId, loanData) => {
  const url = 'https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/submit/business/onboard';
  
  const payload = {
    AdditionalRefId: applicationId,
    LoanProductId: loanData.productId,
    ProductCategory: loanData.category,
    ProductPortfolioType: 'Installment',
    LoanAmount: loanData.amount,
    InterestRate: loanData.rate,
    Term: loanData.term,
    LoanOnboardedDate: loanData.onboardDate,
    Comments: 'Approved loan from LOS',
    BusinessRequest: loanData.business ? [{
      BusinessName: loanData.business.name,
      EIN: loanData.business.ein,
      Address: {
        AddressLine1: loanData.business.address.line1,
        City: loanData.business.address.city,
        State: loanData.business.address.state,
        ZipCode: loanData.business.address.zipCode
      }
    }] : [],
    ApplicantRequest: [{
      FirstName: loanData.borrower.firstName,
      LastName: loanData.borrower.lastName,
      Email: loanData.borrower.email,
      Phone: loanData.borrower.phone,
      SSN: loanData.borrower.ssn
    }],
    BankDetails: {
      BankName: loanData.bank.name,
      AccountNumber: loanData.bank.accountNumber,
      RoutingNumber: loanData.bank.routingNumber,
      AccountType: loanData.bank.accountType
    },
    LoanScheduleRequest: {
      FirstPaymentDate: loanData.firstPaymentDate,
      PaymentFrequency: loanData.frequency
    }
  };
  
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(payload)
  });
  
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  
  return await response.json();
};

// Usage
const loanData = {
  productId: 'termloan',
  category: 'Business',
  amount: 50000,
  rate: 8.5,
  term: 36,
  onboardDate: '2024-01-15',
  firstPaymentDate: '2024-02-15',
  frequency: 'Monthly',
  business: {
    name: 'Acme Corp',
    ein: '12-3456789',
    address: {
      line1: '123 Main St',
      city: 'New York',
      state: 'NY',
      zipCode: '10001'
    }
  },
  borrower: {
    firstName: 'John',
    lastName: 'Doe',
    email: '[email protected]',
    phone: '555-123-4567',
    ssn: '***-**-1234'
  },
  bank: {
    name: 'Chase Bank',
    accountNumber: '****1234',
    routingNumber: '021000021',
    accountType: 'Checking'
  }
};

const result = await onboardLoan('APP-2024-001234', loanData);
console.log(`Loan created: ${result.loanId}`);
import requests

def onboard_loan(application_id, loan_data):
    url = "https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/submit/business/onboard"
    
    headers = {
        "Authorization": "Bearer YOUR_TOKEN",
        "Content-Type": "application/json"
    }
    
    payload = {
        "AdditionalRefId": application_id,
        "LoanProductId": loan_data["product_id"],
        "ProductCategory": loan_data["category"],
        "ProductPortfolioType": "Installment",
        "LoanAmount": loan_data["amount"],
        "InterestRate": loan_data["rate"],
        "Term": loan_data["term"],
        "LoanOnboardedDate": loan_data["onboard_date"],
        "Comments": "Approved loan from LOS",
        "BusinessRequest": loan_data.get("business", []),
        "ApplicantRequest": loan_data.get("applicants", []),
        "BankDetails": loan_data["bank_details"],
        "LoanScheduleRequest": {
            "FirstPaymentDate": loan_data["first_payment_date"],
            "PaymentFrequency": loan_data["frequency"]
        }
    }
    
    response = requests.post(url, json=payload, headers=headers)
    response.raise_for_status()
    return response.json()

# Usage
loan_data = {
    "product_id": "termloan",
    "category": "Business",
    "amount": 50000,
    "rate": 8.5,
    "term": 36,
    "onboard_date": "2024-01-15",
    "first_payment_date": "2024-02-15",
    "frequency": "Monthly",
    "bank_details": {
        "BankName": "Chase Bank",
        "AccountNumber": "****1234",
        "RoutingNumber": "021000021",
        "AccountType": "Checking"
    },
    "business": [{
        "BusinessName": "Acme Corp",
        "EIN": "12-3456789",
        "Address": {
            "AddressLine1": "123 Main St",
            "City": "New York",
            "State": "NY",
            "ZipCode": "10001"
        }
    }],
    "applicants": [{
        "FirstName": "John",
        "LastName": "Doe",
        "Email": "[email protected]",
        "Phone": "555-123-4567",
        "SSN": "***-**-1234"
    }]
}

result = onboard_loan("APP-2024-001234", loan_data)
print(f"Loan created: {result['loanId']}")
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import com.fasterxml.jackson.databind.ObjectMapper;

public class LoanOnboarding {
    private static final String BASE_URL = "https://api.demo.lms.lendfoundry.com/v1";
    private static final HttpClient client = HttpClient.newHttpClient();
    private static final ObjectMapper mapper = new ObjectMapper();
    
    public static String onboardLoan(String applicationId, LoanData loanData) throws Exception {
        String url = BASE_URL + "/lms-application-processor/application/submit/business/onboard";
        
        Map<String, Object> payload = new HashMap<>();
        payload.put("AdditionalRefId", applicationId);
        payload.put("LoanProductId", loanData.getProductId());
        payload.put("ProductCategory", loanData.getCategory());
        payload.put("ProductPortfolioType", "Installment");
        payload.put("LoanAmount", loanData.getAmount());
        payload.put("InterestRate", loanData.getRate());
        payload.put("Term", loanData.getTerm());
        payload.put("LoanOnboardedDate", loanData.getOnboardDate());
        payload.put("Comments", "Approved loan from LOS");
        payload.put("BusinessRequest", loanData.getBusiness());
        payload.put("ApplicantRequest", loanData.getApplicants());
        payload.put("BankDetails", loanData.getBankDetails());
        
        Map<String, Object> scheduleRequest = new HashMap<>();
        scheduleRequest.put("FirstPaymentDate", loanData.getFirstPaymentDate());
        scheduleRequest.put("PaymentFrequency", loanData.getFrequency());
        payload.put("LoanScheduleRequest", scheduleRequest);
        
        String requestBody = mapper.writeValueAsString(payload);
        
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("Authorization", "Bearer YOUR_TOKEN")
            .header("Content-Type", "application/json")
            .POST(BodyPublishers.ofString(requestBody))
            .build();
        
        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
        return response.body();
    }
}

Response Example

{
  "loanId": "LN-2024-001234",
  "applicationNumber": "APP-2024-001234",
  "status": "Unfunded",
  "borrowerName": "John Doe",
  "businessName": "Acme Corp",
  "loanAmount": 50000.00,
  "interestRate": 8.5,
  "term": 36,
  "createdDate": "2024-01-15T10:30:00Z",
  "schedule": {
    "firstPaymentDate": "2024-02-15",
    "frequency": "Monthly",
    "paymentAmount": 1578.32,
    "totalPayments": 36
  }
}

Loan Products Supported

LendFoundry supports multiple loan product types for onboarding:

%%{init: {'theme': 'base', 'themeVariables': {'background': '#ffffff', 'mainBkg': '#ffffff', 'clusterBkg': '#ffffff', 'clusterBorder': '#6b7280', 'titleColor': '#000000', 'primaryColor': '#2563eb', 'primaryTextColor': '#ffffff', 'lineColor': '#374151'}, 'flowchart': {'padding': 15, 'nodeSpacing': 25, 'rankSpacing': 30}}}%%
flowchart LR
    subgraph MainContainer[📦 Supported Loan Products]
        direction LR
        A[🏠 Term] --- B[💳 LOC] --- C[💼 MCA] --- D[🔗 SCF]
        
        style A fill:#2563eb,stroke:#1e40af,color:#fff
        style B fill:#2563eb,stroke:#1e40af,color:#fff
        style C fill:#2563eb,stroke:#1e40af,color:#fff
        style D fill:#2563eb,stroke:#1e40af,color:#fff
    end
Product TypeDescriptionPortfolio Type
Term LoansFixed-term installment loansInstallment
Line of CreditRevolving credit facilityRevolving
Merchant Cash AdvanceBusiness cash advanceMCA
Supply Chain FinancingSupply chain financingInstallment or Revolving

Post-Onboarding Status

After successful onboarding, the loan enters the LMS system with specific status and setup:

Loan Status

StatusDescriptionNext Action
CreatedLoan account createdReady for funding
UnfundedLoan created but not yet fundedProcess funding

Generated Schedule

The system automatically generates a payment schedule based on:

  • Loan amount and interest rate
  • Loan term (number of payments)
  • First payment date
  • Payment frequency

Funding Process

Once onboarded, the loan is ready for funding:

  1. Review loan details - Verify all information is correct
  2. Process funding - Disburse funds to borrower's bank account
  3. Loan becomes active - Status changes to "Funded" or "Active"

Retrieving Onboarded Loan

After onboarding, you can retrieve the loan using several methods:

Get Loan by Application Number

curl -X GET 'https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/APP-2024-001234' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const getLoanByApplication = async (applicationNumber) => {
  const url = `https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/${applicationNumber}`;
  
  const response = await fetch(url, {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer YOUR_TOKEN',
      'Content-Type': 'application/json'
    }
  });
  
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  
  return await response.json();
};

const loan = await getLoanByApplication('APP-2024-001234');
console.log(loan);
import requests

def get_loan_by_application(application_number):
    url = f"https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/{application_number}"
    headers = {
        "Authorization": "Bearer YOUR_TOKEN",
        "Content-Type": "application/json"
    }
    
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    return response.json()

loan = get_loan_by_application("APP-2024-001234")
print(loan)
public static String getLoanByApplication(String applicationNumber) throws Exception {
    String url = BASE_URL + "/lms-application-processor/application/" + applicationNumber;
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .header("Authorization", "Bearer YOUR_TOKEN")
        .header("Content-Type", "application/json")
        .GET()
        .build();
    
    HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
    return response.body();
}

Get Related Applications

Retrieve all applications related to a loan:

curl -X GET 'https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/LN-2024-001234/all/related' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const getRelatedApplications = async (loanNumber) => {
  const url = `https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/${loanNumber}/all/related`;
  
  const response = await fetch(url, {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer YOUR_TOKEN',
      'Content-Type': 'application/json'
    }
  });
  
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  
  return await response.json();
};

const relatedApps = await getRelatedApplications('LN-2024-001234');
console.log(relatedApps);
import requests

def get_related_applications(loan_number):
    url = f"https://api.demo.lms.lendfoundry.com/v1/lms-application-processor/application/{loan_number}/all/related"
    headers = {
        "Authorization": "Bearer YOUR_TOKEN",
        "Content-Type": "application/json"
    }
    
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    return response.json()

related_apps = get_related_applications("LN-2024-001234")
print(related_apps)
public static String getRelatedApplications(String loanNumber) throws Exception {
    String url = BASE_URL + "/lms-application-processor/application/" + loanNumber + "/all/related";
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .header("Authorization", "Bearer YOUR_TOKEN")
        .header("Content-Type", "application/json")
        .GET()
        .build();
    
    HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
    return response.body();
}

Screenshots

📷

Screenshot: Onboarded Loan in LMS

This screenshot shows an onboarded loan in the Loan Management System with loan details, status, and payment schedule information.

Onboarded Loan in LMS

Next Steps

ResourceDescription
Payment ProcessingLearn how to process payments for onboarded loans
Line of Credit OperationsUnderstand LOC operations and draw management
API ReferenceFull API documentation

Ready to Process Payments?

Once your loan is onboarded and funded, head to the Payment Processing Guide to learn how to handle payments.