openapi: 3.1.0
info:
  title: Notify v3 Webhook Events
  version: 1.0.0
  description: >
    Ingo delivers webhook events to your registered HTTPS endpoint via HTTP POST
    for IngoPay SaaS Platform (Notify v3) disbursement activity. Your endpoint
    must return a 2xx response to acknowledge receipt.


    **Acceptance policy:** Accept webhooks independently of your ability to
    process them downstream. Accepted events can be re-processed locally without
    requiring Ingo to replay delivery.


    **Retry policy:** Non-2xx responses are retried every 60 minutes for up to
    24 hours. Retry frequency, interval, and max attempts are configurable per
    endpoint. Use `metadata.id` as your idempotency key to prevent duplicate
    processing on retry.


    **Shared events with Notify v4:** Notify v3 clients may also receive the
    following Notify v4 events. See `notify-v4-webhooks.yaml` for schemas:

    - `transaction.party.authentication.otac.delivery.generate` -
    `transaction.party.authentication.otac.delivery.limit` -
    `transaction.party.authentication.otac.validation.success` -
    `transaction.party.authentication.otac.validation.failure` -
    `transaction.party.authentication.overall.success` -
    `transaction.party.authentication.overall.failure`


    ## Authentication

    Ingo requires your endpoint to authenticate inbound webhook requests.
    Supported mechanisms — configured by your Ingo integration manager:

    - **OAuth 2.0** — Ingo obtains an access token from your token endpoint
      before each delivery.
    - **Basic authentication** — username and password in the `Authorization`
      header on each request.
    - **Custom header** — a static value in a header of your choosing
      (e.g. `x-api-key`).
    - **Other mechanisms** (JWT, certificate-based, etc.) — discuss with
      your integration manager for evaluation.


    ## IP Whitelisting

    Configure your firewall to accept requests from the following IP addresses.

    **UAT:** 18.189.65.27, 23.253.209.42, 23.253.213.126, 23.253.22.48,
    3.130.108.242, 3.134.254.69, 3.142.181.231, 104.130.74.57

    **Production:** 64.88.183.84, 50.56.42.59, 50.56.46.146, 50.57.62.142


    ## Event Categories

    - Recipient Notification - Recipient Authentication - Recipient Verification
    - Account Verification - Account Tokenization - Recipient Payment - Joint
    Recipient Notification - Joint Recipient Authentication - Joint Recipient
    Disbursement Authorization - Approver Notification - Approver Authentication
    - Approver Disbursement Authorization
webhooks:
  transaction.recipient.notification.status.sent:
    post:
      operationId: v3_recipient_notification_sent
      summary: Recipient Notification — Sent
      description: >
        A recipient notification was sent. Status code is in the 1200 series and
        indicates the communication type and delivery method.
      tags:
        - Recipient Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.notification.status.bounced:
    post:
      operationId: v3_recipient_notification_bounced
      summary: Recipient Notification — Bounced
      description: |
        A recipient notification bounced. Status code is in the 1200 series.
      tags:
        - Recipient Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.notification.status.received:
    post:
      operationId: v3_recipient_notification_received
      summary: Recipient Notification — Received
      description: >
        A recipient notification was received. Status code is in the 1200
        series.
      tags:
        - Recipient Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.authentication.status.success:
    post:
      operationId: v3_recipient_auth_success
      summary: Recipient Authentication — Success
      description: >
        Recipient authenticated successfully (or soft failure) to the Payment
        Claim Center. Status 1100 = Success, 1101 = Soft Failure.
      tags:
        - Recipient Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookAuthResult'
            example:
              metadata:
                id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                topic: transaction.recipient.authentication.status.success
                topic_description: Recipient Authentication Success
                timestamp: 1629390000
                version: '1'
              data:
                ancillary:
                  notification_id: '123456789012345'
                  participant_unique_id1: 39eef189-dd96-49e4-80d3-6346240c427a
                  session_id: sess-abc123
                event:
                  status: '1100'
                  client_message: Recipient Authentication Success
                  attempt_count: 1
                  max_attempts: 3
                  has_passed: true
                  was_skipped: false
                  field_results:
                    - field_label: Last Name
                      is_matching: true
                      hard_fail_on_mismatch: true
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.authentication.status.failure:
    post:
      operationId: v3_recipient_auth_failure
      summary: Recipient Authentication — Failure
      description: >
        Recipient failed authentication to the Payment Claim Center. Status 1102
        = Authentication Failure.
      tags:
        - Recipient Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookAuthResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.verification.rvdm.success:
    post:
      operationId: v3_rvdm_success
      summary: Recipient Verification (RVDM) — Success
      description: >
        RVDM succeeded or soft failed. Status 1103 = Success, 1104 = Soft
        Failure.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRvdm'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.verification.rvdm.failure:
    post:
      operationId: v3_rvdm_failure
      summary: Recipient Verification (RVDM) — Failure
      description: Status 1105 = RVDM Failure.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRvdm'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.verification.ofac.status.suspended:
    post:
      operationId: v3_ofac_suspended
      summary: OFAC Screening — Suspended
      description: >
        Initial OFAC hit. Payment processing suspended pending review. Status
        1106 or 130.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.verification.ofac.status.cleared:
    post:
      operationId: v3_ofac_cleared
      summary: OFAC Screening — Cleared
      description: |
        OFAC hit cleared. Payment processing resumes. Status 1107.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.verification.ofac.status.failure:
    post:
      operationId: v3_ofac_failure
      summary: OFAC Screening — Failure
      description: |
        OFAC hit confirmed. Transaction terminated. Status 1108 or 100.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.card.failure.cns_cd:
    post:
      operationId: v3_card_cns_cd
      summary: Card Verification — CNS / Check Digit Failure
      description: Status 700 = Card Not Supported, 1042 = Check Digit Failure.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.card.failure.avs_cvv:
    post:
      operationId: v3_card_avs_cvv
      summary: Card Verification — AVS / CVV Failure
      description: AVS hard failure codes 753–760, 764. CVV failure 765.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.ach.failure.rnv:
    post:
      operationId: v3_ach_rnv
      summary: ACH Verification — Routing Number Validation Failure
      description: Status 743.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.ach.failure.anv:
    post:
      operationId: v3_ach_anv
      summary: ACH Verification — Account Number Validation Failure
      description: Hard failure codes 767–769.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.ach.failure.nav:
    post:
      operationId: v3_ach_nav
      summary: ACH Verification — Name on Account Validation Failure
      description: Hard failure codes 776–779.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.paypal.success.av:
    post:
      operationId: v3_paypal_av_success
      summary: PayPal Account Verification — Success
      description: Status 1148 = Success, 1149 = Soft Failure.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookPaypalVerification'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.verification.paypal.failure.av:
    post:
      operationId: v3_paypal_av_failure
      summary: PayPal Account Verification — Failure
      description: Status 1150 = AV Failure.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookPaypalVerification'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.account.tokenization.success:
    post:
      operationId: v3_tokenization_success
      summary: Account Tokenization — Success
      description: >
        Successful account tokenization. The `customer_account_token` can be
        used for subsequent process payment funding requests. Status 100 or any
        soft failure code from account validation.
      tags:
        - Account Tokenization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookTokenizationV3'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.disbursement.request.expired:
    post:
      operationId: v3_disbursement_expired
      summary: Disbursement Request — Expired
      description: >
        The disbursement request expired per client-configured expiration time.
        Non-terminal. Status 1109.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.disbursement.request.canceled:
    post:
      operationId: v3_disbursement_canceled
      summary: Disbursement Request — Canceled
      description: Disbursement was canceled per client request. Terminal. Status 1110.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.failure:
    post:
      operationId: v3_payment_failure
      summary: Recipient Payment — Failure
      description: Payment attempt failed. Non-terminal.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.check:
    post:
      operationId: v3_payment_check_elected
      summary: Recipient Payment — Check Elected
      description: >
        Customer elected to receive a non-Ingo issued check. Non-terminal.
        Status 1111 = address verified, 1112 = address not verified.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.check.issued:
    post:
      operationId: v3_check_issued
      summary: Check Issued
      description: Ingo-supported check updated to check_issued. Status 100.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookCheckIssuedPaid'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.check.paid:
    post:
      operationId: v3_check_paid
      summary: Check Paid
      description: Ingo-supported check updated to check_paid. Status 100.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookCheckIssuedPaid'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.check.canceled:
    post:
      operationId: v3_check_canceled
      summary: Check Cancellation Confirmed
      description: Check cancellation confirmed via status report file.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookCheckCanceledStopped'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.check.stopped:
    post:
      operationId: v3_check_stopped
      summary: Check Stop Confirmed
      description: Check stop confirmed via status report file.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookCheckCanceledStopped'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.success:
    post:
      operationId: v3_payment_success
      summary: Recipient Payment — Success
      description: >
        Payment completed successfully. Terminal. Status 1125 = Card, 1126 =
        ACH, 1133 = Check, 1134 = PayPal, 1170 = RTP.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookPaymentSuccess'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.terminated:
    post:
      operationId: v3_payment_terminated
      summary: Recipient Payment — Terminated
      description: |
        Payment could not be completed and has been terminated. Terminal.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.returned:
    post:
      operationId: v3_payment_returned
      summary: Payment Returned by Issuer
      description: >
        A previously completed payment was returned by the account issuer.
        Terminal. Status 1114.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookPaymentReturned'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.status.check.returned:
    post:
      operationId: v3_check_returned
      summary: Check Returned (Positive Pay Exception)
      description: A check was returned due to a positive pay exception. Status 1114.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookCheckReturned'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.joint.recipient.notification.status.sent:
    post:
      operationId: v3_joint_notification_sent
      summary: Joint Recipient Notification — Sent
      tags:
        - Joint Recipient Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.joint.recipient.notification.status.bounced:
    post:
      operationId: v3_joint_notification_bounced
      summary: Joint Recipient Notification — Bounced
      tags:
        - Joint Recipient Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.joint.recipient.notification.status.received:
    post:
      operationId: v3_joint_notification_received
      summary: Joint Recipient Notification — Received
      tags:
        - Joint Recipient Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.joint.recipient.authentication.status.success:
    post:
      operationId: v3_joint_auth_success
      summary: Joint Recipient Authentication — Success
      description: Status 1115 = Success, 1116 = Soft Failure.
      tags:
        - Joint Recipient Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookAuthResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.joint.recipient.authentication.status.failure:
    post:
      operationId: v3_joint_auth_failure
      summary: Joint Recipient Authentication — Failure
      description: Status 1117.
      tags:
        - Joint Recipient Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookAuthResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.joint.recipient.authorization.status:
    post:
      operationId: v3_joint_authorization
      summary: Joint Recipient Disbursement Authorization
      description: >
        Status of Joint Recipient authorization. Status 1118 = Authorized, 1119
        = Not Authorized.
      tags:
        - Joint Recipient Disbursement Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.approver.notification.status.sent:
    post:
      operationId: v3_approver_notification_sent
      summary: Approver Notification — Sent
      tags:
        - Approver Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.approver.notification.status.bounced:
    post:
      operationId: v3_approver_notification_bounced
      summary: Approver Notification — Bounced
      tags:
        - Approver Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.approver.notification.status.received:
    post:
      operationId: v3_approver_notification_received
      summary: Approver Notification — Received
      tags:
        - Approver Notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.approver.authentication.status.success:
    post:
      operationId: v3_approver_auth_success
      summary: Approver Authentication — Success
      description: Status 1120 = Success, 1121 = Soft Failure.
      tags:
        - Approver Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookAuthResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.approver.authentication.status.failure:
    post:
      operationId: v3_approver_auth_failure
      summary: Approver Authentication — Failure
      description: Status 1122.
      tags:
        - Approver Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookAuthResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.approver.authorization.status:
    post:
      operationId: v3_approver_authorization
      summary: Approver Disbursement Authorization
      description: >
        Status 1123 = Payment Authorized by Approver, 1124 = Payment Not
        Authorized by Approver.
      tags:
        - Approver Disbursement Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
components:
  schemas:
    WebhookMetadata:
      $ref: '#/components/schemas/WebhookMetadata'
    WebhookAncillaryNotify:
      $ref: '#/components/schemas/WebhookAncillaryNotify'
    WebhookEventBase:
      $ref: '#/components/schemas/WebhookEventBase'
    WebhookNoPayload:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/WebhookEventBase'
    FieldResultAuth:
      type: object
      required:
        - field_label
        - is_matching
        - hard_fail_on_mismatch
      properties:
        field_label:
          type: string
          maxLength: 50
        is_matching:
          type: boolean
        hard_fail_on_mismatch:
          type: boolean
    WebhookAuthResult:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              allOf:
                - $ref: '#/components/schemas/WebhookEventBase'
                - type: object
                  required:
                    - has_passed
                    - was_skipped
                    - field_results
                  properties:
                    has_passed:
                      type: boolean
                    was_skipped:
                      type: boolean
                    field_results:
                      type: array
                      items:
                        $ref: '#/components/schemas/FieldResultAuth'
    WebhookRvdm:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/EventRvdm'
    FieldResultPaypal:
      $ref: '#/components/schemas/FieldResultPaypal'
    WebhookPaypalVerification:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/EventPaypalVerification'
    IssuerObject:
      $ref: '#/components/schemas/IssuerObject'
    WebhookTokenizationV3:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              allOf:
                - $ref: '#/components/schemas/EventTokenizationBase'
                - type: object
                  properties:
                    bin:
                      type: string
                      maxLength: 8
                      description: >
                        Bank Identification Number. Present for card-based
                        accounts (CA). Not present in Notify v4.
    WebhookCheckIssuedPaid:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/EventCheckIssuedPaid'
    WebhookCheckCanceledStopped:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/EventCheckCanceledStopped'
    WebhookCheckReturned:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/EventCheckReturned'
    WebhookPaymentReturned:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              $ref: '#/components/schemas/EventPaymentReturned'
    WebhookPaymentSuccess:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryNotify'
            event:
              allOf:
                - $ref: '#/components/schemas/WebhookEventBase'
                - type: object
                  required:
                    - account_id
                  properties:
                    account_id:
                      type: string
                      maxLength: 36
                      description: >
                        Account-specific identifier. Introduced April 2024.
                        Available upon request for pre-existing clients.
    EventRvdm:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - has_passed
            - was_skipped
            - field_results
          properties:
            has_passed:
              type: boolean
              description: Overall result of the RVDM attempt.
            was_skipped:
              type: boolean
              description: Indicates if RVDM was not performed per configuration.
            field_results:
              type: array
              items:
                $ref: '#/components/schemas/FieldResultRvdm'
    EventPaypalVerification:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - has_passed
            - was_skipped
            - field_results
          properties:
            has_passed:
              type: boolean
            was_skipped:
              type: boolean
            field_results:
              type: array
              items:
                $ref: '#/components/schemas/FieldResultPaypal'
    EventTokenizationBase:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - customer_account_token
            - account_type
            - last_4
            - account_id
            - issuers
          properties:
            customer_account_token:
              type: string
              maxLength: 50
              description: >
                Token representing the customer account. Use for subsequent
                process payment funding requests via Ingo Payments.
            account_type:
              type: string
              maxLength: 2
              enum:
                - CA
                - AC
                - BP
              description: CA = Card, AC = ACH, BP = BillerPayee
            last_4:
              type: string
              maxLength: 4
              description: Last four digits of the account number.
            expiration_date:
              type: string
              maxLength: 4
              description: Expiration date (YYMM format). Card accounts only.
            account_id:
              type: string
              maxLength: 36
              description: >
                Account-specific identifier. Introduced April 2024. Available
                upon request for pre-existing clients.
            issuers:
              type: array
              description: Account issuer details. Typically a single object.
              items:
                $ref: '#/components/schemas/IssuerObject'
    EventCheckIssuedPaid:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - check_number
            - check_amount
          properties:
            check_number:
              type: string
              maxLength: 10
            check_amount:
              type: string
              maxLength: 10
    EventCheckCanceledStopped:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - check_number
            - check_amount
            - reason_code
          properties:
            check_number:
              type: string
              maxLength: 10
            check_amount:
              type: string
              maxLength: 10
            reason_code:
              type: string
              maxLength: 10
    EventCheckReturned:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - check_number
            - check_amount
            - reason_code
          properties:
            check_number:
              type: string
              maxLength: 10
            check_amount:
              type: string
              maxLength: 10
            reason_code:
              type: string
              maxLength: 10
    EventPaymentReturned:
      allOf:
        - $ref: '#/components/schemas/WebhookEventBase'
        - type: object
          required:
            - return_transaction_id
            - reason_code
            - reason_description
          properties:
            return_transaction_id:
              type: string
              maxLength: 15
              description: Ingo-assigned identifier for the return transaction.
            reason_code:
              type: string
              maxLength: 10
              description: Numeric reason code for the return.
            reason_description:
              type: string
              maxLength: 250
              description: Description of the return reason.
    FieldResultRvdm:
      type: object
      required:
        - field_name
        - is_matching
        - is_enabled
        - was_evaluated
        - client_provided_value
        - customer_provided_value
        - hard_fail_on_mismatch
      properties:
        field_name:
          type: string
          maxLength: 150
        is_matching:
          type: boolean
        is_enabled:
          type: boolean
        was_evaluated:
          type: boolean
        client_provided_value:
          type: string
          maxLength: 150
        customer_provided_value:
          type: string
          maxLength: 150
        hard_fail_on_mismatch:
          type: boolean
