Paystack · AsyncAPI Specification

Paystack Webhooks

Version 1.0.0

AsyncAPI 2.6 description of Paystack's outbound webhook surface. Paystack notifies a single merchant-configured POST endpoint (the "webhook URL") whenever an event occurs against your integration. Every webhook delivery is a JSON POST with two top-level fields: - `event` — a string identifying the event type (for example `charge.success`). - `data` — an object whose shape depends on the event type and mirrors the corresponding REST resource (Transaction, Dispute, Refund, Transfer, Invoice, Subscription, Customer, Dedicated Virtual Account, Payment Request). ## Delivery and retries - Your endpoint must return `200 OK`. Anything else is treated as a failed delivery. - Live mode: every 3 minutes for the first 4 attempts, then hourly for up to 72 hours. - Test mode: hourly retries for up to 72 hours. - Acknowledge the event before performing long-running work to avoid timeouts. ## Verifying event origin Every request carries an `x-paystack-signature` header whose value is the HMAC SHA-512 of the raw request body, signed with your Paystack secret key. Verify it before processing the event. You may additionally IP-allowlist `52.31.139.75`, `52.49.173.169`, and `52.214.14.220` (both test and live). Source: https://paystack.com/docs/payments/webhooks/

View Spec View on GitHub PaymentsAfricaFintechRecurring BillingMarketplacesPayoutsMobile MoneyStripeAsyncAPIEventsWebhooks

Channels

paystack/events
publish receivePaystackEvent
Receive a Paystack webhook event
The merchant's single webhook URL. Paystack POSTs every event type defined in this document to the same channel; consumers branch on the `event` field of the payload.

Messages

ChargeSuccess
charge.success
A successful transaction (charge) was completed.
ChargeDisputeCreate
charge.dispute.create
A dispute was logged against your business.
ChargeDisputeRemind
charge.dispute.remind
A logged dispute has not yet been resolved.
ChargeDisputeResolve
charge.dispute.resolve
A dispute has been resolved.
CustomerIdentificationSuccess
customeridentification.success
Customer identity validation succeeded.
CustomerIdentificationFailed
customeridentification.failed
Customer identity validation failed.
DedicatedAccountAssignSuccess
dedicatedaccount.assign.success
A Dedicated Virtual Account was assigned to a customer.
DedicatedAccountAssignFailed
dedicatedaccount.assign.failed
Dedicated Virtual Account assignment failed.
InvoiceCreate
invoice.create
A subscription invoice has been created.
InvoiceUpdate
invoice.update
A subscription invoice was updated (typically a successful charge).
InvoicePaymentFailed
invoice.payment_failed
A subscription invoice payment failed.
PaymentRequestSuccess
paymentrequest.success
A payment request was paid.
PaymentRequestPending
paymentrequest.pending
A payment request has been sent to a customer.
RefundFailed
refund.failed
A refund could not be processed.
RefundPending
refund.pending
A refund was initiated and is awaiting processor response.
RefundProcessed
refund.processed
A refund has been successfully processed.
RefundProcessing
refund.processing
A refund has been received by the processor.
SubscriptionCreate
subscription.create
A subscription has been created.
SubscriptionDisable
subscription.disable
A subscription has been disabled.
SubscriptionNotRenew
subscription.not_renew
A subscription has been flagged as non-renewing.
SubscriptionExpiringCards
subscription.expiring_cards
Monthly report of subscriptions whose cards are expiring.
TransferSuccess
transfer.success
A transfer has completed successfully.
TransferFailed
transfer.failed
A transfer attempt failed.
TransferReversed
transfer.reversed
A transfer was reversed.

Servers

https
merchant-endpoint {webhookUrl}
Merchant-operated HTTPS endpoint registered on the Paystack dashboard. Paystack POSTs JSON webhook events to this URL. The endpoint must be publicly reachable (localhost URLs cannot receive events) and respond with `200 OK`.

AsyncAPI Specification

Raw ↑
asyncapi: 2.6.0
info:
  title: Paystack Webhooks
  version: '1.0.0'
  description: |
    AsyncAPI 2.6 description of Paystack's outbound webhook surface.

    Paystack notifies a single merchant-configured POST endpoint (the "webhook URL")
    whenever an event occurs against your integration. Every webhook delivery is a
    JSON POST with two top-level fields:

    - `event` — a string identifying the event type (for example `charge.success`).
    - `data`  — an object whose shape depends on the event type and mirrors the
      corresponding REST resource (Transaction, Dispute, Refund, Transfer, Invoice,
      Subscription, Customer, Dedicated Virtual Account, Payment Request).

    ## Delivery and retries

    - Your endpoint must return `200 OK`. Anything else is treated as a failed delivery.
    - Live mode: every 3 minutes for the first 4 attempts, then hourly for up to 72 hours.
    - Test mode: hourly retries for up to 72 hours.
    - Acknowledge the event before performing long-running work to avoid timeouts.

    ## Verifying event origin

    Every request carries an `x-paystack-signature` header whose value is the
    HMAC SHA-512 of the raw request body, signed with your Paystack secret key.
    Verify it before processing the event. You may additionally IP-allowlist
    `52.31.139.75`, `52.49.173.169`, and `52.214.14.220` (both test and live).

    Source: https://paystack.com/docs/payments/webhooks/
  contact:
    name: Paystack Support
    url: https://support.paystack.com/
  license:
    name: Paystack Terms of Service
    url: https://paystack.com/terms
  x-source:
    documentation: https://paystack.com/docs/payments/webhooks/
    apis-yml: https://raw.githubusercontent.com/api-evangelist/paystack/main/apis.yml

defaultContentType: application/json

servers:
  merchant-endpoint:
    url: '{webhookUrl}'
    protocol: https
    description: |
      Merchant-operated HTTPS endpoint registered on the Paystack dashboard.
      Paystack POSTs JSON webhook events to this URL. The endpoint must be
      publicly reachable (localhost URLs cannot receive events) and respond
      with `200 OK`.
    variables:
      webhookUrl:
        default: https://example.com/paystack/webhook
        description: The fully qualified webhook URL configured in the Paystack dashboard.

channels:
  paystack/events:
    description: |
      The merchant's single webhook URL. Paystack POSTs every event type defined
      in this document to the same channel; consumers branch on the `event` field
      of the payload.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: '0.3.0'
    publish:
      operationId: receivePaystackEvent
      summary: Receive a Paystack webhook event
      description: |
        Inbound webhook delivered by Paystack. Verify the `x-paystack-signature`
        header (HMAC-SHA512 of the raw request body keyed by your secret key)
        before trusting the payload. Respond with `200 OK` to acknowledge.
      message:
        oneOf:
          - $ref: '#/components/messages/ChargeSuccess'
          - $ref: '#/components/messages/ChargeDisputeCreate'
          - $ref: '#/components/messages/ChargeDisputeRemind'
          - $ref: '#/components/messages/ChargeDisputeResolve'
          - $ref: '#/components/messages/CustomerIdentificationSuccess'
          - $ref: '#/components/messages/CustomerIdentificationFailed'
          - $ref: '#/components/messages/DedicatedAccountAssignSuccess'
          - $ref: '#/components/messages/DedicatedAccountAssignFailed'
          - $ref: '#/components/messages/InvoiceCreate'
          - $ref: '#/components/messages/InvoiceUpdate'
          - $ref: '#/components/messages/InvoicePaymentFailed'
          - $ref: '#/components/messages/PaymentRequestSuccess'
          - $ref: '#/components/messages/PaymentRequestPending'
          - $ref: '#/components/messages/RefundFailed'
          - $ref: '#/components/messages/RefundPending'
          - $ref: '#/components/messages/RefundProcessed'
          - $ref: '#/components/messages/RefundProcessing'
          - $ref: '#/components/messages/SubscriptionCreate'
          - $ref: '#/components/messages/SubscriptionDisable'
          - $ref: '#/components/messages/SubscriptionNotRenew'
          - $ref: '#/components/messages/SubscriptionExpiringCards'
          - $ref: '#/components/messages/TransferSuccess'
          - $ref: '#/components/messages/TransferFailed'
          - $ref: '#/components/messages/TransferReversed'

components:
  messageTraits:
    PaystackSignedDelivery:
      headers:
        type: object
        required:
          - x-paystack-signature
          - content-type
        properties:
          x-paystack-signature:
            type: string
            description: |
              HMAC-SHA512 hex digest of the raw JSON request body, signed using
              the merchant's Paystack secret key. The receiver must recompute
              this value and reject the request on mismatch.
            example: 'd41d8cd98f00b204e9800998ecf8427e...'
            pattern: '^[a-f0-9]{128}$'
          content-type:
            type: string
            const: application/json
          user-agent:
            type: string
            description: User agent string sent by Paystack's webhook dispatcher.
      bindings:
        http:
          headers:
            type: object
          bindingVersion: '0.3.0'

  messages:
    ChargeSuccess:
      name: ChargeSuccess
      title: charge.success
      summary: A successful transaction (charge) was completed.
      description: |
        Fired when a transaction is successfully charged. The `data` object is the
        Paystack Transaction resource (see Accept Payments API / Transaction).
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/ChargeSuccessEvent'

    ChargeDisputeCreate:
      name: ChargeDisputeCreate
      title: charge.dispute.create
      summary: A dispute was logged against your business.
      description: |
        Fired when a cardholder dispute (chargeback) is opened against a transaction.
        The `data` object is the Paystack Dispute resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/ChargeDisputeCreateEvent'

    ChargeDisputeRemind:
      name: ChargeDisputeRemind
      title: charge.dispute.remind
      summary: A logged dispute has not yet been resolved.
      description: |
        Reminder that an open dispute is still pending merchant action. The `data`
        object is the Paystack Dispute resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/ChargeDisputeRemindEvent'

    ChargeDisputeResolve:
      name: ChargeDisputeResolve
      title: charge.dispute.resolve
      summary: A dispute has been resolved.
      description: |
        Fired when a dispute reaches a final resolution state. The `data` object
        is the Paystack Dispute resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/ChargeDisputeResolveEvent'

    CustomerIdentificationSuccess:
      name: CustomerIdentificationSuccess
      title: customeridentification.success
      summary: Customer identity validation succeeded.
      description: |
        Asynchronous result for a customer KYC validation request that succeeded.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/CustomerIdentificationSuccessEvent'

    CustomerIdentificationFailed:
      name: CustomerIdentificationFailed
      title: customeridentification.failed
      summary: Customer identity validation failed.
      description: |
        Asynchronous result for a customer KYC validation request that failed.
        Example payload taken verbatim from the Paystack webhooks documentation.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/CustomerIdentificationFailedEvent'
      examples:
        - name: documentation-example
          summary: Example from https://paystack.com/docs/payments/webhooks/
          payload:
            event: customeridentification.failed
            data:
              customer_id: 82796315
              customer_code: CUS_XXXXXXXXXXXXXXX
              email: customer@example.com
              identification:
                country: NG
                type: bank_account
                bvn: '123*****456'
                account_number: '012****345'
                bank_code: '999991'
              reason: Account number or BVN is incorrect

    DedicatedAccountAssignSuccess:
      name: DedicatedAccountAssignSuccess
      title: dedicatedaccount.assign.success
      summary: A Dedicated Virtual Account was assigned to a customer.
      description: |
        Fired when a DVA has been successfully created and assigned to a customer.
        The `data` object is the Paystack Dedicated Virtual Account resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/DedicatedAccountAssignSuccessEvent'

    DedicatedAccountAssignFailed:
      name: DedicatedAccountAssignFailed
      title: dedicatedaccount.assign.failed
      summary: Dedicated Virtual Account assignment failed.
      description: |
        Fired when an attempt to create and assign a DVA to a customer fails.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/DedicatedAccountAssignFailedEvent'

    InvoiceCreate:
      name: InvoiceCreate
      title: invoice.create
      summary: A subscription invoice has been created.
      description: |
        An invoice has been created for a subscription on your account. This usually
        happens 3 days before the subscription is due, or whenever the first pending
        invoice notification is sent to the customer.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/InvoiceCreateEvent'

    InvoiceUpdate:
      name: InvoiceUpdate
      title: invoice.update
      summary: A subscription invoice was updated (typically a successful charge).
      description: |
        An invoice has been updated. This usually means the customer was charged
        successfully. Inspect the invoice object and take any necessary action.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/InvoiceUpdateEvent'

    InvoicePaymentFailed:
      name: InvoicePaymentFailed
      title: invoice.payment_failed
      summary: A subscription invoice payment failed.
      description: A payment for a subscription invoice failed.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/InvoicePaymentFailedEvent'

    PaymentRequestSuccess:
      name: PaymentRequestSuccess
      title: paymentrequest.success
      summary: A payment request was paid.
      description: |
        A previously issued payment request has been paid. The `data` object is the
        Paystack Payment Request resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/PaymentRequestSuccessEvent'

    PaymentRequestPending:
      name: PaymentRequestPending
      title: paymentrequest.pending
      summary: A payment request has been sent to a customer.
      description: A payment request was issued and is awaiting customer payment.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/PaymentRequestPendingEvent'

    RefundFailed:
      name: RefundFailed
      title: refund.failed
      summary: A refund could not be processed.
      description: |
        The refund cannot be processed. Your account will be credited with the
        refund amount. The `data` object is the Paystack Refund resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/RefundFailedEvent'

    RefundPending:
      name: RefundPending
      title: refund.pending
      summary: A refund was initiated and is awaiting processor response.
      description: Refund initiated, waiting for response from the processor.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/RefundPendingEvent'

    RefundProcessed:
      name: RefundProcessed
      title: refund.processed
      summary: A refund has been successfully processed.
      description: Refund has successfully been processed by the processor.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/RefundProcessedEvent'

    RefundProcessing:
      name: RefundProcessing
      title: refund.processing
      summary: A refund has been received by the processor.
      description: Refund has been received by the processor and is being processed.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/RefundProcessingEvent'

    SubscriptionCreate:
      name: SubscriptionCreate
      title: subscription.create
      summary: A subscription has been created.
      description: |
        A new subscription was created on your account. The `data` object is the
        Paystack Subscription resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/SubscriptionCreateEvent'

    SubscriptionDisable:
      name: SubscriptionDisable
      title: subscription.disable
      summary: A subscription has been disabled.
      description: A subscription on your account has been disabled.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/SubscriptionDisableEvent'

    SubscriptionNotRenew:
      name: SubscriptionNotRenew
      title: subscription.not_renew
      summary: A subscription has been flagged as non-renewing.
      description: |
        A subscription's status has changed to non-renewing. The subscription will
        not be charged on the next payment date.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/SubscriptionNotRenewEvent'

    SubscriptionExpiringCards:
      name: SubscriptionExpiringCards
      title: subscription.expiring_cards
      summary: Monthly report of subscriptions whose cards are expiring.
      description: |
        Contains information on all subscriptions with cards that are expiring
        that month. Sent at the beginning of each month to merchants using
        Subscriptions.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/SubscriptionExpiringCardsEvent'

    TransferSuccess:
      name: TransferSuccess
      title: transfer.success
      summary: A transfer has completed successfully.
      description: |
        A successful transfer has been completed. The `data` object is the Paystack
        Transfer resource.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/TransferSuccessEvent'

    TransferFailed:
      name: TransferFailed
      title: transfer.failed
      summary: A transfer attempt failed.
      description: A transfer you attempted has failed.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/TransferFailedEvent'

    TransferReversed:
      name: TransferReversed
      title: transfer.reversed
      summary: A transfer was reversed.
      description: A transfer you attempted has been reversed.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/PaystackSignedDelivery'
      payload:
        $ref: '#/components/schemas/TransferReversedEvent'

  schemas:
    EventEnvelope:
      type: object
      description: |
        Base shape of every Paystack webhook delivery. Concrete event payloads
        narrow `event` to a literal string and refine `data` to the matching
        resource shape. Field shapes are not exhaustively documented by Paystack;
        consult the corresponding REST resource (Transaction, Dispute, Refund,
        Transfer, Subscription, Invoice, Customer, Dedicated Virtual Account,
        Payment Request) for the full field set.
      required:
        - event
        - data
      properties:
        event:
          type: string
          description: Event type identifier.
        data:
          type: object
          description: Event-specific resource payload.

    PaystackIdentification:
      type: object
      description: |
        Identification block included on `customeridentification.*` events.
        Shape taken from the Paystack webhooks documentation example.
      properties:
        country:
          type: string
          description: ISO 3166-1 alpha-2 country code.
          example: NG
        type:
          type: string
          description: Identification type submitted by the merchant.
          example: bank_account
        bvn:
          type: string
          description: Masked Bank Verification Number, when applicable.
          example: '123*****456'
        account_number:
          type: string
          description: Masked bank account number, when applicable.
          example: '012****345'
        bank_code:
          type: string
          description: Paystack bank code, when applicable.
          example: '999991'

    ChargeSuccessEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: charge.success
            data:
              type: object
              description: |
                Paystack Transaction resource. See the Accept Payments / Transaction
                API for the full field set
                (https://paystack.com/docs/api/transaction/).

    ChargeDisputeCreateEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: charge.dispute.create
            data:
              type: object
              description: |
                Paystack Dispute resource. See
                https://paystack.com/docs/api/dispute/ for the full field set.

    ChargeDisputeRemindEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: charge.dispute.remind
            data:
              type: object
              description: Paystack Dispute resource.

    ChargeDisputeResolveEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: charge.dispute.resolve
            data:
              type: object
              description: Paystack Dispute resource.

    CustomerIdentificationSuccessEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: customeridentification.success
            data:
              type: object
              description: |
                Customer identification result. Mirrors the shape of the
                documented `customeridentification.failed` payload but without
                the `reason` field.
              properties:
                customer_id:
                  type: integer
                customer_code:
                  type: string
                email:
                  type: string
                  format: email
                identification:
                  $ref: '#/components/schemas/PaystackIdentification'

    CustomerIdentificationFailedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: customeridentification.failed
            data:
              type: object
              description: |
                Customer identification failure. Shape and field names taken
                verbatim from the Paystack webhooks documentation.
              required:
                - customer_id
                - customer_code
                - email
                - identification
                - reason
              properties:
                customer_id:
                  type: integer
                  example: 82796315
                customer_code:
                  type: string
                  example: CUS_XXXXXXXXXXXXXXX
                email:
                  type: string
                  format: email
                identification:
                  $ref: '#/components/schemas/PaystackIdentification'
                reason:
                  type: string
                  example: Account number or BVN is incorrect

    DedicatedAccountAssignSuccessEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: dedicatedaccount.assign.success
            data:
              type: object
              description: |
                Paystack Dedicated Virtual Account resource. See
                https://paystack.com/docs/api/dedicated-virtual-account/.

    DedicatedAccountAssignFailedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: dedicatedaccount.assign.failed
            data:
              type: object
              description: Failure context for the DVA assignment attempt.

    InvoiceCreateEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: invoice.create
            data:
              type: object
              description: |
                Subscription invoice resource. Inspect the invoice object and
                act on it as documented in the Subscriptions API.

    InvoiceUpdateEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: invoice.update
            data:
              type: object
              description: Updated subscription invoice resource.

    InvoicePaymentFailedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: invoice.payment_failed
            data:
              type: object
              description: Subscription invoice for which payment failed.

    PaymentRequestSuccessEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: paymentrequest.success
            data:
              type: object
              description: |
                Paystack Payment Request resource. See
                https://paystack.com/docs/api/payment-request/.

    PaymentRequestPendingEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: paymentrequest.pending
            data:
              type: object
              description: Paystack Payment Request resource (pending state).

    RefundFailedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: refund.failed
            data:
              type: object
              description: |
                Paystack Refund resource. See https://paystack.com/docs/api/refund/.

    RefundPendingEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: refund.pending
            data:
              type: object
              description: Paystack Refund resource (pending processor response).

    RefundProcessedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: refund.processed
            data:
              type: object
              description: Paystack Refund resource (processed by processor).

    RefundProcessingEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: refund.processing
            data:
              type: object
              description: Paystack Refund resource (received by processor).

    SubscriptionCreateEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: subscription.create
            data:
              type: object
              description: |
                Paystack Subscription resource. See
                https://paystack.com/docs/api/subscription/.

    SubscriptionDisableEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: subscription.disable
            data:
              type: object
              description: Paystack Subscription resource (disabled state).

    SubscriptionNotRenewEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: subscription.not_renew
            data:
              type: object
              description: Paystack Subscription resource (non-renewing state).

    SubscriptionExpiringCardsEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: subscription.expiring_cards
            data:
              type: object
              description: |
                Aggregated report of subscriptions whose cards expire in the
                current month. Field shape is not exhaustively documented by
                Paystack.

    TransferSuccessEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: transfer.success
            data:
              type: object
              description: |
                Paystack Transfer resource. See
                https://paystack.com/docs/api/transfer/.

    TransferFailedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: transfer.failed
            data:
              type: object
              description: Paystack Transfer resource (failed state).

    TransferReversedEvent:
      allOf:
        - $ref: '#/components/schemas/EventEnvelope'
        - type: object
          properties:
            event:
              const: transfer.reversed
            data:
              type: object
              description: Paystack Transfer resource (reversed state).

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/paystack-webhooks-asyncapi"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.