Paystack Products and Payment Pages API

Manage products in your Paystack inventory and assemble them into Paystack-hosted Payment Pages so you can collect payments without operating your own checkout.

Paystack Products and Payment Pages API is one of 13 APIs that Paystack 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 Hosted Checkout, Products, and Pages. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 1 Naftiko capability spec.

OpenAPI Specification

paystack-products-pages-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Paystack Products and Payment Pages API
  description: Create and manage products in your inventory and Paystack-hosted Payment Pages so you can collect payments
    without writing custom checkout code.
  version: 1.0.0
  contact:
    name: Paystack Support
    url: https://support.paystack.com
    email: [email protected]
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.paystack.co
  description: Base API endpoint
tags:
- name: Product
- name: Page
paths:
  /product:
    post:
      tags:
      - Product
      summary: Create Product
      operationId: product_create
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1product/post/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              required:
              - name
              - description
              - price
              - currency
              properties:
                name:
                  description: Name of product
                  type: string
                description:
                  description: The description of the product
                  type: string
                price:
                  description: Price should be in kobo if currency is NGN, pesewas, if currency is GHS, and cents, if currency
                    is ZAR
                  type: integer
                currency:
                  description: 'Currency in which price is set. Allowed values are: NGN, GHS, ZAR or USD'
                  type: string
                limited:
                  description: Set to true if the product has limited stock. Leave as false if the product has unlimited stock
                  type: boolean
                quantity:
                  description: Number of products in stock. Use if limited is true
                  type: integer
      responses:
        '201':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    get:
      tags:
      - Product
      summary: List Products
      operationId: product_list
      parameters:
      - name: perPage
        in: query
        schema:
          type: integer
      - name: page
        in: query
        schema:
          type: integer
      - name: active
        in: query
        schema:
          type: boolean
      - in: query
        name: from
        schema:
          type: string
          format: date-time
        description: The start date
      - in: query
        name: to
        schema:
          type: string
          format: date-time
        description: The end date
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
  /product/{id}:
    get:
      tags:
      - Product
      summary: Fetch Product
      operationId: product_fetch
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    put:
      tags:
      - Product
      summary: Update Product
      operationId: product_update
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1product~1%7Bid%7D/put/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              properties:
                name:
                  description: Name of product
                  type: string
                description:
                  description: The description of the product
                  type: string
                price:
                  description: Price should be in kobo if currency is NGN, pesewas, if currency is GHS, and cents, if currency
                    is ZAR
                  type: integer
                currency:
                  description: 'Currency in which price is set. Allowed values are: NGN, GHS, ZAR or USD'
                  type: string
                limited:
                  description: Set to true if the product has limited stock. Leave as false if the product has unlimited stock
                  type: boolean
                quantity:
                  description: Number of products in stock. Use if limited is true
                  type: integer
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    delete:
      tags:
      - Product
      summary: Delete Product
      operationId: product_delete
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    parameters:
    - name: id
      in: path
      required: true
      schema:
        type: string
  /page:
    post:
      tags:
      - Page
      summary: Create Page
      operationId: page_create
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1page/post/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              required:
              - name
              properties:
                name:
                  description: Name of page
                  type: string
                description:
                  description: The description of the page
                  type: string
                amount:
                  description: Amount should be in kobo if currency is NGN, pesewas, if currency is GHS, and cents, if currency
                    is ZAR
                  type: integer
                slug:
                  description: URL slug you would like to be associated with this page. Page will be accessible at https://paystack.com/pay/[slug]
                  type: string
                metadata:
                  description: Stringified JSON object of custom data
                  type: string
                redirect_url:
                  description: If you would like Paystack to redirect to a URL upon successful payment, specify the URL here.
                  type: string
                custom_fields:
                  description: If you would like to accept custom fields, specify them here.
                  type: array
                  items:
                    type: object
      responses:
        '201':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    get:
      tags:
      - Page
      summary: List Pages
      operationId: page_list
      parameters:
      - in: query
        name: perPage
        schema:
          type: integer
        description: Number of records to fetch per page
      - in: query
        name: page
        schema:
          type: integer
        description: The section to retrieve
      - in: query
        name: from
        schema:
          type: string
          format: date-time
        description: The start date
      - in: query
        name: to
        schema:
          type: string
          format: date-time
        description: The end date
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
  /page/{id}:
    get:
      tags:
      - Page
      summary: Fetch Page
      operationId: page_fetch
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    put:
      tags:
      - Page
      summary: Update Page
      operationId: page_update
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1page~1%7Bid%7D/put/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              properties:
                name:
                  description: Name of page
                  type: string
                description:
                  description: The description of the page
                  type: string
                amount:
                  description: Amount should be in kobo if currency is NGN, pesewas, if currency is GHS, and cents, if currency
                    is ZAR
                  type: integer
                active:
                  description: Set to false to deactivate page url
                  type: boolean
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    parameters:
    - name: id
      in: path
      required: true
      schema:
        type: string
  /page/check_slug_availability/{slug}:
    get:
      tags:
      - Page
      summary: Check Slug Availability
      operationId: page_checkSlugAvailability
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    parameters:
    - name: slug
      in: path
      required: true
      schema:
        type: string
  /page/{id}/product:
    post:
      tags:
      - Page
      summary: Add Products
      operationId: page_addProducts
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1page~1%7Bid%7D~1product/post/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              required:
              - product
              properties:
                product:
                  description: IDs of all products to add to a page
                  type: array
                  items:
                    type: string
      responses:
        '201':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    parameters:
    - name: id
      in: path
      required: true
      schema:
        type: string
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
  schemas:
    Customer:
      allOf:
      - type: object
        required:
        - email
        properties:
          email:
            description: Customer's email address
            type: string
      - type: object
        properties:
          first_name:
            description: Customer's first name
            type: string
          last_name:
            description: Customer's last name
            type: string
          phone:
            description: Customer's phone number
            type: string
          metadata:
            description: Stringified JSON object of custom data
            type: string
      - type: object
        required:
        - authorization_code
        properties:
          authorization_code:
            description: Customer's authorization code to be deactivated
            type: string
      - type: object
        required:
        - customer
        properties:
          customer:
            description: Customer's code, or email address
            type: string
          risk_action:
            description: "One of the possible risk actions [ default, allow, deny ]. allow to whitelist. \ndeny to blacklist.\
              \ Customers start with a default risk action.\n"
            type: string
            enum:
            - default
            - allow
            - deny
      - type: object
        required:
        - type
        - country
        - bvn
        - bank_code
        - account_number
        properties:
          type:
            description: Predefined types of identification.
            type: string
            enum:
            - bvn
            - bank_account
          country:
            description: Two-letter country code of identification issuer
            type: string
          bvn:
            description: Customer's Bank Verification Number
            type: string
          bank_code:
            description: You can get the list of bank codes by calling the List Banks endpoint (https://api.paystack.co/bank).
            type: string
          account_number:
            description: Customer's bank account number.
            type: string
          value:
            description: Customer's identification number. Required if type is bvn
            type: string
    Error:
      type: object
      properties:
        status:
          type: boolean
        message:
          type: string
    Response:
      type: object
      properties:
        status:
          type: boolean
        message:
          type: string
        data:
          type: object
security:
- bearerAuth: []