openapi: 3.1.0
info:
  title: Notify v4 Webhook Events
  version: 1.0.0
  description: >
    Ingo delivers webhook events to your registered HTTPS endpoint via HTTP POST
    for IngoPay SaaS Platform (Notify v4) 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 v3:** The following events are also received by
    Notify v3 clients. Schemas are identical across both versions:

    - `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`


    **v4 vs v3 differences:**

    - Notification events use a unified `transaction.party.*` prefix rather
      than separate recipient/approver/joint prefixes.
    - Dynamic party authentication replaces the v3 DPA model. - SSO
    authentication is a new event type. - Transaction staging confirmation
    (`transaction.staging.status.success`)
      is new in v4 — provides `party_id` and engagement URLs per party.
    - Multi-party approval events are new in v4. - Account tokenization does
    **not** include the `bin` field (present in v3).


    ## 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

    - Party Notifications - Party Authentication (Dynamic, SSO, OTAC, Overall) -
    Recipient Verification - Account Verification - Account Tokenization -
    Recipient Payment - Multi-Party Events
webhooks:
  transaction.staging.status.success:
    post:
      operationId: v4_staging_success
      summary: Transaction Staging — Success
      description: >
        Transaction staging completed. Returns `party_id` and engagement URLs
        for each party. This is a v4-only event — not available in v3.
      tags:
        - Transaction Staging
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookStagingSuccess'
            example:
              metadata:
                id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                topic: transaction.staging.status.success
                topic_description: Transaction Staging Success
                timestamp: 1629390000
                version: '1'
              data:
                ancillary:
                  notification_id: '123456789012345'
                  participant_unique_id1: 39eef189-dd96-49e4-80d3-6346240c427a
                  party_id: b2c3d4e5-f6a7-8901-bcde-f01234567891
                event:
                  status: '100'
                  client_message: Transaction Staging Success
                  party_info:
                    - client_provided_id: recipient-001
                      party_id: b2c3d4e5-f6a7-8901-bcde-f01234567891
                      party_urls:
                        - url_type: 1
                          url: https://dpc.example.ingomoney.com/claim/b2c3d4e5
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.party.notification.status.sent:
    post:
      operationId: v4_party_notification_sent
      summary: Party Notification — Sent
      description: >
        A party notification was sent. Status code is in the 1200 series and
        indicates the communication type and delivery method. Unified across all
        party roles (recipient, approver, joint recipient).
      tags:
        - Party Notifications
      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.party.notification.status.received:
    post:
      operationId: v4_party_notification_received
      summary: Party Notification — Received
      tags:
        - Party Notifications
      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.party.notification.status.bounced:
    post:
      operationId: v4_party_notification_bounced
      summary: Party Notification — Bounced
      tags:
        - Party Notifications
      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.party.authentication.dynamic.validation.success:
    post:
      operationId: v4_dpa_success
      summary: Dynamic Party Authentication — Success
      description: >
        Dynamic party authentication succeeded or soft failed. Replaces the v3
        DPA model. Status 1100 = Success, 1101 = Soft Failure.
      tags:
        - Party Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookDpaResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.party.authentication.dynamic.validation.failure:
    post:
      operationId: v4_dpa_failure
      summary: Dynamic Party Authentication — Failure
      description: Dynamic party authentication failed. Status 1102.
      tags:
        - Party Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookDpaResult'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.party.authentication.sso.validation.success:
    post:
      operationId: v4_sso_success
      summary: SSO Authentication — Success
      description: >
        User successfully authenticated via SSO. v4-only event. Status 1131 =
        SSO Authentication Success.
      tags:
        - Party Authentication
      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.party.authentication.otac.delivery.generate:
    post:
      operationId: v4_otac_generate
      summary: OTAC — Generated and Sent
      description: >
        A One Time Authorization Code (OTAC) was generated and sent to the user.
        Also received by Notify v3 clients. Status 1153 = SMS, 1154 = Email.
      tags:
        - Party Authentication
      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.party.authentication.otac.delivery.limit:
    post:
      operationId: v4_otac_limit
      summary: OTAC — Generation Limit Reached
      description: >
        Maximum allowed OTACs for this transaction/party/role reached. Also
        received by Notify v3 clients. Status 1151.
      tags:
        - Party Authentication
      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.party.authentication.otac.validation.success:
    post:
      operationId: v4_otac_validation_success
      summary: OTAC — Validation Success
      description: >
        User matched the OTAC successfully. Also received by Notify v3 clients.
        Status 1155.
      tags:
        - Party Authentication
      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.party.authentication.otac.validation.failure:
    post:
      operationId: v4_otac_validation_failure
      summary: OTAC — Validation Failure
      description: >
        User failed to match the OTAC. Also received by Notify v3 clients.
        Status 1152.
      tags:
        - Party Authentication
      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.party.authentication.overall.success:
    post:
      operationId: v4_overall_auth_success
      summary: Overall Authentication — Success
      description: >
        User successfully completed authentication and was granted access. Also
        received by Notify v3 clients. Status 1160.
      tags:
        - Party Authentication
      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.party.authentication.overall.failure:
    post:
      operationId: v4_overall_auth_failure
      summary: Overall Authentication — Failure
      description: >
        User failed authentication and was not granted access. Also received by
        Notify v3 clients. Status 1161–1164.
      tags:
        - Party Authentication
      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.rvdm.success:
    post:
      operationId: v4_rvdm_success
      summary: Recipient Verification (RVDM) — Success
      description: 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: v4_rvdm_failure
      summary: Recipient Verification (RVDM) — Failure
      description: Status 1105.
      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: v4_ofac_suspended
      summary: OFAC Screening — Suspended
      description: 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: v4_ofac_cleared
      summary: OFAC Screening — Cleared
      description: 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: v4_ofac_failure
      summary: OFAC Screening — Failure
      description: 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: v4_card_cns_cd
      summary: Card Verification — CNS / Check Digit Failure
      description: Status 700 or 1042.
      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: v4_card_avs_cvv
      summary: Card Verification — AVS / CVV 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.ach.failure.rnv:
    post:
      operationId: v4_ach_rnv
      summary: ACH Verification — Routing Number Validation 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.ach.failure.anv:
    post:
      operationId: v4_ach_anv
      summary: ACH Verification — Account Number Validation 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.ach.failure.nav:
    post:
      operationId: v4_ach_nav
      summary: ACH Verification — Name on Account Validation 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.paypal.success.av:
    post:
      operationId: v4_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: v4_paypal_av_failure
      summary: PayPal Account Verification — Failure
      description: Status 1150.
      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: v4_tokenization_success
      summary: Account Tokenization — Success
      description: >
        Successful account tokenization. Note: the `bin` field present in Notify
        v3 tokenization is not included in v4.
      tags:
        - Account Tokenization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookTokenizationV4'
      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: v4_disbursement_expired
      summary: Disbursement Request — Expired
      description: 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: v4_disbursement_canceled
      summary: Disbursement Request — Canceled
      description: 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: v4_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: v4_payment_check_elected
      summary: Recipient Payment — Check Elected
      description: >
        Customer elected non-Ingo issued check. Non-terminal. Status 1111 =
        address verified, 1112 = 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: v4_check_issued
      summary: Check Issued
      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: v4_check_paid
      summary: Check Paid
      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: v4_check_canceled
      summary: Check Cancellation Confirmed
      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: v4_check_stopped
      summary: Check Stop Confirmed
      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: v4_payment_success
      summary: Recipient Payment — Success
      description: >
        Payment completed. 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: v4_payment_terminated
      summary: Recipient Payment — Terminated
      description: Payment terminated by Ingo. 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: v4_payment_returned
      summary: Payment Returned by Issuer
      description: 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: v4_check_returned
      summary: Check Returned (Positive Pay Exception)
      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.recipient.payment.notice.status.recipient.cancel:
    post:
      operationId: v4_recipient_cancel
      summary: Recipient Payment — Canceled by Recipient
      description: Recipient canceled the transaction. v4-only event.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRecipientCancel'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  transaction.recipient.payment.notice.settlement.adjustment:
    post:
      operationId: v4_settlement_adjustment
      summary: Settlement Adjustment
      description: >
        A settlement adjustment transaction has been created that will debit or
        credit the client settlement account. Status 1140.
      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.approvals.decision.approved:
    post:
      operationId: v4_approval_approved
      summary: Multi-Party — Decision Approved
      description: |
        The indicated party approved the transaction. v4-only event.
      tags:
        - Multi-Party Events
      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.approvals.decision.declined:
    post:
      operationId: v4_approval_declined
      summary: Multi-Party — Decision Declined
      description: |
        The indicated party declined to approve the transaction. v4-only event.
      tags:
        - Multi-Party Events
      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.approvals.pmt-suspended:
    post:
      operationId: v4_approval_suspended
      summary: Multi-Party — Payment Suspended Pending Approval
      description: >
        Transaction could not complete due to pending approvals. Will attempt to
        complete upon receipt of pending approvals. v4-only.
      tags:
        - Multi-Party Events
      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.approvals.complete:
    post:
      operationId: v4_approval_complete
      summary: Multi-Party — All Approvals Received
      description: |
        All required approvals have been received. v4-only event.
      tags:
        - Multi-Party Events
      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.roles.change:
    post:
      operationId: v4_role_change
      summary: Multi-Party — Role Change
      description: |
        Role changes have occurred due to recipient delegation. v4-only event.
      tags:
        - Multi-Party Events
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRoleChange'
      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'
    WebhookStagingSuccess:
      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:
                    - party_info
                  properties:
                    party_info:
                      type: array
                      description: >-
                        Client-provided IDs with their Ingo-assigned IDs and
                        URLs.
                      items:
                        type: object
                        required:
                          - client_provided_id
                          - party_id
                        properties:
                          client_provided_id:
                            type: string
                            maxLength: 50
                            description: Client-assigned unique ID for the party.
                          party_id:
                            type: string
                            maxLength: 36
                            description: >-
                              UUID uniquely identifying the party in this
                              transaction.
                          party_urls:
                            type: array
                            description: Engagement URLs. Required for certain party roles.
                            items:
                              type: object
                              required:
                                - url_type
                                - url
                              properties:
                                url_type:
                                  type: integer
                                  enum:
                                    - 1
                                    - 2
                                  description: >-
                                    1 = Engagement link (Email), 2 = Engagement
                                    link (SMS)
                                url:
                                  type: string
                                  maxLength: 500
                                  description: URL the party uses to access the DPC.
    FieldResultDpa:
      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
    WebhookDpaResult:
      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/FieldResultDpa'
    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'
    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'
    WebhookTokenizationV4:
      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/EventTokenizationBase'
    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.
    WebhookRecipientCancel:
      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:
                    - reason_code
                  properties:
                    reason_code:
                      type: integer
                      description: Cancellation reason code.
    WebhookRoleChange:
      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:
                    - role_change
                  properties:
                    role_change:
                      type: array
                      items:
                        type: object
                        required:
                          - party_id
                          - old_role
                          - new_role
                        properties:
                          party_id:
                            type: string
                            maxLength: 36
                          old_role:
                            type: integer
                            maxLength: 10
                          new_role:
                            type: integer
                            maxLength: 10
    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
    FieldResultPaypal:
      type: object
      required:
        - field_name
        - is_matching
        - is_enabled
        - was_evaluated
        - client_provided_value
        - paypal_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
          description: >
            Value provided by the client. Can be a variable value (e.g. first
            name) when matching against a PayPal value, or a static value (e.g.
            true) when matching a PayPal setting like PayPal Verified.
        paypal_provided_value:
          type: string
          maxLength: 150
        hard_fail_on_mismatch:
          type: boolean
    IssuerObject:
      type: object
      required:
        - payee_id
        - payee_name
        - issuing_network
        - credit_enabled
        - debit_enabled
      properties:
        payee_id:
          type: string
          maxLength: 20
        payee_name:
          type: string
          maxLength: 100
        payee_address:
          type: string
          maxLength: 150
          nullable: true
        payee_city:
          type: string
          maxLength: 150
          nullable: true
        payee_state:
          type: string
          maxLength: 2
          nullable: true
        payee_zip:
          type: string
          maxLength: 10
          nullable: true
        issuing_network:
          type: string
          maxLength: 10
          description: Network the account was issued under. "NA" if not known.
          example: Visa
        credit_enabled:
          type: integer
          enum:
            - 1
            - 2
          description: 1 = Enabled, 2 = Not Enabled
        debit_enabled:
          type: integer
          enum:
            - 1
            - 2
          description: 1 = Enabled, 2 = Not Enabled
        credit_info:
          type: object
          description: Present when credit_enabled is 1.
          properties:
            min:
              type: string
              maxLength: 10
            max:
              type: string
              maxLength: 10
            card_type:
              type: string
              maxLength: 20
            estimated_posting_time:
              type: string
              maxLength: 150
            estimated_posting_date:
              type: string
              maxLength: 10
        debit_info:
          type: object
          description: Present when debit_enabled is 1.
          properties:
            min:
              type: string
              maxLength: 10
            max:
              type: string
              maxLength: 10
            card_type:
              type: string
              maxLength: 10
        network_validation:
          type: object
          description: >
            Reference data from network card validation. Present based on client
            validation configuration.
          properties:
            validation_provider_id:
              type: string
              maxLength: 3
              description: 1 = Visa, 3 = MasterCard
            name_validation:
              type: object
              properties:
                name_match_status:
                  type: string
                  maxLength: 3
                  description: >
                    1 = performed, 2 = not performed, 3 = not supported, 4 = not
                    configured
                name_match_decision:
                  type: string
                  maxLength: 3
                  description: 1 = Match, 2 = Partial match, 3 = No match
                first_name_match_decision:
                  type: string
                  maxLength: 3
                last_name_match_decision:
                  type: string
                  maxLength: 3
                middle_name_match_decision:
                  type: string
                  maxLength: 3
        open_banking_finicity:
          type: object
          description: >
            Present when client is configured for Finicity open banking
            services.
          properties:
            customer_id:
              type: string
              maxLength: 50
            account_id:
              type: string
              maxLength: 50
