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

# Get a Virtual Account

> Fetch a Virtual Account by ID.



## OpenAPI

````yaml /api-reference/openapi.yaml get /virtual-accounts/{virtualAccountId}
openapi: 3.0.3
info:
  title: Polygon OMS Public API
  version: v26.05.28-0001
  description: >-
    Unified API for moving money between crypto and fiat. Three ways to move
    money: Transactions (instant, wallet or card funded, including Cash-In for
    in-person cash deposits), Deposit Addresses (reusable crypto deposit
    configurations), and Virtual Accounts (dedicated bank accounts that
    auto-convert fiat to crypto). Standard transactions follow a two-step flow:
    create a Quote (pricing), then create a Transaction (execution). Cash-in
    codes generate a one-time deposit code for in-person cash deposits at retail
    locations.
  contact:
    name: Polygon OMS
    url: https://oms.polygon.technology
servers:
  - url: https://sandbox-api.polygon.technology/v0.13
    description: Sandbox
  - url: https://api.polygon.technology/v0.13
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Auth
    description: Authentication via FrontEgg
  - name: Customers
    description: Customer management and KYC
  - name: Customer
  - name: Wallet
  - name: Quote
  - name: Transaction
  - name: CashIns
  - name: CashLocation
  - name: Sandbox
  - name: VirtualAccount
  - name: Counterparty
  - name: ExternalAccount
  - name: Reference
  - name: DepositAddress
paths:
  /virtual-accounts/{virtualAccountId}:
    get:
      tags:
        - VirtualAccount
      summary: Get a Virtual Account
      description: Fetch a Virtual Account by ID.
      operationId: getVirtualAccount
      parameters:
        - name: virtualAccountId
          in: path
          required: true
          description: Virtual Account ID (`va_` prefix).
          schema:
            type: string
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAccount'
              examples:
                Active virtual account with US bank routing details:
                  summary: Active virtual account with US bank routing details
                  value:
                    id: va_bztg5dcpfbec9s0jkq28d5meq3
                    object: virtualAccount
                    customerId: cst_vfa0nxw6zvyws9g237jrxn4y7k
                    status: active
                    destination:
                      party:
                        relationship: customer
                        id: cst_vfa0nxw6zvyws9g237jrxn4y7k
                        name: Jane Smith
                      type: walletExternal
                      category: crypto
                      id: ext_fky491gakzj0dd46qb6whsr2vq
                      asset: usdc
                      network: ethereum
                      displayName: '0x7B3A9F2C4D1eA8bf6390cE5D2b7fA104c8e3D9B1'
                    label: Alice USD deposit account
                    createdAt: '2026-03-14T19:00:00Z'
                    updatedAt: '2026-03-14T19:00:00Z'
components:
  schemas:
    VirtualAccount:
      type: object
      properties:
        id:
          allOf:
            - $ref: '#/components/schemas/typeId'
          description: Virtual Account ID (`va_` prefix).
        object:
          type: string
          enum:
            - virtualAccount
          description: Resource type discriminator. Always "virtualAccount".
        customerId:
          allOf:
            - $ref: '#/components/schemas/typeId'
          description: The OMS customer that owns this record (`cst_` prefix).
        customer:
          allOf:
            - $ref: '#/components/schemas/CustomerSummary'
          description: |-
            Resolved id + display name of the owning customer, so list/detail
            rendering needs no follow-up customer fetch (v0.12, #2665).
        status:
          allOf:
            - $ref: '#/components/schemas/VirtualAccountStatus'
          description: Current lifecycle status of the virtual account.
        sourceToDestination:
          allOf:
            - $ref: '#/components/schemas/SourceToDestination'
          description: >-
            Corridor composite derived from the destination type —
            `fiatAccountToCrypto`

            for a crypto-wallet destination (inbound fiat auto-converts), or

            `fiatAccountToFiatAccount` for a bank or walletFiat destination
            (inbound

            USD forwarded onward — the same token for both; walletFiat
            introduces no

            new corridor).
        statusReason:
          type: string
          description: Human-readable explanation of the current status.
        source:
          allOf:
            - $ref: '#/components/schemas/VirtualAccountSource'
          description: Expected inbound rail detail.
        depositInstructions:
          allOf:
            - $ref: '#/components/schemas/VirtualAccountInstructions'
          description: Null until Erebor provisions the DDA (DEPOSIT_ACCOUNT.OPEN).
        destination:
          allOf:
            - $ref: '#/components/schemas/TransactionSide'
          description: 'V0.10: unified side shape.'
        returnDestination:
          allOf:
            - $ref: '#/components/schemas/FiatReturnDestination'
          description: >-
            The configured fiat return destination (v0.11-8) for failed outbound

            legs; absent/null when none is set (the project return policy
            applies

            instead, once T13 wires the waterfall).
        sponsorGas:
          type: boolean
          description: >-
            Whether OMS absorbs the on-chain gas cost for the destination
            delivery.

            Persisted from the create/update request (currently only `true` is

            accepted).
        bankMemo:
          type: string
          description: Wire/ACH memo the customer can include with deposits.
        label:
          type: string
          description: Partner display label.
        metadata:
          type: object
          additionalProperties:
            type: string
          description: Free-form key-value pairs supplied at creation or update.
        createdAt:
          type: string
          format: date-time
          description: When the virtual account was created.
        updatedAt:
          type: string
          format: date-time
          description: When the virtual account was last updated.
        failureReason:
          allOf:
            - $ref: '#/components/schemas/VirtualAccountFailureReason'
          description: >-
            Set when status = `failed`; closed enum identifying the failure
            category.
        deletionRequestedAt:
          type: string
          format: date-time
          description: >-
            Set when DELETE has been requested but the close webhook has not yet
            finalized.
        deletionRequestedBy:
          type: string
          description: Identity (JWT subject claim) of the caller who invoked DELETE.
        finalBalance:
          allOf:
            - $ref: '#/components/schemas/AmountObject'
          description: DDA balance snapshot at the moment the VA flipped to `deleted`.
      description: >-
        A dedicated bank account number issued for a customer. Inbound fiat
        deposits are

        automatically converted and delivered to the configured destination,
        creating a

        transaction per deposit.
    typeId:
      type: string
      pattern: >-
        ^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$
      description: >-
        Public TypeID, e.g. `txn_01h455vb4pex5vsknk084sn02q`; legacy UUID
        suffixes are accepted until non-v7 rows are retired.
      x-go-type: string
    CustomerSummary:
      type: object
      required:
        - id
        - name
      properties:
        id:
          allOf:
            - $ref: '#/components/schemas/typeId'
          description: The OMS customer id (`cst_` prefix).
        name:
          type: string
          description: Customer display name.
      description: >-
        A minimal, resolved reference to the owning OMS customer — id plus
        display

        name, for list/detail rendering without a follow-up customer fetch

        (v0.12 list enrichment, #2665). Distinct from `Party`: this is always
        the

        record's OWNING customer (Transaction.customerId /
        VirtualAccount.customerId

        / DepositAddress.customerId), not whichever side a party sits on.
    VirtualAccountStatus:
      type: string
      enum:
        - pending
        - active
        - frozen
        - closed
        - deleted
        - failed
        - inactiveActionRequired
      description: >-
        Lifecycle of a Virtual Account. pending: awaiting bank provisioning.
        active: accepting

        deposits. frozen: deposits held by compliance. inactiveActionRequired:
        destination unusable -

        re-point `destination` to recover. closed: permanently disabled.
        deleted: close flow finalized.

        failed: provisioning failed.
    SourceToDestination:
      type: string
      enum:
        - cryptoToCrypto
        - cryptoToCash
        - cryptoToFiatAccount
        - cashToCrypto
        - fiatAccountToCrypto
        - fiatAccountToFiatAccount
      description: >-
        Composite of source and destination instrument categories, inferred

        from each side. The cash corridors

        (`cryptoToCash`, `cashToCrypto`) are derived from a cash-pickup
        destination /

        cash-in source respectively; the rest map straight from the internal
        corridor type.
    VirtualAccountSource:
      type: object
      required:
        - asset
        - network
      properties:
        asset:
          type: string
          description: 'Fixed for Alpha: "usd".'
        network:
          type: string
          description: 'Fixed for Alpha: "usBank".'
      description: >-
        Expected inbound rail for the virtual account: fiat asset and bank
        network.
    VirtualAccountInstructions:
      type: object
      properties:
        bankUs:
          type: array
          items:
            $ref: '#/components/schemas/BankRoutingBlock'
      description: >-
        Spec-mandated (v0.11/v0.11) VA deposit-instructions wrapper. bankUs
        holds

        zero, one, or two routing blocks (domestic + SWIFT), depending on which

        incoming rails the partner has enabled.
    TransactionSide:
      type: object
      oneOf:
        - $ref: '#/components/schemas/WalletCryptoInstrument'
        - $ref: '#/components/schemas/WalletExternalInstrument'
        - $ref: '#/components/schemas/WalletFiatInstrument'
        - $ref: '#/components/schemas/BankUsInstrument'
        - $ref: '#/components/schemas/BankIbanInstrument'
        - $ref: '#/components/schemas/BankCanadaInstrument'
        - $ref: '#/components/schemas/CardInstrument'
        - $ref: '#/components/schemas/CashInstrument'
      discriminator:
        propertyName: type
        mapping:
          walletCrypto:
            $ref: '#/components/schemas/WalletCryptoInstrument'
          walletExternal:
            $ref: '#/components/schemas/WalletExternalInstrument'
          walletFiat:
            $ref: '#/components/schemas/WalletFiatInstrument'
          bankUs:
            $ref: '#/components/schemas/BankUsInstrument'
          bankIban:
            $ref: '#/components/schemas/BankIbanInstrument'
          bankCanada:
            $ref: '#/components/schemas/BankCanadaInstrument'
          card:
            $ref: '#/components/schemas/CardInstrument'
          cash:
            $ref: '#/components/schemas/CashInstrument'
      description: >-
        The source side of a transaction/quote (v0.10): a typed instrument
        carrying

        identity (`party`) and instrument detail. Amounts live only in
        `pricing`.
    FiatReturnDestination:
      type: object
      oneOf:
        - $ref: '#/components/schemas/FiatReturnDestinationBankUs'
        - $ref: '#/components/schemas/FiatReturnDestinationBankIban'
        - $ref: '#/components/schemas/FiatReturnDestinationBankCanada'
        - $ref: '#/components/schemas/FiatReturnDestinationWalletFiat'
      discriminator:
        propertyName: type
        mapping:
          bankUs:
            $ref: '#/components/schemas/FiatReturnDestinationBankUs'
          bankIban:
            $ref: '#/components/schemas/FiatReturnDestinationBankIban'
          bankCanada:
            $ref: '#/components/schemas/FiatReturnDestinationBankCanada'
          walletFiat:
            $ref: '#/components/schemas/FiatReturnDestinationWalletFiat'
      description: >-
        Where inbound fiat is returned when its outbound leg can't be completed

        (v0.11-8). Pick a `type`: a bank account (`bankUs` / `bankIban` /

        `bankCanada`, each with a required `network` naming the rail) or a fiat

        balance wallet (`walletFiat` — no network, internal ledger). Shared by
        the

        Virtual Account `returnDestination` and (later) the return policy's

        `fiat.returnDestinations`. `walletFiat`, and `bankCanada` with a `local`

        network (CAD), are rejected with 422 `railNotSupported` in v1 — bank
        rails

        (USD) only.
    VirtualAccountFailureReason:
      type: string
      enum:
        - provisioningTimeout
        - systemError
        - ereborRejected
        - deletePendingTimeout
      description: >-
        Closed enum stamped by failVA when a VA flips to terminal `failed`
        state.
    AmountObject:
      type: object
      required:
        - value
        - currency
        - display
      properties:
        value:
          allOf:
            - $ref: '#/components/schemas/int64String'
          description: Amount in fiat minor units (e.g. cents).
        currency:
          type: string
          description: ISO 4217 currency code.
        display:
          type: string
          description: Human-readable rendering (e.g. "12.34 USD").
      description: >-
        Single-amount snapshot - value in minor units, plus the currency code
        and

        a human-readable display string. Used wherever the API exposes a
        one-shot

        amount (e.g. virtualAccount.finalBalance), as distinct from balance
        shapes

        with available/pending/reserved components.
    BankRoutingBlock:
      type: object
      required:
        - bankName
        - bankAddress
        - accountNumber
        - routingNumber
        - accountType
        - BIC
        - beneficiary
        - memo
      properties:
        supportedSources:
          type: array
          items:
            $ref: '#/components/schemas/AssetNetworkPair'
          description: Asset/network pairs this routing block accepts deposits for.
        bankName:
          type: string
        bankAddress:
          type: string
        accountNumber:
          type: string
        routingNumber:
          type: string
          nullable: true
          description: US domestic only; null for SWIFT.
        accountType:
          type: string
          nullable: true
          description: US domestic only; null for SWIFT. Always "checking" when present.
        BIC:
          type: string
          nullable: true
          description: SWIFT only; null for US domestic.
        beneficiary:
          $ref: '#/components/schemas/BankRoutingBlockBeneficiary'
        memo:
          type: string
          nullable: true
          description: |-
            SWIFT only; null for US domestic. OMS-generated:
            "FFC <customerName> <ereborDdaAccountNumber>".
      description: >-
        One bank-routing entry within VirtualAccountInstructions.bankUs.
        US-domestic

        fields (routingNumber, accountType) are null on a SWIFT entry;
        SWIFT-only

        fields (BIC, memo) are null on a domestic entry.
    WalletCryptoInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - network
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - walletCrypto
          description: Type discriminator.
        category:
          type: string
          enum:
            - crypto
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: >-
            OMS wallet ID (`wlt_` prefix).


            DEVIATION from the ratified OMS v0.12 contract
            (docs/specs/2026-08-05-oms-v0.12-openapi.yaml,

            WalletCryptoInstrument): the ratified shape has `id` required and
            non-nullable. A row

            can classify as this arm (destination_type=walletCrypto/legacy
            walletOms, per #2528)

            before the wallet FK has actually resolved — the "in-flight deposit"
            window

            destInstrumentKind's own doc comment describes — so `id` is nullable
            rather than

            emitting an empty string that fails the `typeId` scalar's pattern.
            Not recorded in

            the upstream snapshot's §4 errata (that section is for defects IN
            the ratified

            snapshot, not BPN's own accepted deviations from it) — flagged here
            and in the PR

            description instead, same class as the
            CardInstrument.id/WalletFiatInstrument.id/

            BankUsInstrument.network deviations elsewhere in this same change.
        asset:
          type: string
          description: Canonical asset identifier.
        network:
          type: string
          description: Network identifier.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
      description: >-
        OMS-custodied crypto wallet instrument — a uniform reference.
        Dereference

        `GET /wallets/{id}` for the wallet record (on-chain address, custody

        type, balances).
      title: OMS wallet
    WalletExternalInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - network
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - walletExternal
          description: Type discriminator.
        category:
          type: string
          enum:
            - crypto
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: External Account ID (`ext_` prefix). Null when externalUnregistered.
        asset:
          type: string
          description: Canonical asset identifier.
        network:
          type: string
          description: Network identifier.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
        details:
          type: object
          properties:
            blockchainAddress:
              type: string
              description: On-chain sender address.
          required:
            - blockchainAddress
          nullable: true
          description: >-
            Populated only when `id` is null (unregistered external sender);
            null for registered instruments.
      description: >-
        Externally-custodied crypto wallet instrument — a uniform reference.
        When

        registered, dereference the external account by `id`; when the sender is

        unregistered, `id` is null and `details.blockchainAddress` carries the

        minimal identifying fact.
      title: External wallet
    WalletFiatInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - walletFiat
          description: Type discriminator.
        category:
          type: string
          enum:
            - fiatAccount
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          nullable: true
          description: >-
            OMS fiat wallet ID (`wlt_fiat_` prefix). Look up via `GET /wallets`.

            Plain string, not the `typeId` scalar: `wlt_fiat_` is a two-token

            prefix, which the single-underscore `typeId` pattern cannot
            validate.

            Null on a #2504 book-transfer destination leg's pre-outbound window:

            the wallet FK isn't committed until the outbound leg stamps its

            routing snapshot (a repoint can still change which wallet is
            credited

            until then), so there is genuinely no id to dereference yet — a

            deliberate BPN deviation from the ratified OMS v0.12 contract, which

            types this field required and non-nullable.
        asset:
          type: string
          enum:
            - usd
          description: Fiat currency of the balance. Only `usd` today.
        network:
          type: string
          enum:
            - bookTransfer
          description: |-
            `bookTransfer` when this walletFiat is the destination of a Virtual
            Account / Deposit Address book-transfer credit — an internal ledger
            movement at the partner bank, no external rail. Absent when the
            walletFiat is a funding source.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
      description: >-
        Fiat balance wallet instrument — a USD balance held at a partner bank

        (e.g. Erebor Bank, N.A.). No on-chain address; an internal ledger
        balance —

        always OMS-owned, no unregistered case. Dereference `GET /wallets/{id}`

        for the wallet record.
      title: Fiat wallet
    BankUsInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - network
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - bankUs
          description: Type discriminator.
        category:
          type: string
          enum:
            - fiatAccount
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: >-
            External Account ID (`ext_` prefix). Null when externalUnregistered
            (e.g. an incoming wire from an unregistered sender).
        asset:
          type: string
          enum:
            - usd
          description: Canonical asset identifier.
        network:
          type: string
          enum:
            - ach
            - achSameDay
            - wire
          nullable: true
          description: >-
            Network identifier.


            DEVIATION from the ratified OMS v0.12 contract
            (docs/specs/2026-08-05-oms-v0.12-openapi.yaml,

            BankUsInstrument): the ratified shape has `network` required and
            non-nullable

            (no `null` option, unlike `id` on this same schema). Real
            legacy/#2528-era

            contamination means a bankUs row can carry a stored rail (`swift`,

            `international_wire`, `rtp`) that is not one of this enum's three
            members —

            rendering that as the Go zero value (`""`) reverses what #2528/#2666
            were

            built to fix: a real generated client (this repo's own npm/zod
            package

            included) fails `z.enum([...]).parse()` on an empty string just as
            hard as

            on the raw invalid token, rejecting the whole response instead of
            one

            field. Making the field nullable lets a degraded row render
            `network: null`

            — schema-valid for a nullable field, same posture as the
            dropped/absent

            field a pre-#2660 client would have seen. Not recorded in the
            upstream

            snapshot's §4 errata (that section is for defects IN the ratified
            snapshot,

            not BPN's own accepted deviations from it) — flagged here and in the
            PR

            description instead.
        secCode:
          allOf:
            - $ref: '#/components/schemas/SecCode'
          description: >-
            ACH SEC code (populated only on ach/achSameDay). Server-derived from
            the

            destination owner's and the source customer's entityType, read
            directly

            from the DB/Customer record — not from this wire-facing instrument.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
        details:
          type: object
          properties:
            accountNumberLast4:
              type: string
              description: Last four digits of the account number.
            bankName:
              type: string
              nullable: true
              description: Bank display name.
          required:
            - accountNumberLast4
            - bankName
          nullable: true
          description: >-
            Populated only when `id` is null (unregistered external sender);
            null for registered instruments.
      description: |-
        US bank account instrument — a uniform reference. Dereference the
        external account by `id` for routing number, account type, and full
        account number.
      title: US bank account
    BankIbanInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - network
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - bankIban
          description: Type discriminator.
        category:
          type: string
          enum:
            - fiatAccount
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: External Account ID (`ext_` prefix). Null when externalUnregistered.
        asset:
          type: string
          description: Canonical asset identifier.
        network:
          type: string
          enum:
            - swift
          description: Network identifier.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
        details:
          type: object
          properties:
            accountNumberLast4:
              type: string
              description: Last four characters of the IBAN.
            bankName:
              type: string
              nullable: true
              description: Bank display name.
          required:
            - accountNumberLast4
            - bankName
          nullable: true
          description: >-
            Populated only when `id` is null (unregistered external sender);
            null for registered instruments.

            `accountNumberLast4` carries the last 4 of the IBAN — no separate
            `ibanLast4` key on this slim shape.
      description: |-
        IBAN bank account instrument — a uniform reference. Dereference the
        external account by `id` for the BIC and bank address.
      title: IBAN bank account
    BankCanadaInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - network
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - bankCanada
          description: Type discriminator.
        category:
          type: string
          enum:
            - fiatAccount
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: External Account ID (`ext_` prefix). Null when externalUnregistered.
        asset:
          type: string
          enum:
            - usd
            - cad
          description: Canonical asset identifier.
        network:
          type: string
          enum:
            - swift
            - local
          description: USD uses `swift`; CAD uses `local`.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
        details:
          type: object
          properties:
            accountNumberLast4:
              type: string
              description: Last four digits of the account number.
            bankName:
              type: string
              nullable: true
              description: Bank display name.
          required:
            - accountNumberLast4
            - bankName
          nullable: true
          description: >-
            Populated only when `id` is null (unregistered external sender);
            null for registered instruments.
      description: >-
        Canadian bank account instrument — a uniform reference. USD routes over

        SWIFT, CAD over local rails. Dereference the external account by `id`
        for

        institution/transit coordinates.
      title: Canadian bank account
    CardInstrument:
      type: object
      required:
        - type
        - category
        - id
        - asset
        - network
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - card
          description: Type discriminator.
        category:
          type: string
          enum:
            - fiatAccount
          description: >-
            High-level grouping: `fiatAccount` for bank or card accounts,
            `crypto` for wallets.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: >-
            Card External Account ID (`ext_` prefix). Null for a
            pre-#1917-migration

            card-sell row, whose external account id column was added nullable

            without a backfill.


            DEVIATION from the ratified OMS v0.12 contract
            (docs/specs/2026-08-05-oms-v0.12-openapi.yaml,

            CardInstrument): the ratified shape has `id` required and
            non-nullable,

            documented as "Always registered". BPN's own historical data
            contradicts

            that — the pre-#1917 legacy rows genuinely have no id — so this
            field is

            deliberately nullable rather than emitting an empty string that
            fails the

            `typeId` scalar's pattern. Not recorded in the upstream snapshot's
            §4

            errata (that section is for defects IN the ratified snapshot, not
            BPN's

            own accepted deviations from it) — flagged here and in the PR
            description

            instead. Follow-up: either backfill the pre-#1917 quote rows so `id`
            is

            always resolvable, or get this nullability formally signed off with
            OMS

            product as a permanent BPN deviation.
        asset:
          type: string
          enum:
            - usd
          description: Canonical asset identifier.
        network:
          type: string
          enum:
            - card
          description: Network identifier.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
      description: >-
        Card instrument — a uniform reference. Usually registered: dereference
        the

        external account by `id` for the card brand, last 4, and expiry.
      title: Card
    CashInstrument:
      type: object
      required:
        - type
        - category
        - asset
        - displayName
      properties:
        party:
          allOf:
            - $ref: '#/components/schemas/Party'
          description: Structured identity of who is on this side.
        memo:
          type: string
          description: Free-text message travelling with the transfer on this side's rail.
        type:
          type: string
          enum:
            - cash
          description: Type discriminator.
        category:
          type: string
          enum:
            - cash
          description: 'High-level grouping: always `cash` for cash pickups and drops.'
        asset:
          type: string
          description: Canonical asset identifier.
        cashLocationId:
          type: string
          description: Cash location ID from `GET /cash-locations`.
        displayName:
          type: string
          description: >-
            Opaque, render-only summary for list/detail display. Never a full
            account number/IBAN/PAN.
      description: |-
        Cash pickup/drop instrument — a uniform reference. Dereference the cash
        location by `cashLocationId` for its address.
      title: Cash
    FiatReturnDestinationBankUs:
      type: object
      required:
        - type
        - network
        - id
      properties:
        type:
          type: string
          enum:
            - bankUs
          description: Type discriminator.
        network:
          type: string
          enum:
            - ach
            - achSameDay
            - wire
          description: Rail to return on.
        id:
          type: string
          description: US bank ExternalAccount id (ext_ prefix).
      description: Registered US bank fiat return destination (v0.11-8).
      title: US bank account
    FiatReturnDestinationBankIban:
      type: object
      required:
        - type
        - network
        - id
      properties:
        type:
          type: string
          enum:
            - bankIban
          description: Type discriminator.
        network:
          type: string
          enum:
            - swift
        id:
          type: string
          description: IBAN ExternalAccount id (ext_ prefix).
      description: Registered IBAN fiat return destination (v0.11-8).
      title: IBAN bank account
    FiatReturnDestinationBankCanada:
      type: object
      required:
        - type
        - network
        - id
      properties:
        type:
          type: string
          enum:
            - bankCanada
          description: Type discriminator.
        network:
          type: string
          enum:
            - swift
            - local
          description: USD uses swift; CAD uses local (CAD rejected 422 in v1).
        id:
          type: string
          description: Canadian bank ExternalAccount id (ext_ prefix).
      description: >-
        Registered Canadian bank fiat return destination (v0.11-8). USD uses
        `swift`;

        CAD (`local`) is rejected with 422 in v1 (USD-only).
      title: Canadian bank account
    FiatReturnDestinationWalletFiat:
      type: object
      required:
        - type
        - id
      properties:
        type:
          type: string
          enum:
            - walletFiat
          description: Type discriminator.
        id:
          type: string
          description: OMS fiat wallet id (wlt_fiat_ prefix). Rejected 422 in v1.
      description: >-
        Fiat balance wallet return destination (v0.11-8). Rejected with 422 in
        v1 —

        holding a return as a fiat balance is planned for v0.12 (mirrors the

        `walletFiat` VA-destination rejection).
      title: Fiat wallet
    int64String:
      type: string
      description: Wire-safe integer string for fiat amounts within int64 range.
      x-go-type-import:
        path: github.com/0xPolygon/bpn-lib/numeric
      x-go-type: numeric.Int64String
    AssetNetworkPair:
      type: object
      required:
        - asset
        - network
      properties:
        asset:
          type: string
        network:
          type: string
      description: 'One (asset, network) tuple — e.g. `{ asset: "usd", network: "ach" }`.'
    BankRoutingBlockBeneficiary:
      type: object
      required:
        - name
        - address
      properties:
        name:
          type: string
        address:
          type: string
      description: |-
        Beneficiary on a bank routing block - the entity to which the funds
        are ultimately credited. For SWIFT this is Erebor (the bank);
        for domestic rails this is the customer. Response-only,
        system-synthesised (Erebor entity or customer counterparty). The address
        is a single formatted display line (spec §BankRoutingBlock), e.g.
        "6 Acme Way, Bentonville, AR 72712 US".
    Party:
      type: object
      required:
        - relationship
        - id
        - name
      properties:
        relationship:
          type: string
          enum:
            - customer
            - otherCustomer
            - externalRegistered
            - externalUnregistered
          description: Which kind of party this is.
        id:
          type: string
          allOf:
            - $ref: '#/components/schemas/typeId'
          nullable: true
          description: >-
            `cst_` for customer/otherCustomer; `ctp_` for externalRegistered;
            null for externalUnregistered.
        name:
          type: string
          nullable: true
          description: >-
            Display name. Null only when genuinely unknown (an unattributed
            external sender).
      description: >-
        Response-only identity of who is on one side of a transaction — a
        uniform

        `{relationship, id, name}` reference. `id` is the Customer (`cst_`) for

        `customer`/`otherCustomer`, the Counterparty (`ctp_`) for

        `externalRegistered`, and null for `externalUnregistered`. Entity type
        and

        address live on the dereferenced Customer/Counterparty resource, not
        here.

        `name` is populated for every relationship except a genuinely-unknown

        external sender.
    SecCode:
      type: string
      enum:
        - ccd
        - ppd
        - web
      description: >-
        ACH SEC code. Populated only when the destination bank network is

        `ach`/`achSameDay`; null otherwise. Server-derived from the destination
        owner's

        and the source customer's `entityType`.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Token from POST /auth/token

````