Interswitch Lending API

Marketplace lending APIs connecting loan providers and distribution channels under `/lending-service/api/v1` — list providers, fetch offers (`GET /lending-service/api/v3/offers`), accept offers, fund loans, debit for repayment, and inspect customer loan status. Supports both PCI-DSS-licensed and hosted-fields integrations and powers Nano Loans, Salary Lending, and Value Financing.

OpenAPI Specification

interswitch-lending-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Interswitch Lending API
  description: |
    Marketplace lending APIs connecting loan providers and distribution
    channels — list providers, fetch offers, accept offers, fund loans, debit
    for repayment, and inspect customer loan status. Supports PCI-DSS-licensed
    and hosted-fields integrations and powers Nano Loans, Salary Lending, and
    Value Financing.
  version: '2024-01-01'
servers:
  - url: https://sandbox.interswitchng.com
    description: Sandbox
  - url: https://saturn.interswitchng.com
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Providers
  - name: Offers
  - name: Loans
  - name: Customers
  - name: Payments
paths:
  /lending-service/api/v1/offers/providers:
    get:
      tags: [Providers]
      summary: List Loan Providers
      operationId: listLoanProviders
      responses:
        '200':
          description: Available lenders.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    providerId: { type: string }
                    name: { type: string }
                    products: { type: array, items: { type: string } }
  /lending-service/api/v3/offers:
    get:
      tags: [Offers]
      summary: List Loan Offers For Customer
      operationId: listLoanOffers
      parameters:
        - in: query
          name: customerId
          required: true
          schema: { type: string }
        - in: query
          name: amount
          schema: { type: integer }
      responses:
        '200':
          description: Loan offers.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Offer' }
  /lending-service/api/v1/offers/{offerId}/accept:
    post:
      tags: [Offers]
      summary: Accept Loan Offer
      operationId: acceptLoanOffer
      parameters:
        - { in: path, name: offerId, required: true, schema: { type: string } }
      responses:
        '200':
          description: Loan created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Loan' }
  /lending-service/api/v1/loans/{loanId}/fund:
    post:
      tags: [Loans]
      summary: Fund Loan
      description: Disburse accepted loan funds to the borrower.
      operationId: fundLoan
      parameters:
        - { in: path, name: loanId, required: true, schema: { type: string } }
      responses:
        '200': { description: Funded. }
  /lending-service/api/v1/loans/{loanId}/debit:
    post:
      tags: [Loans]
      summary: Debit Loan Repayment
      operationId: debitLoanRepayment
      parameters:
        - { in: path, name: loanId, required: true, schema: { type: string } }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [amount]
              properties:
                amount: { type: integer }
                paymentMethodId: { type: string }
      responses:
        '200': { description: Debited. }
  /lending-service/api/v1/loans/{loanId}/update:
    put:
      tags: [Loans]
      summary: Update Loan Status
      operationId: updateLoanStatus
      parameters:
        - { in: path, name: loanId, required: true, schema: { type: string } }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [status]
              properties:
                status: { type: string, enum: [ACTIVE, CLOSED, DEFAULTED, WRITTEN_OFF] }
      responses:
        '200': { description: Updated. }
  /lending-service/api/v1/users/{customerId}/status:
    get:
      tags: [Customers]
      summary: Get Customer Loan Status
      operationId: getCustomerLoanStatus
      parameters:
        - { in: path, name: customerId, required: true, schema: { type: string } }
      responses:
        '200':
          description: Active loan summary.
          content:
            application/json:
              schema:
                type: object
                properties:
                  hasActiveLoan: { type: boolean }
                  activeLoans: { type: array, items: { $ref: '#/components/schemas/Loan' } }
  /lending-service/api/v1/users/{customerId}/payment-methods:
    get:
      tags: [Customers]
      summary: List Customer Payment Methods
      operationId: listCustomerPaymentMethods
      parameters:
        - { in: path, name: customerId, required: true, schema: { type: string } }
      responses:
        '200':
          description: Payment methods.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    paymentMethodId: { type: string }
                    type: { type: string, enum: [card, account] }
                    last4: { type: string }
  /lending-service/api/v2/payments/token:
    post:
      tags: [Payments]
      summary: Generate Lending Payment Token
      operationId: generateLendingPaymentToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [customerId, cardPan]
              properties:
                customerId: { type: string }
                cardPan: { type: string }
                expiryMonth: { type: string }
                expiryYear: { type: string }
                cvv: { type: string }
      responses:
        '200':
          description: Token + OTP challenge.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pendingToken: { type: string }
                  otpRequired: { type: boolean }
  /lending-service/api/v2/payments/token/validate:
    post:
      tags: [Payments]
      summary: Validate Lending Payment Token OTP
      operationId: validateLendingPaymentTokenOtp
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [pendingToken, otp]
              properties:
                pendingToken: { type: string }
                otp: { type: string }
      responses:
        '200':
          description: Confirmed token.
          content:
            application/json:
              schema:
                type: object
                properties:
                  paymentMethodId: { type: string }
                  status: { type: string }
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
  schemas:
    Offer:
      type: object
      properties:
        offerId: { type: string }
        providerId: { type: string }
        principal: { type: integer }
        currency: { type: string }
        interestRate: { type: number, format: float }
        tenorDays: { type: integer }
        productType: { type: string, enum: [NANO, SALARY, VALUE_FINANCING] }
    Loan:
      type: object
      properties:
        loanId: { type: string }
        customerId: { type: string }
        providerId: { type: string }
        principal: { type: integer }
        outstandingBalance: { type: integer }
        currency: { type: string }
        interestRate: { type: number, format: float }
        tenorDays: { type: integer }
        status: { type: string, enum: [PENDING, ACTIVE, CLOSED, DEFAULTED, WRITTEN_OFF] }
        disbursedAt: { type: string, format: date-time }
        dueAt: { type: string, format: date-time }