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.

Interswitch Recurring Payments API is one of 12 APIs that Interswitch publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

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

Tagged areas include Recurring, Subscriptions, Tokenization, Card On File, and Africa. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 1 Naftiko capability spec.

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