Application Lifecycle
Complete guide to loan application lifecycle from submission to decision, including status transitions and available actions
Application Lifecycle
Complete Application JourneyUnderstand how loan applications flow through the Loan Origination System from initial submission through final decision and onboarding to the Loan Management System.
The Loan Origination System (LOS) manages the complete lifecycle of loan applications, from the moment a borrower submits an application through final approval or rejection. This guide covers all application statuses, transitions, available actions, and how to integrate with the application workflow via API.
Application Lifecycle Overview
The application lifecycle follows a structured workflow designed to ensure thorough review and verification before making a lending decision. Applications progress through defined statuses, with specific actions available at each stage.
End-to-End Flow
%%{init: {'theme': 'base', 'themeVariables': {'background': '#ffffff', 'mainBkg': '#ffffff', 'clusterBkg': '#ffffff', 'clusterBorder': '#2563eb', 'titleColor': '#000000', 'primaryColor': '#2563eb', 'primaryTextColor': '#ffffff', 'lineColor': '#374151'}, 'flowchart': {'padding': 15, 'nodeSpacing': 25, 'rankSpacing': 30}}}%%
flowchart LR
subgraph MainContainer[📋 Application Lifecycle]
direction LR
A[📝 Submit] --> B[📄 Docs]
B --> C[🔍 Review]
C --> D{⚖️ Decide}
D -->|✅| E[✅ Approved]
D -->|❌| F[❌ Rejected]
E --> G[🚀 LMS]
end
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:#6b7280,stroke:#4b5563,color:#fff
style E fill:#059669,stroke:#047857,color:#fff
style F fill:#dc2626,stroke:#b91c1c,color:#fff
style G fill:#1e40af,stroke:#1e3a8a,color:#fff
Application Statuses
Applications progress through a series of statuses that reflect their current stage in the review process. Each status enables specific actions and determines what operations can be performed.
| Status | Description | Next Actions |
|---|---|---|
Submitted | Initial submission received | Review, Request Docs, Claim |
Pending Approval | Under review by back office | Approve, Reject, Request More Info |
Offer Generated | Loan offer created | Accept Offer, Reject Offer |
Pending Offer | Awaiting borrower acceptance | - (Borrower action required) |
Approved | Application approved | Onboard to LMS, Generate Documents |
Rejected | Application rejected | - (Terminal status) |
Not Interested | Borrower declined offer | - (Terminal status) |
Status Flow Diagram
%%{init: {'theme': 'base', 'themeVariables': {'background': '#ffffff', 'mainBkg': '#ffffff', 'clusterBkg': '#ffffff', 'clusterBorder': '#2563eb', 'titleColor': '#000000', 'primaryColor': '#2563eb', 'primaryTextColor': '#ffffff', 'lineColor': '#374151'}, 'flowchart': {'padding': 15, 'nodeSpacing': 20, 'rankSpacing': 25}}}%%
flowchart LR
subgraph MainContainer[🔄 Status Transitions]
direction LR
A[📝 Submitted] --> B[📋 Pending Approval]
B --> C[💼 Offer Generated]
C --> D[⏳ Pending Offer]
D --> E[✅ Approved]
B --> F[❌ Rejected]
D --> G[🚫 Not Interested]
E --> H[🚀 Onboard LMS]
end
style A fill:#2563eb,stroke:#1e40af,color:#fff
style B fill:#d97706,stroke:#b45309,color:#fff
style C fill:#2563eb,stroke:#1e40af,color:#fff
style D fill:#d97706,stroke:#b45309,color:#fff
style E fill:#059669,stroke:#047857,color:#fff
style F fill:#dc2626,stroke:#b91c1c,color:#fff
style G fill:#dc2626,stroke:#b91c1c,color:#fff
style H fill:#1e40af,stroke:#1e3a8a,color:#fff
Available Actions
At each stage of the application lifecycle, specific actions are available to manage and process the application. These actions are accessible via API endpoints.
| Action | Description | API Endpoint | Available Statuses |
|---|---|---|---|
| Edit Application | Update borrower details | PUT /applications/{id} | All statuses |
| Approve | Approve application | POST /applications/{id}/approve | Pending Approval |
| Reject | Reject with reason | POST /applications/{id}/reject | Pending Approval |
| Claim | Assign to self | POST /applications/{id}/claim | Submitted, Pending Approval |
| Release | Unassign application | POST /applications/{id}/release | Any assigned status |
| Assign | Assign to another user | POST /applications/{id}/assign | Submitted, Pending Approval |
| Escalate | Create escalation task | POST /escalations | Any status |
| Add Note | Add internal note | POST /applications/{id}/notes | All statuses |
| Do Not Contact | Flag as DNC | PUT /applications/{id}/doNotContact | All statuses |
Application Tabs and Sections
Each application contains multiple sections accessible via API endpoints. These sections provide detailed information about different aspects of the application.
| Tab | Data Available | API Endpoint |
|---|---|---|
| Borrower Information | Personal details, contact info | GET /applications/{id}/borrower |
| Owners/Officers | Business owners, officers | GET /applications/{id}/owners |
| Funding Info | Bank account details | GET /applications/{id}/funding |
| 3rd Party Data | Credit reports, external data | GET /applications/{id}/thirdParty |
| Offers | Loan offers generated | GET /applications/{id}/offers |
| Documents | Uploaded documents | GET /applications/{id}/documents |
| Notes | Internal notes and comments | GET /applications/{id}/notes |
| Status History | Complete audit trail | GET /applications/{id}/statusHistory |
API Operations
Get Application Details
Retrieve complete application information including current status, borrower details, and all associated data.
curl -X GET 'https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/APP-2024-001234' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json'const getApplication = async (applicationId) => {
const response = await fetch(
`https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/${applicationId}`,
{
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();
};import requests
def get_application(application_id):
url = f"https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/{application_id}"
headers = {
"Authorization": "Bearer YOUR_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.json()public String getApplication(String applicationId) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/" + applicationId))
.header("Authorization", "Bearer YOUR_TOKEN")
.header("Content-Type", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
return response.body();
}Approve Application
Approve an application that is pending approval. This action moves the application to the Approved status.
curl -X POST 'https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/APP-2024-001234/approve' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"approvalNotes": "All verifications passed",
"approvedAmount": 25000
}'const approveApplication = async (applicationId, approvalData) => {
const response = await fetch(
`https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/${applicationId}/approve`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify(approvalData)
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
};
// Usage
await approveApplication('APP-2024-001234', {
approvalNotes: 'All verifications passed',
approvedAmount: 25000
});import requests
def approve_application(application_id, approval_data):
url = f"https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/{application_id}/approve"
headers = {
"Authorization": "Bearer YOUR_TOKEN",
"Content-Type": "application/json"
}
response = requests.post(url, json=approval_data, headers=headers)
response.raise_for_status()
return response.json()
# Usage
approve_application('APP-2024-001234', {
'approvalNotes': 'All verifications passed',
'approvedAmount': 25000
})public String approveApplication(String applicationId, String requestBody) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/" + applicationId + "/approve"))
.header("Authorization", "Bearer YOUR_TOKEN")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
return response.body();
}Reject Application
Reject an application with a reason code. This action moves the application to the Rejected status (terminal).
curl -X POST 'https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/APP-2024-001234/reject' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"rejectionReason": "Insufficient income documentation",
"rejectionCode": "INCOME_01"
}'const rejectApplication = async (applicationId, rejectionData) => {
const response = await fetch(
`https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/${applicationId}/reject`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify(rejectionData)
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
};
// Usage
await rejectApplication('APP-2024-001234', {
rejectionReason: 'Insufficient income documentation',
rejectionCode: 'INCOME_01'
});import requests
def reject_application(application_id, rejection_data):
url = f"https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/{application_id}/reject"
headers = {
"Authorization": "Bearer YOUR_TOKEN",
"Content-Type": "application/json"
}
response = requests.post(url, json=rejection_data, headers=headers)
response.raise_for_status()
return response.json()
# Usage
reject_application('APP-2024-001234', {
'rejectionReason': 'Insufficient income documentation',
'rejectionCode': 'INCOME_01'
})public String rejectApplication(String applicationId, String requestBody) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/" + applicationId + "/reject"))
.header("Authorization", "Bearer YOUR_TOKEN")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
return response.body();
}Claim Application
Assign an application to yourself for review. This action is available for applications in Submitted or Pending Approval status.
curl -X POST 'https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/APP-2024-001234/claim' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json'const claimApplication = async (applicationId) => {
const response = await fetch(
`https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/${applicationId}/claim`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'Content-Type': 'application/json'
}
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
};import requests
def claim_application(application_id):
url = f"https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/{application_id}/claim"
headers = {
"Authorization": "Bearer YOUR_TOKEN",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers)
response.raise_for_status()
return response.json()public String claimApplication(String applicationId) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://loc.demo.kendra.lendfoundry.com/v1/darbaan/back-office/rest/api/applications/" + applicationId + "/claim"))
.header("Authorization", "Bearer YOUR_TOKEN")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
return response.body();
}Onboarding to LMS
When an application reaches the Approved status, it can be onboarded to the Loan Management System (LMS) for servicing. The application number serves as the linking key between LOS and LMS.
Seamless IntegrationApproved applications automatically transfer to LMS where they become active loans. The application number (
APP-YYYY-NNNNNN) links the origination record to the loan record in LMS.
Onboarding Process
- Application Approved - Application reaches
Approvedstatus in LOS - Data Transfer - Application data transfers to LMS via API
- Loan Creation - Loan record created in LMS with loan number (
LN-YYYY-NNNNNN) - Active Servicing - Loan becomes active and ready for payment processing
For detailed information about onboarding approved loans to LMS, see the Loan Onboarding Guide.
Screenshots
Screenshot: Application Details ViewThe application details page shows all information about a loan application, including borrower information, status, documents, and available actions.
Next Steps
| Resource | Description |
|---|---|
| Document Verification | Learn about verification workflows |
| Loan Onboarding | Onboard approved applications to LMS |
| API Reference | Complete API endpoint documentation |
Ready to Continue?Learn about Document Verification to understand how applications are verified before approval.
Updated 3 months ago
