Download OpenAPI specification:Download
Lending and investment API for mobile and USSD users
Authentication endpoints for the LentMe admin/ops portal. Adds CAPTCHA, login throttling, and lockout protections. Issues JWTs that the admin UI can use to access protected endpoints.
Username/password credentials.
| username | string or null The username (email recommended) of the admin/ops user. |
| password | string or null The plaintext password entered by the admin/ops user. |
{- "username": "string",
- "password": "string"
}Provides endpoints for verifying and linking bank accounts.
Secured for mobile users; ownership is enforced via the authenticated user's PublicId.
Bank account details to verify.
| userId | string <uuid> Gets or sets the unique identifier of the user to whom the bank account belongs. |
| accountNumber | string or null Gets or sets the bank account number. |
| bankCode | string or null Gets or sets the code of the bank to which the account belongs. Should match a valid entry in the LentMeAPI.Models.LentMeBank model. |
| accountName | string or null Gets or sets the name of the bank account holder. This is optional and may be null if auto-fetch is not available. |
{- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "accountNumber": "string",
- "bankCode": "string",
- "accountName": "string"
}| otpCode | string One-time password code provided by the user. |
Bank account details to link.
| userId | string <uuid> Gets or sets the unique identifier of the user to whom the bank account belongs. |
| accountNumber | string or null Gets or sets the bank account number. |
| bankCode | string or null Gets or sets the code of the bank to which the account belongs. Should match a valid entry in the LentMeAPI.Models.LentMeBank model. |
| accountName | string or null Gets or sets the name of the bank account holder. This is optional and may be null if auto-fetch is not available. |
{- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "accountNumber": "string",
- "bankCode": "string",
- "accountName": "string"
}API controller for managing bank API settings such as endpoint URLs and payloads. Restricted to admin/ops.
The bank setting data to be added.
| bankCode required | string [ 1 .. 10 ] characters Gets or sets the bank code to which this API setting applies. Must be a unique code matching the corresponding bank entity. |
| endpointName required | string [ 1 .. 100 ] characters Gets or sets the name of the API endpoint (e.g., "GetCustomerByAccount"). Used to identify the purpose of the API call. |
| url required | string non-empty Gets or sets the URL of the API endpoint used to perform bank operations. Can include placeholders like {accountNumber} for dynamic substitution. |
| payload | string or null Gets or sets the optional JSON payload to be sent in the request body for POST or PUT operations. This can be null if the endpoint uses query parameters or GET requests. |
{- "bankCode": "string",
- "endpointName": "string",
- "url": "string",
- "payload": "string"
}A list of bank setting DTOs to be added.
| bankCode required | string [ 1 .. 10 ] characters Gets or sets the bank code to which this API setting applies. Must be a unique code matching the corresponding bank entity. |
| endpointName required | string [ 1 .. 100 ] characters Gets or sets the name of the API endpoint (e.g., "GetCustomerByAccount"). Used to identify the purpose of the API call. |
| url required | string non-empty Gets or sets the URL of the API endpoint used to perform bank operations. Can include placeholders like {accountNumber} for dynamic substitution. |
| payload | string or null Gets or sets the optional JSON payload to be sent in the request body for POST or PUT operations. This can be null if the endpoint uses query parameters or GET requests. |
[- {
- "bankCode": "string",
- "endpointName": "string",
- "url": "string",
- "payload": "string"
}
]User-facing endpoints for loan disbursement.
Delegates to LentMeAPI.Services.Abstractions.IDisbursementService, which persists attempts to
LoanDisbursements and performs the bank call.
The disbursement request. The controller enforces ownership by overriding
UserId with the caller's PublicUserId from JWT.
The service should create a new row in LoanDisbursements (with a generated
business LoanId and unique ExternalReference), call the bank, and
update Status, ResponseBody, ResponseCode, and DisbursedAt.
| userId | string <uuid> Borrower/user identifier. |
| bankCode | string or null Beneficiary bank code (used to resolve endpoint/payload from BankSettings). |
| accountNumber | string or null Beneficiary account number to credit. |
| amount | number <double> Approved principal amount to disburse. |
| loanTerm | integer <int32> Loan term in months (e.g., 1, 3, or 6). |
| interestRate | number or null <double> Interest rate to apply for the term (e.g., 0.07, 0.09, 0.11). If null, the service will infer by term using platform defaults. |
| narration | string or null Optional narration/description shown on the transfer. |
| firstDueDateUtc | string or null <date-time> Optional first due date; if null, the schedule starts one month after disbursement date. |
{- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "bankCode": "string",
- "accountNumber": "string",
- "amount": 0.1,
- "loanTerm": 0,
- "interestRate": 0.1,
- "narration": "string",
- "firstDueDateUtc": "2019-08-24T14:15:22Z"
}Provides authentication and user account management endpoints (register, login, OTP, PIN reset), including device-binding and location step-up auth for mobile users. Uses LentMeAPI.Models.LentMeUser.PublicId (GUID) as the JWT subject and name identifier.
Public endpoint.
| phoneNumber | string or null Gets or sets the user's phone number. |
| firstName | string or null Gets or sets the user's first name. |
| lastName | string or null Gets or sets the user's last name. |
| gender | string or null Gets or sets the user's gender. |
| dateOfBirth | string <date-time> Gets or sets the user's date of birth. |
| address | string or null Gets or sets the user's physical address. |
| pin | string or null Gets or sets the PIN used for account security during registration. |
{- "phoneNumber": "string",
- "firstName": "string",
- "lastName": "string",
- "gender": "string",
- "dateOfBirth": "2019-08-24T14:15:22Z",
- "address": "string",
- "pin": "string"
}Public endpoint.
| phoneNumber required | string non-empty User's phone number. |
| pin required | string non-empty User's secret PIN. |
| deviceId | string or null Stable device identifier from the mobile app (e.g., vendor/device ID). |
| deviceModel | string or null Free-form device model (e.g., iPhone 13). |
| platform | string or null Platform/OS (e.g., iOS, Android 14). |
| latitude | number or null <double> Current latitude (optional). |
| longitude | number or null <double> Current longitude (optional). |
{- "phoneNumber": "string",
- "pin": "string",
- "deviceId": "string",
- "deviceModel": "string",
- "platform": "string",
- "latitude": 0.1,
- "longitude": 0.1
}Public endpoint.
| challengeId required | string <uuid> Challenge id returned from the login step. |
| code required | string [ 1 .. 10 ] characters 6-digit OTP code sent to the user's phone. |
{- "challengeId": "007cfdcc-a46d-4340-a4c6-216ec2e4009c",
- "code": "string"
}Public endpoint.
| phoneNumber | string or null Gets or sets the phone number to which the OTP should be sent. |
{- "phoneNumber": "string"
}Public endpoint.
| phoneNumber | string or null Gets or sets the phone number associated with the OTP. |
| code | string or null Gets or sets the OTP code provided by the user for verification. |
{- "phoneNumber": "string",
- "code": "string"
}Public endpoint.
| phoneNumber | string or null Gets or sets the phone number to which the OTP should be sent. |
{- "phoneNumber": "string"
}Public endpoint.
| phoneNumber | string or null Gets or sets the phone number associated with the OTP. |
| code | string or null Gets or sets the OTP code provided by the user for verification. |
{- "phoneNumber": "string",
- "code": "string"
}Public endpoint.
| resetToken required | string non-empty Short-lived JWT issued after successful OTP verification for PIN reset. |
| newPin required | string [ 4 .. 6 ] characters The new 4–6 digit PIN to set on the user's account. |
{- "resetToken": "string",
- "newPin": "string"
}| include | string |
| loansPage | integer <int32> Default: 1 |
| loansPageSize | integer <int32> Default: 10 |
| scheduleLimit | integer <int32> Default: 3 |
Provides endpoints for creating, updating, and resolving banks. Write operations require admin/ops. Read endpoints are open.
Bank to create.
| id | integer <int32> Gets or sets the primary key. |
| bankCode required | string [ 1 .. 20 ] characters Gets or sets the unique bank code used to identify the bank (e.g., SKYE01, ACC01). |
| bankName required | string [ 1 .. 100 ] characters Gets or sets the name of the bank (e.g., "Access Bank", "Skye Bank"). |
{- "id": 0,
- "bankCode": "string",
- "bankName": "string"
}List of banks to create.
| id | integer <int32> Gets or sets the primary key. |
| bankCode required | string [ 1 .. 20 ] characters Gets or sets the unique bank code used to identify the bank (e.g., SKYE01, ACC01). |
| bankName required | string [ 1 .. 100 ] characters Gets or sets the name of the bank (e.g., "Access Bank", "Skye Bank"). |
[- {
- "id": 0,
- "bankCode": "string",
- "bankName": "string"
}
]| id required | integer <int32> Bank ID. |
Updated bank data.
| id | integer <int32> Gets or sets the primary key. |
| bankCode required | string [ 1 .. 20 ] characters Gets or sets the unique bank code used to identify the bank (e.g., SKYE01, ACC01). |
| bankName required | string [ 1 .. 100 ] characters Gets or sets the name of the bank (e.g., "Access Bank", "Skye Bank"). |
{- "id": 0,
- "bankCode": "string",
- "bankName": "string"
}Verifies OTPs for the bank account linking step. Requires an authenticated mobile user; the OTP is validated strictly against the caller's phone number from the JWT.
Contains the OTP code (the phone in this DTO is ignored).
| phoneNumber | string or null Gets or sets the phone number associated with the OTP. |
| code | string or null Gets or sets the OTP code provided by the user for verification. |
{- "phoneNumber": "string",
- "code": "string"
}Loan evaluation request DTO.
| userId required | string <uuid> Unique identifier of the loan applicant (borrower public GUID). |
| requestedLoanAmount required | number <double> >= 0.01 Requested loan amount by the applicant. |
| loanTerm required | integer <int32> [ 1 .. 480 ] Duration of the loan in months (e.g., 1, 3, 6, 12). |
| accountNumber required | string [ 5 .. 64 ] characters Applicant's bank account number used for deposit history analysis. |
| isReturningCustomer | boolean Indicates whether the applicant is a returning customer. |
| previousLoanPaid | boolean or null Indicates if the applicant previously repaid a loan (used for returning customers). |
| monthlyDeposits | Array of numbers or null <double> [ items <double > ] Historical deposit amounts per month (used if external data not available). |
{- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "requestedLoanAmount": 0.01,
- "loanTerm": 1,
- "accountNumber": "string",
- "isReturningCustomer": true,
- "previousLoanPaid": true,
- "monthlyDeposits": [
- 0.1
]
}Loan application details supplied by the client.
| userId | string <uuid> Borrower/user identifier. |
| accountNumber | string or null Beneficiary account number (must be the user's linked bank account). The bank code will be resolved from the linkage; do not send it here. |
| amount | number <double> Principal amount requested by the user. |
| loanTerm | integer <int32> Loan term in months (e.g., 1, 3, or 6). |
| firstDueDateUtc | string or null <date-time> Optional first due date (UTC). If null, schedule begins one month after disbursement. |
{- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "accountNumber": "string",
- "amount": 0.1,
- "loanTerm": 0,
- "firstDueDateUtc": "2019-08-24T14:15:22Z"
}Reconciliation endpoints for operators: list/export unmatched legs, retry failed legs, and mark manual matches.
| fromUtc | string <date-time> Start of window (UTC). Defaults to 30 days ago. |
| toUtc | string <date-time> End of window (UTC). Defaults to now. |
| legId required | string <uuid> Identifier of the leg to mark. |
Request with deposit Id and optional note.
| depositId | string <uuid> Identifier of the deposit transaction chosen by an operator. |
| note | string or null Optional operator note (reason/context). |
{- "depositId": "33504022-daeb-4ddf-96f2-fc15aa4e6a52",
- "note": "string"
}| userId required | string <uuid> Borrower identifier. |
| loanId | string <uuid> Optional loan identifier. |
Administrative endpoints for creating surveys, inviting waitlisted users, and collecting responses.
Survey title, description, and questions/options.
| title | string or null |
| description | string or null |
Array of objects or null (SurveyQuestionDto) |
{- "title": "string",
- "description": "string",
- "questions": [
- {
- "prompt": "string",
- "type": "string",
- "order": 0,
- "options": [
- {
- "label": "string",
- "value": "string",
- "order": 0
}
]
}
]
}| id required | integer <int64> Survey id. |
Invitation preferences and filters.
| surveyId | integer <int64> |
| channel | string or null |
| onlyVerified | boolean |
{- "surveyId": 0,
- "channel": "string",
- "onlyVerified": true
}| id required | integer <int64> Survey id. |
| t | string Optional invite token provided in the link. |
Answers keyed by QuestionId.
| waitlistEntryId | integer <int64> |
Array of objects or null (SurveyAnswerDto) |
{- "waitlistEntryId": 0,
- "answers": [
- {
- "questionId": 0,
- "value": "string"
}
]
}Public endpoints to join and verify the LentMe waitlist. Mirrors LentMeUser fields for seamless conversion at launch.
Signup payload mirroring LentMeUser fields plus consent and source.
| phoneNumber | string or null |
| firstName | string or null |
| lastName | string or null |
| gender | string or null |
| dateOfBirth | string <date-time> |
| address | string or null |
| consentMarketing | boolean Explicit opt-in to receive communications. |
| source | string or null Attribution source (optional). |
{- "phoneNumber": "string",
- "firstName": "string",
- "lastName": "string",
- "gender": "string",
- "dateOfBirth": "2019-08-24T14:15:22Z",
- "address": "string",
- "consentMarketing": true,
- "source": "string"
}PublicId or internal ID (per DTO) plus the OTP code.
| waitlistEntryId | integer <int64> |
| code | string or null |
{- "waitlistEntryId": 0,
- "code": "string"
}| waitlistEntryId required | integer <int64> Internal numeric ID of the waitlist entry. |
| reason | string Optional reason for unsubscribing. |