Interswitch Recurring Payments API

Tokenize Verve, Visa, and Mastercard cards at `POST /api/v2/purchases/validations/recurrents` then charge them on schedule via `POST /api/v2/purchases/recurrents`. Token + expiry pair replaces raw PAN so subscription merchants stay outside PCI scope.

OpenAPI Specification

interswitch-recurring-payments-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Interswitch Recurring Payments API
  description: |
    Tokenize Verve, Visa, and Mastercard cards then charge them on schedule
    via a stored token + expiry pair. The token replaces the raw PAN so
    subscription merchants stay outside PCI scope.
  version: '2024-01-01'
servers:
  - url: https://qa.interswitchng.com
    description: Sandbox / QA
  - url: https://saturn.interswitchng.com
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Tokenization
  - name: Recurring Charges
paths:
  /api/v2/purchases/validations/recurrents:
    post:
      tags: [Tokenization]
      summary: Tokenize Card For Recurring
      description: Replace sensitive card data with a unique payment token that can be used for future recurring charges.
      operationId: tokenizeCardForRecurring
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [transactionRef, authData]
              properties:
                transactionRef: { type: string }
                authData: { type: string, description: Encrypted card payload. }
                customerId: { type: string }
                amount: { type: integer, description: Optional zero-value or minor-unit verification amount. }
                currency: { type: string }
      responses:
        '200':
          description: Token created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  token: { type: string }
                  tokenExpiryDate: { type: string, format: date }
                  cardBin: { type: string }
                  cardLast4: { type: string }
                  responseCode: { type: string }
  /api/v2/purchases/recurrents:
    post:
      tags: [Recurring Charges]
      summary: Charge Recurring Token
      operationId: chargeRecurringToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [customerId, amount, currency, token, tokenExpiryDate, transferRef]
              properties:
                customerId: { type: string }
                amount: { type: integer }
                currency: { type: string, enum: [NGN] }
                token: { type: string }
                tokenExpiryDate: { type: string, format: date }
                transferRef: { type: string }
      responses:
        '200':
          description: Charge result.
          content:
            application/json:
              schema:
                type: object
                properties:
                  paymentId: { type: string }
                  status: { type: string }
                  responseCode: { type: string }
                  responseMessage: { type: string }
                  amount: { type: integer }
                  authCode: { type: string }
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer