JPMorgan Chase Payment Holds API

Manage Payment Holds

Operations 4

GET /holds Retrieve Payment Holds #
GET /holds/{id} Retrieve details of a payment hold #
POST /holds/{id}/decision Decision Single Payment Hold #
POST /holds/decision/bulk Decision Multiple Payment Holds (Bulk) #

Documentation

📖
Documentation
https://developer.payments.jpmorgan.com/api
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fembedded-finance-solutions%2Fembedded-payments%2Fonboarding-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Foptimization-protection%2Fconsumer-profile%2Fconsumer-profile-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Foptimization-protection%2Ftokenization%2Ftokenization-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Foptimization-protection%2Freporting%2Freporting-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Ftreasury%2Freceivables%2Frequest-to-pay-api.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Fonline-payments%2Fcheckout%2Fcheckout-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Fdispute-management%2Fdispute-management-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Ffraud-solutions%2Falerts-and-decisioning%2Foas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Fproduct-configuration%2Fproduct-configuration-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Foptimization-protection%2F3-d-secure%2F3-d-secure-1.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Foptimization-protection%2Faccount-updater%2Faccount-updater-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Ftreasury%2Fglobal-payments%2Fglobal-payments%2Fglobal-payments-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fliquidity-account-solutions%2Fbda-balances%2Faccounts-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Ffraud-solutions%2Fvalidation-services%2Fvalidation-services-oas.md
📖
APIReference
https://developer.payments.jpmorgan.com/api/llm-content?path=en%2Fapi%2Fcommerce%2Foptimization-protection%2Fwallet-decryption%2Fwallet-decryption-oas.md

Specifications

Work with this as data

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

MCP server

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

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/jp-morgan-chase-payment-holds-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

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

Get an API key

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

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

OpenAPI Specification

jp-morgan-chase-payment-holds-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Alerts and Decisioning Payment Holds API
  version: 1.0.5
  contact:
    name: JPMorgan Chase & Co. API support
    email: ismd.security.operations@jpmorgan.com
    url: https://apistore.jpmchase.net/support/contact
  description: 'Programmatically receives and decisions Payment Holds, automating your fraud review and hold resolution workflow to minimize operational delays while adhering to corporate IT standards.

    '
servers:
- url: https://api.payments.jpmorgan.com/trust-safety/v1
  description: PRODUCTION - MTLS
- url: https://api-cat.payments.jpmorgan.com/trust-safety/v1
  description: CLIENT TESTING - MTLS
- url: https://api-mock.payments.jpmorgan.com/trust-safety/v1
  description: MOCK
tags:
- name: Payment Holds
  description: Manage Payment Holds
paths:
  /holds:
    get:
      summary: Retrieve Payment Holds
      description: '**Retrieve payment holds**


        Returns a paginated list of payment holds, optionally filtered by status, substatus, and date range.


        #### Filtering by `status` vs `substatus`

        The `status` and `substatus` query parameters are **mutually exclusive** — you may use one or the other, but not both in the same request. If both are provided, the API will return a `400 Bad Request` error.


        Use **`status`** for broad filtering based on the high-level state of a hold:


        | Value | Description |

        |-------|-------------|

        | `PENDING` | Returns all holds awaiting a decision, regardless of whether they are pending client action or bank review |

        | `APPROVED` | Returns holds that have been approved |

        | `REJECTED` | Returns holds that have been rejected. Can use both `APPROVED` and `REJECTED` together to retrieve all decisioned holds. |


        Use **`substatus`** for more granular filtering when you need to distinguish _who_ needs to act or _how_ a hold was resolved:


        | Value | Description |

        |-------|-------------|

        | `PENDING_ACTION_CLIENT` | Holds awaiting a decision by the client |

        | `PENDING_ACTION_JPM` | Holds under review by the bank |


        Can also use substatus to filter for holds decisioned by specific entity (client or JPM) or for a particular reason.


        If neither parameter is provided, holds across all statuses are returned.

        '
      tags:
      - Payment Holds
      operationId: getPaymentHolds
      x-parameter-constraints:
      - type: mutually-exclusive
        params:
        - status
        - substatus
      parameters:
      - $ref: '#/components/parameters/Status'
      - $ref: '#/components/parameters/substatus'
      - $ref: '#/components/parameters/StartDateTime'
      - $ref: '#/components/parameters/EndDateTime'
      - $ref: '#/components/parameters/Sort'
      - $ref: '#/components/parameters/Offset'
      - $ref: '#/components/parameters/PageSize'
      responses:
        '200':
          description: Retrieve Payment Holds
          headers:
            Cache-Control:
              schema:
                type: string
                default: no-store
              description: Caching directive for sensitive financial data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentHolds'
              examples:
                Pending Client Action:
                  $ref: '#/components/examples/PendingClientDecisionResponse'
                Pending JPM Review:
                  $ref: '#/components/examples/PendingBankDecisionResponse'
                Pending Bank Or Client Decision:
                  $ref: '#/components/examples/PendingBankOrClientDecisionResponse'
                Already Decisioned:
                  $ref: '#/components/examples/AlreadyDecisionedResponse'
        '400':
          description: "Bad Request. \n\n**List of error codes and descriptions**\n\n| Error Code      |          Description                           |\n| --------------  |------------------------------------------------|\n| 10001           | Mandatory field missing or invalid             |\n| 10103           | Bad Format                                      |\n| 10104           | Bad Value                                      |\n| 10108           | Mutually exclusive fields violation            |"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Bad Status:
                  $ref: '#/components/examples/BadIdentifier'
                Filter By Status And Substatus (Not Allowed):
                  $ref: '#/components/examples/FilterByStatusAndSubstatusErrorResponse'
        '401':
          $ref: '#/components/responses/401-Unauthorized'
        '403':
          $ref: '#/components/responses/403-Forbidden'
        '429':
          $ref: '#/components/responses/429-TooManyRequests'
        '503':
          $ref: '#/components/responses/503-ServiceUnavailable'
  /holds/{id}:
    get:
      summary: Retrieve details of a payment hold
      description: '**Retrieve details of a single payment hold by identifier**'
      tags:
      - Payment Holds
      operationId: getPaymentHoldDetails
      parameters:
      - name: id
        in: path
        description: Unique identifier for the payment hold
        required: true
        schema:
          $ref: '#/components/schemas/Uuid'
        examples:
          By Id:
            value: 06bca14f-1fc0-4cd7-9e0b-8bb7e06334f7
      responses:
        '200':
          description: Payment Hold Details
          headers:
            Cache-Control:
              schema:
                type: string
                default: no-store
              description: Caching directive for sensitive financial data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentHold'
              examples:
                Wire Transfer:
                  $ref: '#/components/examples/RetrieveSingleHoldResponse'
                ACH Distributed:
                  $ref: '#/components/examples/RetrieveSingleHoldAchDistributedResponse'
        '400':
          description: 'Bad Request.


            **List of error codes and descriptions**


            | Error Code      |          Description                           |

            | --------------  |------------------------------------------------|

            | 10103           | Bad Format                                      |

            | 11004           | Wrong channel for hold                          |'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Bad Identifier:
                  $ref: '#/components/examples/BadIdentifier'
                Wrong Channel:
                  value:
                    title: Bad Request
                    httpStatus: 400
                    traceId: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
                    requestId: 123e4567-e89b-12d3-a456-426614174000
                    context:
                    - code: '11004'
                      message: Wrong channel for hold
        '401':
          $ref: '#/components/responses/401-Unauthorized'
        '403':
          $ref: '#/components/responses/403-Forbidden'
        '404':
          $ref: '#/components/responses/404-NotFound'
        '429':
          $ref: '#/components/responses/429-TooManyRequests'
        '503':
          $ref: '#/components/responses/503-ServiceUnavailable'
  /holds/{id}/decision:
    post:
      summary: Decision Single Payment Hold
      description: '**Decision Single Payment Hold**

        This endpoint allows users to take action on a single payment hold by approving or rejecting it.  Users can specify the decision action (APPROVE or REJECT), provide a reason for rejection, and  indicate the type of confirmed fraud if applicable. For bulk processing of multiple hold decisions,  use the `/holds/decision/bulk` endpoint instead.'
      tags:
      - Payment Holds
      operationId: decisionPaymentHold
      parameters:
      - name: id
        in: path
        description: Unique identifier for the payment hold
        required: true
        schema:
          $ref: '#/components/schemas/Uuid'
        examples:
          Approve:
            value: f1c2b3a4-5d6e-4f70-8a9c-1234abcd5678
          Reject:
            value: 550e8400-e29b-41d4-a716-446655440000
          Expired:
            value: 9b1d3f2a-6c8e-4f5a-9d2b-3e7a1c4b8d90
          Already Decisioned:
            value: 3d6f9a2c-5e47-4b1f-8c3a-0d2e7f9b6a10
      requestBody:
        required: true
        description: Hold Action
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecisionActionRequest'
            examples:
              Approve:
                $ref: '#/components/examples/HoldDecisionApproveActionRequest'
              Reject:
                $ref: '#/components/examples/HoldDecisionRejectActionRequest'
              Incorrect Field Values:
                $ref: '#/components/examples/HoldBadValuesRequest'
      responses:
        '200':
          description: Decision response for the payment hold action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionResponse'
              examples:
                Approve:
                  $ref: '#/components/examples/HoldDecisionApproveActionResponse'
                Reject:
                  $ref: '#/components/examples/HoldDecisionRejectActionResponse'
        '400':
          description: "Bad Request. \n\n**List of error codes and descriptions**\n\n| Error Code      |          Description                                     |\n| --------------  |----------------------------------------------------------|\n| 10001           | Mandatory field missing                                  |\n| 10103           | Bad format                                               |\n| 10104           | Bad Value                                                |\n| 11003           | Field only allowed for specific value of other field     |"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Bad Identifier:
                  $ref: '#/components/examples/BadIdentifier'
        '401':
          $ref: '#/components/responses/401-Unauthorized'
        '403':
          $ref: '#/components/responses/403-Forbidden'
        '404':
          $ref: '#/components/responses/404-NotFound'
        '409':
          description: 'Conflict


            **List of error codes and descriptions**


            | Error Code      |           Description                          |

            | --------------  |------------------------------------------------|

            | 11000           | Hold has expired                               |

            | 11001           | Hold already decisioned                        |

            | 11004           | Wrong channel for hold                         |


            **Hold Already Decisioned (11001):** A payment hold may only be decisioned once. In rare cases, two users may attempt to decision the same hold at nearly the same time. When this occurs, only the first request will succeed — the subsequent request will receive a `409 Conflict` with error code `11001`. While this scenario is uncommon, API consumers must handle this response gracefully.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Expired:
                  $ref: '#/components/examples/HoldExpiredResponse'
                Already Decisioned:
                  $ref: '#/components/examples/HoldAlreadyDecisionedResponse'
                Wrong Channel:
                  value:
                    title: Conflict
                    httpStatus: 409
                    traceId: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
                    requestId: 123e4567-e89b-12d3-a456-426614174000
                    context:
                    - code: '11004'
                      message: Wrong channel for hold
                Incorrect Field Values:
                  $ref: '#/components/examples/HoldBadValuesResponse'
        '429':
          $ref: '#/components/responses/429-TooManyRequests'
        '503':
          $ref: '#/components/responses/503-ServiceUnavailable'
  /holds/decision/bulk:
    post:
      summary: Decision Multiple Payment Holds (Bulk)
      description: '**Decision Multiple Payment Holds (Bulk)**

        This endpoint allows users to take action on multiple payment holds simultaneously by approving or rejecting them.  The API supports batch processing of multiple hold decisions, enabling efficient processing of large volumes of holds.  Each decision in the batch can have its own action (APPROVE or REJECT), rejection reason, and confirmed fraud type.  For processing a single hold decision, use the `/holds/{id}/decision` endpoint instead.'
      tags:
      - Payment Holds
      operationId: decisionPaymentHoldsBulk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecisionBulkRequest'
            examples:
              Mixed Results:
                $ref: '#/components/examples/HoldDecisionManyRequest'
      responses:
        '200':
          description: Bulk response object containing decision responses for each hold
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionBulkResponse'
              examples:
                Mixed Results:
                  $ref: '#/components/examples/HoldDecisionManyResponse'
        '400':
          description: 'Bad Request.


            **List of error codes and descriptions**


            | Error Code      |          Description                           |

            | --------------  |------------------------------------------------|

            | 10001           | Mandatory field missing or invalid             |

            | 10103           | Bad Format                                      |

            | 10104           | Bad Value                                      |'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Bad Identifier:
                  $ref: '#/components/examples/BadIdentifier'
        '401':
          $ref: '#/components/responses/401-Unauthorized'
        '403':
          $ref: '#/components/responses/403-Forbidden'
        '409':
          description: 'Conflict


            **List of error codes and descriptions**


            | Error Code      |           Description                          |

            | --------------  |------------------------------------------------|

            | 11000           | Hold has expired                               |

            | 11001           | Hold already decisioned                        |'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Expired:
                  $ref: '#/components/examples/HoldExpiredResponse'
                Already Decisioned:
                  $ref: '#/components/examples/HoldAlreadyDecisionedResponse'
        '429':
          $ref: '#/components/responses/429-TooManyRequests'
        '503':
          $ref: '#/components/responses/503-ServiceUnavailable'
components:
  schemas:
    FailureReason:
      type: object
      title: FailureReason
      description: Failure reason details with code and message
      properties:
        code:
          type: string
          description: Error code that identifies the failure reason
          minLength: 1
          maxLength: 50
        message:
          type: string
          description: Human readable textual description of the failure
          minLength: 1
          maxLength: 500
      example:
        code: '10001'
        message: Invalid hold version provided
    AdditionalContext:
      title: Additional Context
      type: array
      description: Additional details about the error based on a standard (e.g. ISO or Clearing codes)
      items:
        $ref: '#/components/schemas/StandardCodeContext'
      minItems: 1
      maxItems: 5
    PaymentHolds:
      type: object
      title: PaymentHolds
      description: List of Payment Holds
      properties:
        items:
          type: array
          minItems: 0
          maxItems: 25
          items:
            $ref: '#/components/schemas/PaymentHold'
        metadata:
          title: PaymentHoldsMetadata
          type: object
          description: Contains pagination information to move through the result set
          properties:
            pagination:
              $ref: '#/components/schemas/Pagination'
            asOf:
              type: string
              format: date-time
              description: Format - `YYYY-MM-DDThh:mm:ss`+/-time offset to UTC
      required:
      - items
      - metadata
    UnstructuredAddress:
      title: UnstructuredAddress
      type: array
      description: Unstructured Addresses
      minItems: 1
      maxItems: 7
      items:
        type: string
        minLength: 1
        maxLength: 70
    IndividualIdentification:
      type: object
      title: Individual Identification
      description: Individual Identification Schemes
      required:
      - individualIds
      properties:
        individualIds:
          type: array
          minItems: 1
          maxItems: 16
          items:
            $ref: '#/components/schemas/IndividualId'
    Error:
      type: object
      x-tags:
      - common-error-model
      - common-components
      title: Error
      description: Common Error Model
      properties:
        title:
          type: string
          title: Short humanly-readable title of the error.
          minLength: 1
          maxLength: 100
        httpStatus:
          type: integer
          format: int32
          minimum: 100
          maximum: 599
          default: 400
          title: HTTP Status Code
        traceId:
          type: string
          title: JPMC Assigned traced identifier
          minLength: 1
          maxLength: 100
        requestId:
          type: string
          title: The 'client originated' requestId
          minLength: 1
          maxLength: 100
        context:
          type: array
          title: Provides additional context and detail on the validation errors
          items:
            $ref: '#/components/schemas/ErrorContext'
          minItems: 1
          maxItems: 100
      required:
      - title
      readOnly: true
    UltimateCreditor:
      title: UltimateCreditor
      type: object
      description: Represents the ultimate beneficiary of the funds in the payment transaction. This is the final recipient who will receive the funds, even if the payment is credited to an intermediary account first. This schema captures all relevant identifying and account details of the ultimate creditor.
      allOf:
      - $ref: '#/components/schemas/Party'
    UltimateDebtor:
      title: UltimateDebtor
      type: object
      description: Represents the ultimate party responsible for the payment, who is the original source of funds in the transaction, even if the payment is made on their behalf by another party. This schema captures all relevant identifying and account details of the ultimate debtor.
      allOf:
      - $ref: '#/components/schemas/Party'
    AdditionalInstitutions:
      title: AdditionalInstitutions
      type: array
      description: Additional Institutions
      minItems: 1
      maxItems: 100
      items:
        $ref: '#/components/schemas/AdditionalInstitution'
    TransferType:
      title: TransferType
      type: string
      enum:
      - CREDIT
      - DEBIT
      description: 'Indicates the direction of the money movement. The transaction is either a `credit` push transfer or a direct `debit` pull transfer.


        | Market/Instrument | Transfer Type |

        |-------------------|---------------|

        | Credit Transfers | CREDIT |

        | Direct-Debits | DEBIT |

        '
    EndToEndId:
      type: string
      title: EndToEndId
      minLength: 1
      maxLength: 128
      x-faker: random.uuid
      description: 'Customer assigned Unique identifier to unambiguously identify the Payment transaction.

        This identification is passed on, unchanged, throughout the entire end-to-end chain.'
      example: AD202109311354152
    StreetName:
      title: StreetName
      type: string
      description: Street name
      minLength: 1
      maxLength: 70
      example: Main St
    PaymentIdentifiers:
      type: object
      title: PaymentIdentifiers
      description: Identifiers associated with the Payment Instruction throughout its lifecycle.
      required:
      - endToEndId
      properties:
        endToEndId:
          $ref: '#/components/schemas/EndToEndId'
        otherPaymentReferences:
          type: object
          title: OtherPaymentReferences
          description: Other Payment Reference Identifiers
          properties:
            relatedReferenceId:
              type: string
              description: Related reference Identifier, applicable for ACH and WIRES only.
            uetr:
              type: string
              description: A Unique End-to-end Transaction Reference (commonly known as a UETR) is a string of 36 unique characters featured in all payment instruction messages carried over SWIFT.
          minProperties: 1
    PaymentType:
      title: PaymentType
      type: string
      enum:
      - WIRE
      - ACH
      - RTP
      description: The type of payment being initiated - **WIRE** for Wire Payments, **ACH** for ACH Payments, **RTP** for Real-Time Payments
    DecisionBulkResponse:
      type: object
      title: DecisionBulkResponse
      description: Bulk response for multiple payment hold decisions
      properties:
        items:
          type: array
          minItems: 0
          maxItems: 25
          items:
            $ref: '#/components/schemas/DecisionResponse'
      example:
        items:
        - holdId: 550e8400-e29b-41d4-a716-446655440000
          result: SUCCESS
          status: REJECTED
          substatus: REJECTED_FRAUD_CLIENT
        - holdId: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
          result: FAILURE
          failureReason:
            code: '10001'
            message: Invalid hold version provided
    FinancialInstitutionIdType:
      type: string
      enum:
      - BIC
      - USABA
      - SORT_CODE
      - CLEARING_SYSTEM_ID
    Fraud:
      type: object
      title: Fraud
      description: 'Fraud details associated with a rejected payment hold. Only present when `rejectReason` is `FRAUD`.

        '
      properties:
        type:
          $ref: '#/components/schemas/FraudType'
        additionalInformation:
          type: string
          description: Free-form text providing additional context about the fraud. Recommended when `type` is `OTHER`.
          minLength: 1
          maxLength: 500
    Distribution:
      title: Distribution
      description: 'Describes distribution details for ACH payment hold.  JPM might distribute the payment after a hold is created,but

        before the hold is decisioned.  You should still decision the hold.  If you choose `REJECT`, that will kick off a

        back office process to recover the funds.


        This field is only present when `paymentType` is `ACH`

        '
      type: object
      properties:
        isDistributed:
          type: boolean
          description: Indicates whether the ACH payment has been distributed.
          default: false
        distributedAt:
          type: string
          description: The date and time at which the ACH payment was distributed. Format - `YYYY-MM-DDThh:mm:ss`+/-time offset to UTC. Only present when `isDistributed` is `true`.
          format: date-time
    DecisionRejectReason:
      type: string
      description: 'Reason for REJECT action. Only populated for action=REJECT and when status=REJECTED.


        If the reason is "Fraud", additional fraud details should be provided in the `fraud` field.


        | Enum Value | Description |

        |------------|-------------|

        | TRANSACTION_NO_LONGER_NEEDED | The transaction is no longer required by the client |

        | DUPLICATE_TRANSACTION | The transaction is a duplicate of another payment |

        | INCORRECT_BENEFICIARY | The beneficiary details are incorrect or invalid |

        | FRAUD | Fraud is suspected; requires `fraud` field |

        '
      enum:
      - TRANSACTION_NO_LONGER_NEEDED
      - DUPLICATE_TRANSACTION
      - INCORRECT_BENEFICIARY
      - FRAUD
    IsoCountryCode:
      title: IsoCountryCode
      type: string
      description: ISO 3166-1 Alpha-2 Country Code
      minLength: 2
      maxLength: 2
      pattern: ^[A-Z]{2}$
      example: AU
    InitiatingParty:
      title: InitiatingParty
      type: object
      description: The financial institution or agent that initiates the payment or transaction on behalf of the ordering party.
      allOf:
      - $ref: '#/components/schemas/Party'
    DecisionSubstatus:
      type: string
      description: 'Substatus providing additional detail on the current state of the payment hold.


        | Enum Value | Description |

        |------------|-------------|

        | PENDING_ACTION_CLIENT | Payment is pending a decision by client. Payment held until decision is made, at which time it can be released or canceled depending on decision |

        | PENDING_ACTION_JPM | Payment is pending a decision by bank. Only bank can release or reject this payment |

        | APPROVED_CLIENT | Hold has been approved by client |

        | APPROVED_JPM | Hold has been approved by the bank |

        | REJECTED_FRAUD_CLIENT | Hold marked as fraud by client |

        | REJECTED_FRAUD_JPM | Fraud has been confirmed by bank |

        | REJECTED_AUTO_CANCELLED_JPM | Payment was automatically cancelled by JPM due to expiration |

        | REJECTED_TXN_NOT_NEEDED_CLIENT | Payment rejected as transaction is not needed by client |

        | REJECTED_TXN_NOT_NEEDED_JPM | Payment rejected as transaction is not needed by bank |

        | REJECTED_DUPLICATE_TXN_CLIENT | Payment rejected as duplicate transaction by client |

        | REJECTED_DUPLICATE_TXN_JPM | Payment rejected as duplicate transaction by bank |

        | REJECTED_INCORRECT_BENEFICIARY_CLIENT | Payment rejected due to incorrect beneficiary by client |

        | REJECTED_INCORRECT_BENEFICIARY_JPM | Payment rejected due to incorrect beneficiary by bank |

        '
      enum:
      - PENDING_ACTION_CLIENT
      - PENDING_ACTION_JPM
      - APPROVED_CLIENT
      - APPROVED_JPM
      - REJECTED_FRAUD_CLIENT
      - REJECTED_FRAUD_JPM
      - REJECTED_AUTO_CANCELLED_JPM
      - REJECTED_TXN_NOT_NEEDED_CLIENT
      - REJECTED_TXN_NOT_NEEDED_JPM
      - REJECTED_DUPLICATE_TXN_CLIENT
      - REJECTED_DUPLICATE_TXN_JPM
      - REJECTED_INCORRECT_BENEFICIARY_CLIENT
      - REJECTED_INCORRECT_BENEFICIARY_JPM
    IntermediaryAgent:
      title: IntermediaryAgent
      type: object
      description: 'An agent between the debtor''s agent and the creditor''s agent. Usage: If more than one intermediary agent is present, then IntermediaryAgent1 identifies the agent between the DebtorAgent and the IntermediaryAgent2.'
      properties:
        name:
          type: string
          description: Name of the agent
          minLength: 1
          maxLength: 140
        financialInstitutionIds:
          type: array
          minItems: 1
          maxItems: 3
          items:
            $ref: '#/components/schemas/FinancialInstitutionId'
        postalAddress:
          $ref: '#/components/schemas/Address'
    BasicParty:
      title: BasicParty
      type: object
      description: A party is an entity involved in a financial transaction. This entity can be an individual, a corporation, or any other organization that participates in the transaction.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 140
          description: Party name
        postalAddress:
          $ref: '#/components/schemas/Address'
        dateAndPlaceOfBirth:
          type: object
          title: DateAndPlaceOfBirth
          description: Date and place of birth
          properties:
            birthDate:
              type: string
              format: date
              description: Date of birth
            city:
              type: string
              minLength: 1
              maxLength: 35
              description: City of birth
            country:
              $ref: '#/components/schemas/IsoCountryCode'
        countryOfResidence:
          $ref: '#/components/schemas/IsoCountryCode'
    IsoCurrencyCode:
      title: IsoCurrencyCode
      type: string
      description: ISO 4217 Alpha-3 Currency Code
      minLength: 3
      maxLength: 3
      pattern: ^[A-Z]{3}$
      example: AUD
    OrganizationId:
      title: OrganizationId
      type: object
      required:
      - organizationId
      description: "Collection of registration information held against the party.\nIt can be used when the underlying payer is a Legal Entity. It should be used together with Ultimate Debtor Name and address, and it should contain the payment account number of the underlying payer. In case the transfer has not been initiated from a payment account, the value populated should be a unique transaction identifier of the underlying payer which permits the traceability of the transaction back to them.\n\nApplicable markets and rules: - Can be used for ultimateDebtor and ultimateCreditor for the following RTP markets:\n  - SEPA \n  - Mexico \n  - UK\n  - United States\n\n***Australia Faster Payments - Only to be used for ultimateCreditor. For Australia Faster Payments, only id and schemeName.proprietary fields are applicable\nWIRE Payments:\n  - WHEM\n  - LATAM\n  - EMEA\n  - APAC"
      properties:
        organizationId:
          type: string
          minLength: 1
          maxLength: 35
          description: 'Formally Issued Organization Identifier - **Note**: For AU Superannuation payment (category payment), populate with USI number for the Superannuation fund.'
        bic:
          type: string
          description: "Business Identifier Code, mean a unique code to identify \nany business as defined by the ISO9362 standard. "
          minLength: 8
          maxLength: 11
        lei:
          type: string
          description: Legal entity identifier
          minLength: 20
          maxLength: 20
        issuer:
          type: string
          description: Entity that assigns the identification
          minLength: 1
          maxLength: 35
        schemeName:
          description: Name of the identification scheme
          title: SchemeName
          type: object
          minProperties: 1
          maxProperties: 1
          properties:
            code:
              type: string
              description: Name of the identification scheme in a coded form
              minLength: 1
              maxLength: 4
            proprietary:
              type: string
              description: Specifies the type of scheme with a proprietary value. For AU Superannuation payment (category payment), populate "USI"
              minLength: 1
              maxLength: 35
    OrganizationIdentification:
      type: object
      title: Organization Identification
      description: Organization Identification Schemes
      required:
      - organizationIds
      properties:
        organizationIds:
          type: array
          minItems: 1
          maxItems: 16
          items:
            $ref: '#/components/schemas/OrganizationId'
    AddressType:
      title: AddressType
      type: string
      description: Type of address
      enum:
      - ADDR
      - BIZZ
      - DLVY
      - HOME
      - MLTO
      - PBOX
      example: HOME
    PaymentValue:
      title: PaymentValue
      description: A positive amount of value.
      type: object
      required:
      - currency
      - amoun

# --- truncated at 32 KB (86 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/jp-morgan-chase/refs/heads/main/openapi/jp-morgan-chase-payment-holds-api-openapi.yml