> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mnai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Validate a credit

> Confirm the recipient account can receive the credit before any money moves.



## OpenAPI

````yaml products/bank-transfers/credit-api-example/credit-api-example.yaml POST /credits/validate
openapi: 3.1.0
info:
  title: Meridian Credit API Reference Specification (ISO 20022)
  version: 2.0.0
  summary: >-
    Recommended API surface for bank partners receiving credit (payout)
    instructions from Meridian.
  description: >
    This is Meridian's **reference specification** for a bank partner Credit
    API. It is the API the

    **bank partner hosts** and **Meridian calls** whenever a product event
    requires funds to be pushed

    from Meridian's sponsored account to a customer's account at the home bank
    (for example, a customer

    withdrawal from a Retail Virtual Account).


    Every request carries an ISO 20022 **pacs.008** customer credit transfer,
    and every response is an

    ISO 20022 **pacs.002** payment status report. Both are sent as JSON, using
    the ISO 20022 XML tag

    names (`FIToFICstmrCdtTrf`, `GrpHdr`, `CdtTrfTxInf`, ...) as JSON keys. This
    is the same message

    Meridian's integration layer uses internally, so an API matching this
    specification needs no

    custom mapping on Meridian's side.


    Partners are not required to implement this exact contract. Meridian adapts
    to existing partner

    APIs during onboarding. However, partners building a Credit API from scratch
    should start here,

    because it shortens the integration timeline considerably.


    ## Lifecycle


    Meridian drives every credit through the same sequence:


    1. **`POST /credits`** (optional): register the credit instruction ahead of
    any processing.
       The bank persists the message and returns `RCVD`. No checks against the recipient account and
       no money movement.
    2. **`POST /credits/validate`** (optional but recommended): confirm the
    recipient account can
       receive the credit. No funds move. Safe to call repeatedly.
    3. **`POST /credits/commit`**: execute the transfer. Idempotent on
    `EndToEndId`.

    4. **`GET /credits/{endToEndId}`**: retrieve the current credit status.
    Meridian's workflow
       engine polls this until the credit reports `ACSC` or `RJCT`. It may also call it **before**
       commit as a pre-check, so it must return `404` until a commit is received (even for a credit
       that was created or validated), which Meridian treats as "not yet committed" rather than as a
       failure.
    5. **Status webhook** (optional): proactively push a final status to
    Meridian instead of waiting
       for polling. See the `webhooks` section.

    Steps 1 and 2 are independent: Meridian may call validate without a prior
    create, and commit

    without either. Every request carries the full pacs.008, so no step depends
    on bank-side state

    from an earlier one.


    ## Identifiers


    - `PmtId.EndToEndId` is Meridian's unique identifier for the credit and the
    **idempotency key**.
      It is stable across retries and across the whole lifecycle of one credit, and it is the path
      parameter of the status endpoint.
    - `PmtId.InstrId` is Meridian's credit reference. Echo it as `OrgnlInstrId`.

    - `GrpHdr.MsgId` identifies the message. Echo it as
    `OrgnlGrpInfAndSts.OrgnlMsgId`.


    `EndToEndId` and `InstrId` can be up to 64 characters, and `MsgId` up to 83
    (`InstrId` plus the

    `-withdrawal-request` suffix). Both are longer than the ISO 20022
    `Max35Text` limit, so accept at

    least those lengths.


    ## Status codes


    Responses report `TxSts` using ISO 20022
    `ExternalPaymentTransactionStatus1Code` values. Create and

    validate report the outcome of that call only. The **credit status** starts
    at commit.


    **Create and validate responses.** These do not set the credit status, and
    the status endpoint

    does not report them.


    | Endpoint | `TxSts` | Meaning |

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

    | Create | `RCVD` | Registered. Nothing checked and nothing moved. |

    | Validate | `ACCP` | The recipient account passed eligibility checks. |

    | Validate | `RJCT` | The credit would be rejected, with a reason code.
    Meridian does not commit it. |


    Validate reports the eligibility check as of the call, so repeated calls can
    return different

    results. A validate call never changes the credit status.


    **Credit status, from commit onward.** Commit, the status endpoint, and the
    status webhook report

    these values. Before commit, the status endpoint returns `404`.


    | `TxSts` | Meaning | Terminal |

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

    | `ACSP` | Money movement is underway. | No |

    | `ACSC` | The funds reached the recipient. | **Yes** |

    | `RJCT` | The credit will not be delivered. | **Yes** |

    | `PDNG` | Outcome not yet determinable, for example a timeout in your core
    system. | No |


    The credit status moves only forward (`ACSP`, then `ACSC` or `RJCT`;
    skipping `ACSP` is fine), and

    terminal statuses must never change once reported. `PDNG` is exempt from the
    ordering: report it at

    any point after commit and follow it with any status. Prefer `PDNG` over
    guessing `RJCT`, because

    a terminal status can never be walked back.


    ## Rejection reasons


    Every `RJCT` **must** carry a reason in `StsRsnInf[].Rsn.Cd`, using an ISO
    20022

    `ExternalStatusReason1Code`. Meridian maps these to customer-facing
    outcomes, and a rejection with

    no reason is held for manual review instead of being reversed automatically.
    Recommended baseline:


    | Code | Use for |

    |---|---|

    | `AC01` | Account number not found or invalid |

    | `AC04` | Account closed |

    | `AC06` | Account blocked or dormant |

    | `BE01` | Recipient name does not match the account |

    | `AM02` | Amount exceeds an account or transaction limit |

    | `AM12` | Amount invalid |

    | `AM04` | Insufficient funds in Meridian's sponsored account |

    | `AM05` | Duplicate instruction |

    | `RR04` | Regulatory or compliance rejection |

    | `NARR` | Any other reason. Explain it in `AddtlInf`. |


    ## Response model


    If your core system can settle synchronously, returning a final result
    (`ACSC` or `RJCT`) straight

    from commit lets Meridian update the customer sooner. Meridian does not
    depend on it: it polls the

    status endpoint until the credit is terminal either way.


    Most partners settle asynchronously, and that is the expected case. Return
    `ACSP` from commit and

    expose the final state through `GET /credits/{endToEndId}` and, ideally, the
    status webhook.


    ## Idempotency


    If a commit arrives for an `EndToEndId` that was already processed, return
    the original outcome and

    do not credit twice. If the payload differs from the original request for
    the same `EndToEndId`,

    return `409`. `GrpHdr.CreDtTm` can differ between calls, so leave it out of
    the comparison.


    ## Business failures vs transport failures


    A credit that is received and rejected by business rules (account closed,
    limit exceeded,

    compliance block) is a **`200` response** carrying a pacs.002 with `TxSts:
    RJCT` and a reason code.

    Reserve `4xx` and `5xx` for malformed requests, authentication failures, and
    genuine server faults.

    This distinction is load-bearing: Meridian retries transport failures but
    treats business

    failures as final.


    ## Conventions


    - Amounts (`IntrBkSttlmAmt.Amt`) are JSON numbers with up to 2 decimal
    places. Parse them into a
      decimal type, never a binary float. Currencies are ISO 4217 codes.
    - Country codes are ISO 3166-1 alpha-2 (`PH`, `US`).

    - Timestamps are ISO 8601 with a timezone offset or `Z`.

    - All requests and responses are `application/json` over HTTPS (TLS 1.2+).

    - Ignore JSON properties you do not recognize. Meridian may add optional
    fields without a version
      change.
  contact:
    name: Meridian Implementation Team
    url: https://docs.mnai.com/products/bank-transfers/credit-api
servers:
  - url: https://api.examplebank.com/meridian/v1
    description: Production (partner-hosted)
  - url: https://sandbox.examplebank.com/meridian/v1
    description: Sandbox (required before go-live)
security:
  - bearerAuth: []
tags:
  - name: Credits
    description: Register, validate, execute, and track credit (payout) instructions.
paths:
  /credits/validate:
    post:
      tags:
        - Credits
      summary: Validate a credit before execution
      description: >
        Confirms the recipient account is eligible to receive the credit
        (account exists, is active,

        can accept the amount, name matches where applicable). **No funds
        move.** May be called zero,

        one, or multiple times per credit, including for standalone account
        lookups with no subsequent

        commit.


        Return `TxSts: ACCP` when the credit would be accepted, or `TxSts: RJCT`
        with a reason code

        explaining why it would be rejected.


        The response reports this eligibility check only. It does not set the
        credit status, and the

        terminal-status rules do not apply to it: a later validate for the same
        `EndToEndId` reports the

        check as of that call. When validate returns `RJCT`, Meridian does not
        commit the credit.
      operationId: validateCredit
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreditTransferMessage'
            examples:
              instruction:
                $ref: '#/components/examples/CreditTransferExample'
      responses:
        '200':
          description: >-
            Validation outcome (both eligible and ineligible accounts return
            200).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentStatusReportMessage'
              examples:
                accepted:
                  $ref: '#/components/examples/StatusAccepted'
                rejected:
                  $ref: '#/components/examples/StatusRejectedAccountClosed'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  schemas:
    CreditTransferMessage:
      type: object
      description: >
        ISO 20022 pacs.008 FI to FI customer credit transfer, as JSON. Meridian
        sends exactly one

        transaction per message.
      required:
        - FIToFICstmrCdtTrf
      properties:
        FIToFICstmrCdtTrf:
          $ref: '#/components/schemas/CreditTransfer'
    PaymentStatusReportMessage:
      type: object
      description: ISO 20022 pacs.002 FI to FI payment status report, as JSON.
      required:
        - FIToFIPmtStsRpt
      properties:
        FIToFIPmtStsRpt:
          $ref: '#/components/schemas/PaymentStatusReport'
    CreditTransfer:
      type: object
      required:
        - GrpHdr
        - CdtTrfTxInf
      properties:
        GrpHdr:
          $ref: '#/components/schemas/GroupHeader'
        CdtTrfTxInf:
          type: array
          minItems: 1
          maxItems: 1
          description: The credit transfer. Always exactly one element.
          items:
            $ref: '#/components/schemas/CreditTransferTransaction'
    PaymentStatusReport:
      type: object
      required:
        - GrpHdr
        - OrgnlGrpInfAndSts
        - TxInfAndSts
      properties:
        GrpHdr:
          type: object
          required:
            - MsgId
            - CreDtTm
          properties:
            MsgId:
              type: string
              maxLength: 64
              description: >-
                The bank's identifier for this status report. Meridian stores it
                for support requests.
            CreDtTm:
              type: string
              format: date-time
        OrgnlGrpInfAndSts:
          type: object
          required:
            - OrgnlMsgId
          properties:
            OrgnlMsgId:
              type: string
              description: Echo of the pacs.008 `GrpHdr.MsgId`.
            OrgnlMsgNmId:
              type: string
              description: Name of the original message, `pacs.008`.
        TxInfAndSts:
          type: array
          minItems: 1
          maxItems: 1
          description: Status of the credit. Always exactly one element.
          items:
            $ref: '#/components/schemas/TransactionStatus'
    ApiError:
      type: object
      description: Transport-level error payload for 4xx and 5xx responses.
      required:
        - errorCode
        - errorMessage
      properties:
        errorCode:
          type: string
        errorMessage:
          type: string
    GroupHeader:
      type: object
      required:
        - MsgId
        - CreDtTm
        - NbOfTxs
        - SttlmInf
      properties:
        MsgId:
          type: string
          maxLength: 83
          description: >-
            Message identifier, `<InstrId>-withdrawal-request`. Echo it as
            `OrgnlMsgId`.
        CreDtTm:
          type: string
          format: date-time
          description: >-
            When Meridian built this request (UTC). It can differ between calls
            for the same credit, so exclude it from idempotency comparisons.
        NbOfTxs:
          type: string
          enum:
            - '1'
          description: Number of transactions. Always `"1"`.
        SttlmInf:
          type: object
          required:
            - SttlmMtd
          properties:
            SttlmMtd:
              type: string
              enum:
                - CLRG
              description: Settlement method. Always `CLRG`.
        InstgAgt:
          $ref: '#/components/schemas/Agent'
          description: Instructing agent (Meridian's side).
        InstdAgt:
          $ref: '#/components/schemas/Agent'
          description: Instructed agent (the bank).
    CreditTransferTransaction:
      type: object
      required:
        - PmtId
        - IntrBkSttlmAmt
        - Dbtr
        - DbtrAcct
        - DbtrAgt
        - CdtrAgt
        - Cdtr
        - CdtrAcct
        - Purp
      properties:
        PmtId:
          $ref: '#/components/schemas/PaymentIdentification'
        PmtTpInf:
          $ref: '#/components/schemas/PaymentTypeInformation'
        IntrBkSttlmAmt:
          $ref: '#/components/schemas/Amount'
        IntrBkSttlmDt:
          type: string
          format: date
          description: Requested settlement date, when Meridian specifies one.
        ChrgBr:
          type: string
          description: Charge bearer (for example `SLEV`), when Meridian specifies one.
        Dbtr:
          $ref: '#/components/schemas/Debtor'
          description: >
            The sender of the funds (KYC subject). Meridian always sends the
            sender's full and split

            name and date of birth for compliance screening. Some corridors add
            further compliance

            fields in `SplmtryData`.
        DbtrAcct:
          $ref: '#/components/schemas/CashAccount'
          description: >-
            The sender's account at Meridian. `Ccy` is the currency the sender
            funded in.
        DbtrAgt:
          $ref: '#/components/schemas/Agent'
          description: The sender's institution.
        CdtrAgt:
          $ref: '#/components/schemas/Agent'
          description: The recipient's institution (the bank).
        Cdtr:
          $ref: '#/components/schemas/Party'
          description: The customer being credited at the bank.
        CdtrAcct:
          $ref: '#/components/schemas/CashAccount'
          description: >
            The account to credit, in `Id.Othr.Id` in the bank's canonical
            format, or in `Id.IBAN` where

            applicable.
        RmtInf:
          type: object
          description: >-
            Remittance information. Print it on statements where your core
            allows.
          properties:
            Ustrd:
              type: array
              items:
                type: string
                maxLength: 140
              description: >-
                Free-text remittance lines, for example the sender's remarks and
                a customer-facing reference.
        Purp:
          type: object
          description: Purpose of the transfer.
          required:
            - Prtry
          properties:
            Cd:
              type: string
              description: ISO 20022 `ExternalPurpose1Code`, when Meridian specifies one.
            Prtry:
              type: string
              description: The Meridian product that originated the credit.
              enum:
                - REMITTANCES
                - MERCHANT_PAYMENTS
                - MERCHANT_LINKS
                - VIRTUAL_ACCOUNTS
                - PAYMENT_LINKS
        XchgRate:
          type: string
          pattern: ^\d+(\.\d+)?$
          description: >
            Exchange rate applied from the sender's currency to
            `IntrBkSttlmAmt.Ccy`, as a decimal string.

            Present on cross-border credits.
        SplmtryData:
          type: array
          description: Meridian extension data. See `SupplementaryData`.
          items:
            $ref: '#/components/schemas/SupplementaryData'
    TransactionStatus:
      type: object
      required:
        - OrgnlEndToEndId
        - TxSts
      if:
        required:
          - TxSts
        properties:
          TxSts:
            const: RJCT
      then:
        required:
          - StsRsnInf
        unevaluatedProperties: true
        properties:
          StsRsnInf:
            type: array
            minItems: 1
            items:
              $ref: '#/components/schemas/RejectionReasonInformation'
      properties:
        OrgnlInstrId:
          type: string
          description: Echo of `PmtId.InstrId`.
        OrgnlEndToEndId:
          type: string
          description: >-
            Echo of `PmtId.EndToEndId`. Meridian matches the response to the
            credit on this field.
        TxSts:
          $ref: '#/components/schemas/TransactionStatusCode'
        StsRsnInf:
          type: array
          description: >
            Why the credit has this status. **Required when `TxSts` is `RJCT`**,
            with `Rsn.Cd` set.

            Optional otherwise, for example to explain a `PDNG`.
          items:
            $ref: '#/components/schemas/StatusReasonInformation'
        AccptncDtTm:
          type: string
          format: date-time
          description: >-
            When the bank reached the reported status. Include it on `ACSC` and
            `RJCT`.
        AcctSvcrRef:
          type: string
          maxLength: 64
          description: >
            The bank's own reference for the transfer. Meridian stores it for
            reconciliation and support.

            Include it on every response after commit.
    Agent:
      type: object
      required:
        - FinInstnId
      properties:
        FinInstnId:
          type: object
          description: >
            At least one of `BICFI`, `ClrSysMmbId`, or `Othr` is present. When
            Meridian has neither a

            BIC nor a clearing member ID, it sends `Othr.Id:
            "UNKNOWN_INSTITUTION"`.
          properties:
            BICFI:
              type: string
              pattern: ^[A-Z0-9]{8}([A-Z0-9]{3})?$
            ClrSysMmbId:
              type: object
              required:
                - MmbId
              properties:
                MmbId:
                  type: string
                  description: Clearing system member ID (for example a local bank code).
            Nm:
              type: string
              maxLength: 140
            Othr:
              $ref: '#/components/schemas/GenericIdentification'
    PaymentIdentification:
      type: object
      required:
        - EndToEndId
      properties:
        InstrId:
          type: string
          maxLength: 64
          description: Meridian's credit reference. Echo it as `OrgnlInstrId`.
        EndToEndId:
          type: string
          maxLength: 64
          description: >
            Meridian's unique identifier for this credit and the **idempotency
            key**. Stable across

            retries and across the whole create, validate, commit, and status
            lifecycle.
        TxId:
          type: string
          maxLength: 64
          description: Transaction identifier, when Meridian specifies one.
    PaymentTypeInformation:
      type: object
      description: >-
        Service level, local instrument, and category purpose, when agreed
        during onboarding.
      properties:
        SvcLvl:
          $ref: '#/components/schemas/CodeOrProprietary'
        LclInstrm:
          $ref: '#/components/schemas/CodeOrProprietary'
        CtgyPurp:
          $ref: '#/components/schemas/CodeOrProprietary'
    Amount:
      type: object
      required:
        - Ccy
        - Amt
      properties:
        Ccy:
          type: string
          pattern: ^[A-Z]{3}$
          description: ISO 4217 currency code.
          example: PHP
        Amt:
          type: number
          minimum: 0
          description: >
            Amount to credit, up to 2 decimal places. Parse into a decimal type,
            never a binary float.

            The 2-decimal limit is deliberately not expressed as `multipleOf`,
            because validators that

            check it with floating-point division reject valid amounts.
          example: 1500
    Debtor:
      description: A `Party` with the fields Meridian always sends for the sender.
      allOf:
        - $ref: '#/components/schemas/Party'
        - type: object
          required:
            - GvnNm
            - FmlyNm
            - PrvtId
          properties:
            PrvtId:
              type: object
              required:
                - DtAndPlcOfBirth
              properties:
                DtAndPlcOfBirth:
                  $ref: '#/components/schemas/DateAndPlaceOfBirth'
    CashAccount:
      type: object
      required:
        - Id
        - Ccy
      properties:
        Id:
          type: object
          description: Exactly one of `IBAN` or `Othr`.
          properties:
            IBAN:
              type: string
              maxLength: 34
            Othr:
              $ref: '#/components/schemas/GenericIdentification'
        Tp:
          type: string
          description: Account type, when known.
        Ccy:
          type: string
          pattern: ^[A-Z]{3}$
          description: Account currency, ISO 4217.
        Nm:
          type: string
          maxLength: 140
          description: Account name, when known.
    Party:
      type: object
      required:
        - Nm
      properties:
        Nm:
          type: string
          maxLength: 140
          description: Full name.
        GvnNm:
          type: string
          maxLength: 70
          description: >
            **Meridian extension.** Given (first) name. pacs.008 carries only a
            full name, so Meridian

            also sends the split name for banks that match on it.
        FmlyNm:
          type: string
          maxLength: 70
          description: '**Meridian extension.** Family (last) name. See `GvnNm`.'
        PstlAdr:
          $ref: '#/components/schemas/PostalAddress'
        CtryOfRes:
          type: string
          pattern: ^[A-Z]{2}$
          description: Country of residence, ISO 3166-1 alpha-2.
        PrvtId:
          type: object
          description: Identification of a natural person.
          properties:
            DtAndPlcOfBirth:
              $ref: '#/components/schemas/DateAndPlaceOfBirth'
            Othr:
              $ref: '#/components/schemas/GenericIdentification'
        OrgId:
          type: object
          description: Identification of an organization, when the party is not a person.
          properties:
            Othr:
              $ref: '#/components/schemas/GenericIdentification'
    SupplementaryData:
      type: object
      description: >
        **Meridian extension.** Meridian sends at most one entry, with
        `PlcAndNm` set to

        `/MeridianPay/CrossBorderInfo`, on cross-border credits. Every key in
        `Envlp` is optional and

        every value is a string. Ignore keys you do not recognize.
      properties:
        PlcAndNm:
          type: string
          enum:
            - /MeridianPay/CrossBorderInfo
        Envlp:
          type: object
          additionalProperties:
            type: string
          properties:
            sourceAmount:
              type: string
              description: Amount the sender paid, as a decimal string.
            sourceCurrency:
              type: string
              description: Currency the sender paid in, ISO 4217.
            exchangeRate:
              type: string
              description: Customer exchange rate applied.
            baseExchangeRate:
              type: string
              description: Exchange rate before Meridian's margin.
            midMarketRate:
              type: string
              description: Mid-market rate at the time of the transfer.
            reference:
              type: string
              description: Customer-facing reference for the transfer.
            relationToReceiver:
              type: string
              description: The sender's relationship to the recipient.
            sourceOfIncome:
              type: string
              description: The sender's source of income.
    TransactionStatusCode:
      type: string
      description: >
        ISO 20022 `ExternalPaymentTransactionStatus1Code`, restricted to the
        values below.


        - `RCVD`: registered; nothing checked and nothing moved

        - `ACCP`: the recipient account passed eligibility checks

        - `ACSP`: money movement is underway

        - `ACSC`: terminal; the funds reached the recipient

        - `RJCT`: terminal; the credit will not be delivered

        - `PDNG`: outcome not yet determinable; not terminal


        Status moves only forward through that order (skipping steps is fine),
        and terminal statuses

        must never change once reported. `PDNG` is exempt from the ordering and
        may be followed by any

        status.
      enum:
        - RCVD
        - ACCP
        - ACSP
        - ACSC
        - RJCT
        - PDNG
    StatusReasonInformation:
      type: object
      properties:
        Rsn:
          $ref: '#/components/schemas/StatusReason'
        AddtlInf:
          $ref: '#/components/schemas/AdditionalInformation'
    GenericIdentification:
      type: object
      required:
        - Id
      properties:
        Id:
          type: string
          maxLength: 64
        Issr:
          type: string
        SchmeNm:
          type: string
    CodeOrProprietary:
      type: object
      properties:
        Cd:
          type: string
        Prtry:
          type: string
    DateAndPlaceOfBirth:
      type: object
      required:
        - BirthDt
      properties:
        BirthDt:
          type: string
          format: date
          description: Date of birth (YYYY-MM-DD).
        CityOfBirth:
          type: string
          maxLength: 35
        CtryOfBirth:
          type: string
          pattern: ^[A-Z]{2}$
    PostalAddress:
      type: object
      properties:
        AdrLine:
          type: array
          maxItems: 7
          items:
            type: string
            maxLength: 70
        TwnNm:
          type: string
          maxLength: 35
          description: City or town.
        CtrySubDvsn:
          type: string
          maxLength: 35
          description: State or province.
        PstCd:
          type: string
          maxLength: 16
        Ctry:
          type: string
          pattern: ^[A-Z]{2}$
          description: ISO 3166-1 alpha-2.
    StatusReason:
      type: object
      description: >-
        The reason code. Required on `RJCT`. Put any bank-specific code or
        detail in `AddtlInf`.
      properties:
        Cd:
          $ref: '#/components/schemas/StatusReasonCode'
    AdditionalInformation:
      type: array
      items:
        type: string
        maxLength: 105
      description: Human-readable detail. Not shown to customers verbatim.
    StatusReasonCode:
      type: string
      description: >
        ISO 20022 `ExternalStatusReason1Code`. Recommended baseline: `AC01`,
        `AC04`, `AC06`, `BE01`,

        `AM02`, `AM12`, `AM04`, `AM05`, `RR04`, `NARR`.
      example: AC04
  examples:
    CreditTransferExample:
      summary: PHP 1,500.00 payout to a bank account
      description: >
        The same message is sent to create, validate, and commit. Only the
        endpoint changes, and

        `GrpHdr.CreDtTm` may differ between calls.
      value:
        FIToFICstmrCdtTrf:
          GrpHdr:
            MsgId: CR7Q2M9X4KZ8-withdrawal-request
            CreDtTm: '2026-08-12T07:04:05.123Z'
            NbOfTxs: '1'
            SttlmInf:
              SttlmMtd: CLRG
            InstgAgt:
              FinInstnId:
                BICFI: MRDNUS33
            InstdAgt:
              FinInstnId:
                BICFI: EXBKPHMM
          CdtTrfTxInf:
            - PmtId:
                InstrId: CR7Q2M9X4KZ8
                EndToEndId: mrdn-9f2c1e4a-71bd-4c5e-a2f3-8d6b0c9e1a27
              IntrBkSttlmAmt:
                Ccy: PHP
                Amt: 1500
              Dbtr:
                Nm: Juan Cruz
                GvnNm: Juan
                FmlyNm: Cruz
                PstlAdr:
                  AdrLine:
                    - 123 Test Street
                  TwnNm: San Jose
                  CtrySubDvsn: CA
                  PstCd: '95112'
                  Ctry: US
                CtryOfRes: US
                PrvtId:
                  DtAndPlcOfBirth:
                    BirthDt: '1990-01-15'
              DbtrAcct:
                Id:
                  Othr:
                    Id: MRDN-SND-0042
                Ccy: USD
              DbtrAgt:
                FinInstnId:
                  BICFI: MRDNUS33
              CdtrAgt:
                FinInstnId:
                  BICFI: EXBKPHMM
              Cdtr:
                Nm: Maria Santos
                GvnNm: Maria
                FmlyNm: Santos
              CdtrAcct:
                Id:
                  Othr:
                    Id: '001234567890'
                Ccy: PHP
              RmtInf:
                Ustrd:
                  - Family support
                  - R9x8k2m4p6w1c3v5b7n9q0z2
              Purp:
                Prtry: REMITTANCES
              XchgRate: '56.25'
              SplmtryData:
                - PlcAndNm: /MeridianPay/CrossBorderInfo
                  Envlp:
                    sourceAmount: '26.67'
                    sourceCurrency: USD
                    exchangeRate: '56.25'
                    reference: R9x8k2m4p6w1c3v5b7n9q0z2
                    relationToReceiver: FAMILY
                    sourceOfIncome: SALARY
    StatusAccepted:
      summary: Recipient account eligible (validate)
      value:
        FIToFIPmtStsRpt:
          GrpHdr:
            MsgId: EBNK-STS-20260812-000102
            CreDtTm: '2026-08-12T15:04:06+08:00'
          OrgnlGrpInfAndSts:
            OrgnlMsgId: CR7Q2M9X4KZ8-withdrawal-request
            OrgnlMsgNmId: pacs.008
          TxInfAndSts:
            - OrgnlInstrId: CR7Q2M9X4KZ8
              OrgnlEndToEndId: mrdn-9f2c1e4a-71bd-4c5e-a2f3-8d6b0c9e1a27
              TxSts: ACCP
    StatusRejectedAccountClosed:
      summary: Recipient account closed (validate)
      value:
        FIToFIPmtStsRpt:
          GrpHdr:
            MsgId: EBNK-STS-20260812-000103
            CreDtTm: '2026-08-12T15:04:06+08:00'
          OrgnlGrpInfAndSts:
            OrgnlMsgId: CR7Q2M9X4KZ8-withdrawal-request
            OrgnlMsgNmId: pacs.008
          TxInfAndSts:
            - OrgnlInstrId: CR7Q2M9X4KZ8
              OrgnlEndToEndId: mrdn-9f2c1e4a-71bd-4c5e-a2f3-8d6b0c9e1a27
              TxSts: RJCT
              StsRsnInf:
                - Rsn:
                    Cd: AC04
                  AddtlInf:
                    - Recipient account is closed.
  responses:
    BadRequest:
      description: >-
        Malformed request (missing or invalid fields). Not retryable without
        correction.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
          example:
            errorCode: VALIDATION_ERROR
            errorMessage: CdtTrfTxInf[0].IntrBkSttlmAmt.Ccy is not a supported currency.
    Unauthorized:
      description: Missing or invalid credentials.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    ServerError:
      description: Unexpected bank-side failure. Meridian treats this as retryable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Assume OAuth 2.0 client credentials issued by the bank, presented as a
        bearer token.

        Meridian can adapt to the bank's preferred authentication scheme during
        onboarding.

````