openapi: 3.1.0
info:
  title: IngoPay iFrame Webhook Events
  version: 1.0.0
  description: >
    Ingo delivers webhook events to your registered HTTPS endpoint via HTTP POST
    during and after customer iFrame SDK interactions. 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.


    **Maintenance windows:** Contact your account coordinator to arrange webhook
    suspension during planned maintenance.


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


    ## Shared Events

    The following events use the `gateway.` topic prefix and have identical
    payloads in both the IngoPay API and iFrame products. Refer to
    `ingopay-webhooks.yaml` for the canonical schema definitions.

    - `gateway.transaction.recipient.verification.ofac.status.suspended` -
    `gateway.transaction.recipient.verification.ofac.status.cleared` -
    `gateway.transaction.recipient.verification.ofac.status.failure` -
    `gateway.transaction.recipient.payment.status.returned`


    ## Event Categories

    - Recipient Verification (RVDM + OFAC) - Account Verification (Card, ACH,
    PayPal) - Account Tokenization - Recipient Payment (Returns) - Session
    Events
webhooks:
  plugin.transaction.recipient.verification.rvdm.success:
    post:
      operationId: iframe_rvdm_success
      summary: Recipient Verification (RVDM) — Success
      description: >
        Recipient verification data matching (RVDM) succeeded or resulted in a
        soft failure within the iFrame SDK. Status 1103 = RVDM Success, 1104 =
        RVDM Soft Failure.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRvdm'
            example:
              metadata:
                id: f1a2b3c4-d5e6-7890-abcd-ef1234567890
                topic: plugin.transaction.recipient.verification.rvdm.success
                topic_description: Recipient Verification Data Matching - Success
                timestamp: 1629390000
                version: '1'
              data:
                ancillary:
                  notification_id: '123456789012345'
                  party_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  participant_unique_id1: 39eef189-dd96-49e4-80d3-6346240c427a
                  session_id: sess-abc123
                event:
                  status: '1103'
                  client_message: RVDM Success
                  attempt_count: 1
                  max_attempts: 3
                  has_passed: true
                  was_skipped: false
                  field_results:
                    - field_name: last_name
                      is_matching: true
                      is_enabled: true
                      was_evaluated: true
                      client_provided_value: Smith
                      customer_provided_value: Smith
                      hard_fail_on_mismatch: true
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.recipient.verification.rvdm.failure:
    post:
      operationId: iframe_rvdm_failure
      summary: Recipient Verification (RVDM) — Failure
      description: >
        Recipient verification data matching failed in the iFrame SDK. Status
        1105 = RVDM Failure.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRvdm'
            example:
              metadata:
                id: a2b3c4d5-e6f7-8901-bcde-f01234567891
                topic: plugin.transaction.recipient.verification.rvdm.failure
                topic_description: Recipient Verification Data Matching - Failure
                timestamp: 1629390500
                version: '1'
              data:
                ancillary:
                  notification_id: '123456789012345'
                  party_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  participant_unique_id1: 39eef189-dd96-49e4-80d3-6346240c427a
                  session_id: sess-abc123
                event:
                  status: '1105'
                  client_message: RVDM Failure
                  attempt_count: 3
                  max_attempts: 3
                  has_passed: false
                  was_skipped: false
                  field_results:
                    - field_name: last_name
                      is_matching: false
                      is_enabled: true
                      was_evaluated: true
                      client_provided_value: Smith
                      customer_provided_value: Jones
                      hard_fail_on_mismatch: true
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  gateway.transaction.recipient.verification.ofac.status.suspended:
    post:
      operationId: iframe_ofac_suspended
      summary: OFAC Screening — Suspended
      description: >
        An initial OFAC screening hit has suspended payment processing. Payload
        schema is identical to the IngoPay API event of the same topic name. See
        `ingopay-webhooks.yaml` for the canonical schema.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookOfacNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  gateway.transaction.recipient.verification.ofac.status.cleared:
    post:
      operationId: iframe_ofac_cleared
      summary: OFAC Screening — Cleared
      description: >
        A previously suspended transaction has cleared OFAC review. Payload
        identical to the IngoPay API event of the same topic name.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookOfacNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  gateway.transaction.recipient.verification.ofac.status.failure:
    post:
      operationId: iframe_ofac_failure
      summary: OFAC Screening — Failure
      description: >
        OFAC hit confirmed. Transaction terminated. Payload identical to the
        IngoPay API event of the same topic name.
      tags:
        - Recipient Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookOfacNoPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.account.verification.card.cns_cd.failure:
    post:
      operationId: iframe_card_cns_cd
      summary: Card Verification — CNS / Check Digit Failure
      description: >
        Card Not Supported (CNS) or Check Digit (CD) validation failed. Status
        700 = Card Not Supported, 1042 = Check Digit Validation Failure.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoAdditionalPayload'
            example:
              metadata:
                id: b3c4d5e6-f7a8-9012-cdef-012345678912
                topic: plugin.transaction.account.verification.card.cns_cd.failure
                topic_description: Account Verification - Card - CNS/CD
                timestamp: 1629391000
                version: '1'
              data:
                ancillary:
                  notification_id: '123456789012345'
                  party_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  participant_unique_id1: 39eef189-dd96-49e4-80d3-6346240c427a
                  session_id: sess-abc123
                event:
                  status: '700'
                  client_message: Card Not Supported
                  attempt_count: 1
                  max_attempts: 3
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.account.verification.card.avs_cvv.failure:
    post:
      operationId: iframe_card_avs_cvv
      summary: Card Verification — AVS / CVV Failure
      description: >
        Address Verification Service (AVS) or Card Verification Value (CVV)
        validation failed. AVS hard failure codes: 753–760, 764. CVV failure:
        765.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoAdditionalPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.account.verification.ach.rnv.failure:
    post:
      operationId: iframe_ach_rnv
      summary: ACH Verification — Routing Number Validation Failure
      description: |
        Routing Number Validation (RNV) failed. Status 743.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoAdditionalPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.account.verification.ach.anv.failure:
    post:
      operationId: iframe_ach_anv
      summary: ACH Verification — Account Number Validation Failure
      description: |
        Account Number Validation (ANV) failed. Hard failure codes: 767–769.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoAdditionalPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.account.verification.ach.nav.failure:
    post:
      operationId: iframe_ach_nav
      summary: ACH Verification — Name on Account Validation Failure
      description: |
        Name on Account Validation (NAV) failed. Hard failure codes: 776–779.
      tags:
        - Account Verification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookNoAdditionalPayload'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.account.verification.paypal.success.av:
    post:
      operationId: iframe_paypal_av_success
      summary: PayPal Account Verification — Success
      description: >
        PayPal account verification succeeded or resulted in a soft failure.
        Status 1148 = PayPal AV Success, 1149 = PayPal AV 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.
  plugin.transaction.account.verification.paypal.failure.av:
    post:
      operationId: iframe_paypal_av_failure
      summary: PayPal Account Verification — Failure
      description: |
        PayPal account verification failed. 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.
  plugin.transaction.account.tokenization.success:
    post:
      operationId: iframe_tokenization_success
      summary: Account Tokenization — Success
      description: >
        A recipient disbursement account has been successfully tokenized. The
        `customer_account_token` in the event payload is the value to store and
        use for subsequent process payment funding requests via the IngoPay API.
        Status 100 = Success, or any soft failure code from account validation
        (AVS, ANV, NAV).
      tags:
        - Account Tokenization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookTokenization'
            example:
              metadata:
                id: c4d5e6f7-a8b9-0123-def0-123456789013
                topic: plugin.transaction.account.tokenization.success
                topic_description: Account Tokenization - Success
                timestamp: 1629392000
                version: '1'
              data:
                ancillary:
                  notification_id: '123456789012345'
                  party_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  participant_unique_id1: 39eef189-dd96-49e4-80d3-6346240c427a
                  session_id: sess-abc123
                event:
                  status: '100'
                  client_message: Success
                  attempt_count: 1
                  max_attempts: 3
                  customer_account_token: tok_abc123def456ghi789
                  account_type: CA
                  last_4: '1234'
                  expiration_date: '2612'
                  bin: '411111'
                  account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  issuers:
                    - payee_id: '10001'
                      payee_name: Example Bank
                      payee_address: ''
                      payee_city: ''
                      payee_state: ''
                      payee_zip: ''
                      issuing_network: Visa
                      credit_enabled: 1
                      debit_enabled: 1
                      credit_info:
                        min: '1.00'
                        max: '5000.00'
                        card_type: debit
                        estimated_posting_time: Your payment will post within 5 minutes.
                        estimated_posting_date: 04/27/2026
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  gateway.transaction.recipient.payment.status.returned:
    post:
      operationId: iframe_payment_returned
      summary: Payment Returned by Issuer
      description: >
        A previously completed payment has been returned by the account issuer.
        This is a terminal event. Payload schema is identical to the IngoPay API
        event of the same topic name.
      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.notice.settlement.adjustment:
    post:
      operationId: iframe_settlement_adjustment
      summary: Settlement Adjustment
      description: >
        A settlement adjustment transaction has been created that will debit or
        credit the client settlement account.
      tags:
        - Recipient Payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookSettlementAdjustment'
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.session.request.expired:
    post:
      summary: Session Request Expired
      description: Fired when an iFrame plugin session expires without being completed.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - metadata
                - data
              properties:
                metadata:
                  $ref: '#/components/schemas/WebhookMetadata'
                data:
                  type: object
                  required:
                    - ancillary
                    - event
                  properties:
                    ancillary:
                      $ref: '#/components/schemas/WebhookAncillaryIngoPay'
                    event:
                      $ref: '#/components/schemas/WebhookEventBase'
            example:
              metadata:
                id: prod1-123456-abcd-1234-ab12-c123d456e789
                topic: plugin.transaction.session.request.expired
                topic_description: >-
                  This event reports that the requested plugin session has
                  expired
                timestamp: 1752005906
                version: '1'
              data:
                ancillary:
                  tracer_token: 9999999abc-9abc-acb9-cab9999999999
                  session_id: 111111111-2222-3333333-4444444444
                  participant_unique_id1: 22222222-5555-3333333-4444444444
                  participant_unique_id2: 111111111-2222-3333333-4444444444
                event:
                  status: '1128'
                  client_message: Session Request Expired
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
  plugin.transaction.session.request.terminated:
    post:
      summary: Session Request Terminated
      description: >-
        Fired when the overall maximum account verification attempt limit is
        exceeded, terminating the session.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - metadata
                - data
              properties:
                metadata:
                  $ref: '#/components/schemas/WebhookMetadata'
                data:
                  type: object
                  required:
                    - ancillary
                    - event
                  properties:
                    ancillary:
                      $ref: '#/components/schemas/WebhookAncillaryIngoPay'
                    event:
                      $ref: '#/components/schemas/WebhookEventBase'
            example:
              metadata:
                id: prod1-123456-abcd-1234-ab12-c123d456e789
                topic: plugin.transaction.session.request.terminated
                topic_description: Overall max account verification attempts limit exceeded
                timestamp: 1752005355
                version: '1'
              data:
                ancillary:
                  tracer_token: 9999999abc-9abc-acb9-cab9999999999
                  session_id: 111111111-2222-3333333-4444444444
                  participant_unique_id1: 22222222-5555-3333333-4444444444
                  participant_unique_id2: 111111111-2222-3333333-4444444444
                event:
                  status: '1127'
                  client_message: Overall max account verification attempts limit exceeded
      responses:
        default:
          description: >-
            Return any 2xx status to acknowledge receipt. Ingo does not evaluate
            the response body.
components:
  schemas:
    WebhookMetadata:
      type: object
      required:
        - id
        - topic
        - topic_description
        - timestamp
        - version
      properties:
        id:
          type: string
          maxLength: 50
          description: |
            Ingo-assigned unique delivery ID. Use as your idempotency key.
        topic:
          type: string
          maxLength: 150
        topic_description:
          type: string
          maxLength: 250
        timestamp:
          type: integer
        version:
          type: string
          maxLength: 5
          example: '1'
    WebhookAncillaryIFrame:
      type: object
      required:
        - notification_id
        - party_id
        - participant_unique_id1
      properties:
        notification_id:
          type: string
          maxLength: 15
        party_id:
          type: string
          maxLength: 36
          description: Ingo-assigned unique ID for a party to the transaction.
        tracer_token:
          type: string
          maxLength: 250
          nullable: true
        session_id:
          type: string
          maxLength: 50
          nullable: true
        participant_unique_id1:
          type: string
          maxLength: 100
        participant_unique_id2:
          type: string
          maxLength: 100
          nullable: true
        enterprise:
          type: object
          description: Additional data for clients using the enterprise product.
    WebhookEventBase:
      type: object
      required:
        - status
        - client_message
      properties:
        status:
          type: string
          maxLength: 10
        client_message:
          type: string
          maxLength: 250
        attempt_count:
          type: integer
        max_attempts:
          type: integer
    WebhookNoAdditionalPayload:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIFrame'
            event:
              $ref: '#/components/schemas/WebhookEventBase'
    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
    WebhookRvdm:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIFrame'
            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/FieldResultRvdm'
    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
        paypal_provided_value:
          type: string
          maxLength: 150
        hard_fail_on_mismatch:
          type: boolean
    WebhookPaypalVerification:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIFrame'
            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/FieldResultPaypal'
    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 account was issued under. "NA" if not known.
        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
          properties:
            validation_provider_id:
              type: string
              maxLength: 3
            name_validation:
              type: object
              properties:
                name_match_status:
                  type: string
                  maxLength: 3
                name_match_decision:
                  type: string
                  maxLength: 3
                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 Finicity open banking is configured.
          properties:
            customer_id:
              type: string
              maxLength: 50
            account_id:
              type: string
              maxLength: 50
    WebhookTokenization:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIFrame'
            event:
              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: >
                        Store this token for subsequent IngoPay API process
                        payment funding requests.
                    account_type:
                      type: string
                      maxLength: 2
                      enum:
                        - CA
                        - AC
                        - BP
                      description: CA = Card, AC = ACH, BP = BillerPayee
                    last_4:
                      type: string
                      maxLength: 4
                    expiration_date:
                      type: string
                      maxLength: 4
                      description: YYMM format. Card accounts only.
                    bin:
                      type: string
                      maxLength: 8
                      description: Bank Identification Number. Card accounts only.
                    account_id:
                      type: string
                      maxLength: 36
                    issuers:
                      type: array
                      items:
                        $ref: '#/components/schemas/IssuerObject'
    WebhookSettlementAdjustment:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIFrame'
            event:
              allOf:
                - $ref: '#/components/schemas/WebhookEventBase'
                - type: object
                  required:
                    - adjustment_type
                  properties:
                    adjustment_type:
                      type: string
                      maxLength: 20
                      enum:
                        - Credit
                        - Debit
                      description: >
                        Credit = credit client settlement account. Debit = debit
                        client settlement account.
    WebhookOfacNoPayload:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIngoPay'
            event:
              $ref: '#/components/schemas/WebhookEventBase'
    WebhookPaymentReturned:
      type: object
      required:
        - metadata
        - data
      properties:
        metadata:
          $ref: '#/components/schemas/WebhookMetadata'
        data:
          type: object
          required:
            - ancillary
            - event
          properties:
            ancillary:
              $ref: '#/components/schemas/WebhookAncillaryIngoPay'
            event:
              allOf:
                - $ref: '#/components/schemas/WebhookEventBase'
                - type: object
                  required:
                    - return_transaction_id
                    - reason_code
                    - reason_description
                  properties:
                    return_transaction_id:
                      type: string
                      maxLength: 15
                    reason_code:
                      type: string
                      maxLength: 10
                    reason_description:
                      type: string
                      maxLength: 250
    WebhookAncillaryIngoPay:
      type: object
      required:
        - participant_unique_id1
      properties:
        notification_id:
          type: string
          maxLength: 15
          description: Ingo-assigned unique identifier for the original transaction.
        party_id:
          type: string
          maxLength: 36
          nullable: true
          description: Ingo-assigned unique ID for a party to the transaction.
        tracer_token:
          type: string
          maxLength: 250
          nullable: true
        session_id:
          type: string
          maxLength: 50
          nullable: true
        participant_unique_id1:
          type: string
          maxLength: 100
          description: >-
            Participant-provided unique identifier from the original
            transaction.
        participant_unique_id2:
          type: string
          maxLength: 100
          nullable: true
