Monnify Direct Debit API

Create, activate, and debit recurring NIBSS direct-debit mandates against a customer's bank account. Smart routing uses TeamApt as the primary processor with NIBSS as fallback for improved success rates. Supports incomeSplit on mandate-debit to settle into multiple sub-accounts. Endpoints under /api/v1/direct-debit/mandate/ and /api/v1/direct-debit/mandate/debit.

Monnify Direct Debit API is one of 14 APIs that Moniepoint publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 2 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Direct Debit, Mandates, Recurring Payments, and NIBSS. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 2 Naftiko capability specs.

OpenAPI Specification

monnify-direct-debit-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Monnify Direct Debit API
  description: >
    Create, activate, and debit recurring NIBSS direct-debit mandates
    against a customer's bank account. Smart routing introduced in
    September 2025 uses TeamApt as the primary processor with NIBSS as
    fallback. As of April 2026 the debit endpoint accepts an incomeSplit
    object to settle a debited amount across multiple sub-accounts.
  version: '1.0'
  contact:
    name: Monnify Developer Support
    url: https://developers.monnify.com
servers:
  - url: https://api.monnify.com
    description: Production
  - url: https://sandbox.monnify.com
    description: Sandbox
security:
  - BearerAuth: []
tags:
  - name: Mandates
    description: Create and manage direct-debit mandates.
  - name: Debits
    description: Initiate debits against an active mandate.
paths:
  /api/v1/direct-debit/mandate:
    post:
      summary: Monnify Create Direct Debit Mandate
      operationId: createMandate
      tags: [Mandates]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateMandateRequest'
      responses:
        '200':
          description: Mandate created (pending activation).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MandateEnvelope'
  /api/v1/direct-debit/mandate/{mandateCode}:
    get:
      summary: Monnify Get Direct Debit Mandate
      operationId: getMandate
      tags: [Mandates]
      parameters:
        - name: mandateCode
          in: path
          required: true
          schema: { type: string }
      responses:
        '200':
          description: Mandate details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MandateEnvelope'
    delete:
      summary: Monnify Cancel Direct Debit Mandate
      operationId: cancelMandate
      tags: [Mandates]
      parameters:
        - name: mandateCode
          in: path
          required: true
          schema: { type: string }
      responses:
        '200':
          description: Mandate cancelled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MandateEnvelope'
  /api/v1/direct-debit/mandate/activation:
    post:
      summary: Monnify Activate Direct Debit Mandate
      description: Submit the activation code to move a mandate from PENDING to ACTIVATED.
      operationId: activateMandate
      tags: [Mandates]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [mandateCode, activationCode]
              properties:
                mandateCode: { type: string }
                activationCode: { type: string }
      responses:
        '200':
          description: Mandate activated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MandateEnvelope'
  /api/v1/direct-debit/mandate/debit:
    post:
      summary: Monnify Debit Direct Debit Mandate
      description: Debit a configured amount against an active mandate. Supports incomeSplit (April 2026).
      operationId: debitMandate
      tags: [Debits]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DebitMandateRequest'
      responses:
        '200':
          description: Debit accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DebitEnvelope'
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
  schemas:
    CreateMandateRequest:
      type: object
      required: [mandateDescription, mandateAmount, customerName, customerAccountNumber, customerBankCode, startDate, endDate]
      properties:
        mandateDescription: { type: string }
        mandateAmount: { type: number }
        customerName: { type: string }
        customerEmail: { type: string, format: email }
        customerPhoneNumber: { type: string }
        customerAccountNumber: { type: string }
        customerBankCode: { type: string }
        startDate: { type: string, format: date }
        endDate: { type: string, format: date }
        frequency: { type: string, enum: [DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, AD_HOC] }
        amountType: { type: string, enum: [FIXED, VARIABLE] }
        debitReference: { type: string }
        contractCode: { type: string }
    Mandate:
      type: object
      properties:
        mandateCode: { type: string }
        mandateDescription: { type: string }
        mandateAmount: { type: number }
        customerName: { type: string }
        customerAccountNumber: { type: string }
        customerBankCode: { type: string }
        status: { type: string, enum: [PENDING, FAILED, CANCELLED, ACTIVATED, EXPIRED] }
        frequency: { type: string }
        amountType: { type: string }
        startDate: { type: string, format: date }
        endDate: { type: string, format: date }
        dateCreated: { type: string, format: date-time }
    MandateEnvelope:
      type: object
      properties:
        requestSuccessful: { type: boolean }
        responseMessage: { type: string }
        responseCode: { type: string }
        responseBody: { $ref: '#/components/schemas/Mandate' }
    DebitMandateRequest:
      type: object
      required: [mandateCode, amount, debitReference, narration]
      properties:
        mandateCode: { type: string }
        amount: { type: number }
        debitReference: { type: string }
        narration: { type: string }
        incomeSplit:
          type: array
          description: Optional split of the debited amount across sub-accounts (April 2026).
          items:
            type: object
            properties:
              subAccountCode: { type: string }
              splitPercentage: { type: number }
              splitAmount: { type: number }
              feeBearer: { type: boolean }
    DebitEnvelope:
      type: object
      properties:
        requestSuccessful: { type: boolean }
        responseMessage: { type: string }
        responseCode: { type: string }
        responseBody:
          type: object
          properties:
            mandateCode: { type: string }
            debitReference: { type: string }
            amount: { type: number }
            transactionReference: { type: string }
            status: { type: string, enum: [SUCCESS, FAILED, PENDING] }
            dateCreated: { type: string, format: date-time }