Flutterwave Payments API

Collect payments across cards, mobile money (M-Pesa, MTN, Airtel, Tigo), bank transfers, USSD, OPay, and virtual NUBANs. Includes customers, charges, payment methods, orchestrator helpers, orders, and virtual accounts. The primary surface for accepting money on Flutterwave.

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

This API exposes 5 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 3 JSON Schema definitions.

Tagged areas include Payments, Charges, Customers, Orders, and Virtual Accounts. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, a JSON-LD context, sample payloads, 5 Naftiko capability specs, and 3 JSON Schemas.

Documentation

Specifications

Examples

Schemas & Data

Other Resources

OpenAPI Specification

flutterwave-payments-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Flutterwave Payments API
  description: |
    Flutterwave v4 payment collection APIs covering customers, charges, payment
    methods, the Orchestrator helper, orders, and virtual accounts. Use these
    endpoints to accept card, mobile money, bank transfer, USSD and OPay
    payments across 30+ African and global markets.
  version: '4.0.0'
  contact:
    name: Flutterwave
    url: https://developer.flutterwave.com
    email: [email protected]
  license:
    name: Flutterwave Terms of Service
    url: https://flutterwave.com/us/terms
servers:
  - url: https://api.flutterwave.cloud/f4b/production
    description: Production
  - url: https://api.flutterwave.cloud/f4b/sandbox
    description: Sandbox
security:
  - OAuth2: []
tags:
  - name: Customers
    description: Create and manage customers that own charges, orders, and transfers.
  - name: Charges
    description: Create and manage charges across supported payment methods.
  - name: PaymentMethods
    description: Tokenize, register, and look up payment methods (cards, mobile money, bank, USSD).
  - name: Orchestration
    description: Orchestrator helpers that combine customer, payment method, and charge in one call.
  - name: Orders
    description: Server-side cart and order objects backing checkout sessions.
  - name: VirtualAccounts
    description: Issue virtual NUBANs for pay-with-bank-transfer collections.
paths:
  /customers:
    get:
      summary: List Customers
      description: Retrieve a paginated list of customers.
      operationId: listCustomers
      tags: [Customers]
      parameters:
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/IdempotencyKey'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerList'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
    post:
      summary: Create A Customer
      description: Create a new customer record.
      operationId: createCustomer
      tags: [Customers]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerRequest'
      responses:
        '201':
          description: Customer Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /customers/{id}:
    parameters:
      - $ref: '#/components/parameters/CustomerId'
    get:
      summary: Retrieve A Customer
      operationId: getCustomer
      tags: [Customers]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
    put:
      summary: Update A Customer
      operationId: updateCustomer
      tags: [Customers]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerRequest'
      responses:
        '200':
          description: Customer Updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
  /customers/search:
    post:
      summary: Search Customers
      operationId: searchCustomers
      tags: [Customers]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email: { type: string, format: email }
                phone_number: { type: string }
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerList'
  /charges:
    get:
      summary: List Charges
      operationId: listCharges
      tags: [Charges]
      parameters:
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargeList'
    post:
      summary: Create A Charge
      operationId: createCharge
      tags: [Charges]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChargeRequest'
      responses:
        '201':
          description: Charge Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Charge'
  /charges/{id}:
    parameters:
      - $ref: '#/components/parameters/ChargeId'
    get:
      summary: Retrieve A Charge
      operationId: getCharge
      tags: [Charges]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Charge'
    put:
      summary: Update A Charge
      operationId: updateCharge
      tags: [Charges]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                authorization: { type: object }
      responses:
        '200':
          description: Charge Updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Charge'
  /orchestration/direct-charges:
    post:
      summary: Initiate An Orchestrator Charge
      description: Create a charge in one call using the Orchestrator helper, which packages customer, payment method, and charge creation.
      operationId: initiateOrchestratorCharge
      tags: [Orchestration]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChargeRequest'
      responses:
        '201':
          description: Charge Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Charge'
  /orchestration/direct-orders:
    post:
      summary: Initiate An Order With Orchestrator
      description: Create an order in one call using the Orchestrator helper.
      operationId: initiateOrchestratorOrder
      tags: [Orchestration]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '201':
          description: Order Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
  /payment-methods:
    get:
      summary: List Payment Methods
      operationId: listPaymentMethods
      tags: [PaymentMethods]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentMethodList'
    post:
      summary: Create A Payment Method
      operationId: createPaymentMethod
      tags: [PaymentMethods]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PaymentMethodRequest'
      responses:
        '201':
          description: Payment Method Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentMethod'
  /payment-methods/{id}:
    parameters:
      - in: path
        name: id
        required: true
        schema: { type: string }
    get:
      summary: Retrieve A Payment Method
      operationId: getPaymentMethod
      tags: [PaymentMethods]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentMethod'
  /orders:
    get:
      summary: List Orders
      operationId: listOrders
      tags: [Orders]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderList'
    post:
      summary: Create An Order
      operationId: createOrder
      tags: [Orders]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '201':
          description: Order Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
  /orders/{id}:
    parameters:
      - in: path
        name: id
        required: true
        schema: { type: string }
    get:
      summary: Retrieve An Order
      operationId: getOrder
      tags: [Orders]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
    put:
      summary: Update An Order
      operationId: updateOrder
      tags: [Orders]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '200':
          description: Order Updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
  /virtual-accounts:
    get:
      summary: List All Virtual Accounts
      operationId: listVirtualAccounts
      tags: [VirtualAccounts]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAccountList'
    post:
      summary: Create A Virtual Account
      operationId: createVirtualAccount
      tags: [VirtualAccounts]
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VirtualAccountRequest'
      responses:
        '201':
          description: Virtual Account Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAccount'
  /virtual-accounts/{id}:
    parameters:
      - in: path
        name: id
        required: true
        schema: { type: string }
    get:
      summary: Retrieve A Virtual Account
      operationId: getVirtualAccount
      tags: [VirtualAccounts]
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAccount'
    put:
      summary: Update A Virtual Account
      operationId: updateVirtualAccount
      tags: [VirtualAccounts]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VirtualAccountRequest'
      responses:
        '200':
          description: Virtual Account Updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAccount'
components:
  securitySchemes:
    OAuth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://idp.flutterwave.com/realms/flutterwave/protocol/openid-connect/token
          scopes: {}
  parameters:
    Limit:
      in: query
      name: limit
      schema: { type: integer, minimum: 1, maximum: 100, default: 25 }
    Page:
      in: query
      name: page
      schema: { type: integer, minimum: 1, default: 1 }
    IdempotencyKey:
      in: header
      name: X-Idempotency-Key
      required: false
      description: UUID-style key used to safely retry POST requests.
      schema: { type: string, format: uuid }
    CustomerId:
      in: path
      name: id
      required: true
      schema: { type: string }
    ChargeId:
      in: path
      name: id
      required: true
      schema: { type: string }
  responses:
    ErrorResponse:
      description: Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      properties:
        status: { type: string }
        error:
          type: object
          properties:
            type: { type: string }
            code: { type: string }
            message: { type: string }
    Customer:
      type: object
      properties:
        id: { type: string }
        email: { type: string, format: email }
        name:
          type: object
          properties:
            first: { type: string }
            middle: { type: string }
            last: { type: string }
        phone:
          type: object
          properties:
            country_code: { type: string }
            number: { type: string }
        address:
          type: object
        meta: { type: object }
        created_datetime: { type: string, format: date-time }
    CustomerRequest:
      type: object
      required: [email]
      properties:
        email: { type: string, format: email }
        name: { type: object }
        phone: { type: object }
        address: { type: object }
        meta: { type: object }
    CustomerList:
      type: object
      properties:
        status: { type: string }
        data:
          type: array
          items: { $ref: '#/components/schemas/Customer' }
        meta: { type: object }
    PaymentMethod:
      type: object
      properties:
        id: { type: string }
        type:
          type: string
          enum: [card, mobile_money, bank_transfer, ussd, opay]
        card: { type: object }
        mobile_money: { type: object }
        bank_transfer: { type: object }
        client: { type: object }
        device_fingerprint: { type: string }
        created_datetime: { type: string, format: date-time }
    PaymentMethodRequest:
      type: object
      required: [type]
      properties:
        type: { type: string }
        card: { type: object, description: 'Encrypted card fields with `nonce`.' }
        mobile_money: { type: object }
        bank_transfer: { type: object }
        ussd: { type: object }
        opay: { type: object }
    PaymentMethodList:
      type: object
      properties:
        data:
          type: array
          items: { $ref: '#/components/schemas/PaymentMethod' }
    Charge:
      type: object
      properties:
        id: { type: string }
        amount: { type: number }
        currency: { type: string, example: NGN }
        status:
          type: string
          enum: [pending, succeeded, failed]
        reference: { type: string }
        customer: { $ref: '#/components/schemas/Customer' }
        payment_method: { $ref: '#/components/schemas/PaymentMethod' }
        processor_response:
          type: object
          properties:
            type: { type: string }
            code: { type: string }
        redirect_url: { type: string }
        meta: { type: object }
        created_datetime: { type: string, format: date-time }
    ChargeRequest:
      type: object
      required: [amount, currency, customer]
      properties:
        amount: { type: number }
        currency: { type: string }
        reference: { type: string }
        redirect_url: { type: string }
        customer: { type: object }
        payment_method: { type: object }
        meta: { type: object }
    ChargeList:
      type: object
      properties:
        data:
          type: array
          items: { $ref: '#/components/schemas/Charge' }
    Order:
      type: object
      properties:
        id: { type: string }
        amount: { type: number }
        currency: { type: string }
        status: { type: string }
        reference: { type: string }
        customer_id: { type: string }
        items:
          type: array
          items: { type: object }
        meta: { type: object }
    OrderRequest:
      type: object
      required: [amount, currency]
      properties:
        amount: { type: number }
        currency: { type: string }
        reference: { type: string }
        customer_id: { type: string }
        items:
          type: array
          items: { type: object }
        meta: { type: object }
    OrderList:
      type: object
      properties:
        data:
          type: array
          items: { $ref: '#/components/schemas/Order' }
    VirtualAccount:
      type: object
      properties:
        id: { type: string }
        account_number: { type: string }
        bank_name: { type: string }
        account_reference: { type: string }
        currency: { type: string, example: NGN }
        customer_id: { type: string }
        status: { type: string }
        amount: { type: number }
        expiry_datetime: { type: string, format: date-time }
        created_datetime: { type: string, format: date-time }
    VirtualAccountRequest:
      type: object
      required: [currency]
      properties:
        currency: { type: string }
        amount: { type: number }
        customer_id: { type: string }
        reference: { type: string }
        narration: { type: string }
        bvn: { type: string }
        is_permanent: { type: boolean }
        expiry: { type: integer, description: 'Expiry in minutes.' }
    VirtualAccountList:
      type: object
      properties:
        data:
          type: array
          items: { $ref: '#/components/schemas/VirtualAccount' }