Lightspark Cross-Currency Transfers API

Endpoints for creating and confirming quotes for cross-currency transfers

OpenAPI Specification

lightspark-cross-currency-transfers-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Grid Agent Management Cross-Currency Transfers API
  description: 'API for managing global payments on the open Money Grid. Built by Lightspark. See the full documentation at https://docs.lightspark.com/.

    '
  version: '2025-10-13'
  contact:
    name: Lightspark Support
    email: support@lightspark.com
  license:
    name: Proprietary
    url: https://lightspark.com/terms
servers:
- url: https://api.lightspark.com/grid/2025-10-13
  description: Production server
security:
- BasicAuth: []
- AgentAuth: []
tags:
- name: Cross-Currency Transfers
  description: Endpoints for creating and confirming quotes for cross-currency transfers
paths:
  /receiver/uma/{receiverUmaAddress}:
    get:
      summary: Look up an UMA address for payment
      description: 'Lookup a receiving UMA address to determine supported currencies and exchange rates.

        This endpoint helps platforms determine what currencies they can send to a given UMA address.

        '
      operationId: lookupUma
      tags:
      - Cross-Currency Transfers
      security:
      - BasicAuth: []
      parameters:
      - name: receiverUmaAddress
        in: path
        description: UMA address of the intended recipient
        required: true
        schema:
          type: string
      - name: senderUmaAddress
        in: query
        description: UMA address of the sender (optional if customerId is provided)
        required: false
        schema:
          type: string
      - name: customerId
        in: query
        description: System ID of the sender (optional if senderUmaAddress is provided)
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Successful lookup
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReceiverUmaLookupResponse'
        '400':
          description: Bad request - Missing or invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '404':
          description: UMA address not found. The address is well-formed but no receiver exists at the counterparty VASP (`UMA_NOT_FOUND`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '412':
          description: Counterparty doesn't support UMA version
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error412'
        '424':
          description: Counterparty issue
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error424'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /receiver/external-account/{accountId}:
    get:
      summary: Look up an external account for payment
      description: 'Lookup an external account by ID to determine supported currencies and exchange rates.

        This endpoint helps platforms determine what currencies they can send to a given external account, along with the current estimated exchange rates and minimum and maximum amounts that can be sent.

        '
      operationId: lookupExternalAccount
      tags:
      - Cross-Currency Transfers
      security:
      - BasicAuth: []
      parameters:
      - name: accountId
        in: path
        description: System-generated ID of the external account
        required: true
        schema:
          type: string
          example: ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965
      - name: senderUmaAddress
        in: query
        description: UMA address of the sender (optional if customerId is provided)
        required: false
        schema:
          type: string
      - name: customerId
        in: query
        description: System ID of the sender (optional if senderUmaAddress is provided)
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Successful lookup
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReceiverExternalAccountLookupResponse'
        '400':
          description: Bad request - Missing or invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '404':
          description: External account not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '412':
          description: Counterparty doesn't support UMA version
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error412'
        '424':
          description: Counterparty issue
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error424'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /quotes/{quoteId}:
    get:
      summary: Get quote by ID
      description: 'Retrieve a quote by its ID. If the quote has been settled, it will include

        the transaction ID. This allows clients to track the full lifecycle of a payment

        from quote creation to settlement.

        '
      operationId: getQuoteById
      tags:
      - Cross-Currency Transfers
      security:
      - BasicAuth: []
      parameters:
      - name: quoteId
        in: path
        description: ID of the quote to retrieve
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Quote retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '404':
          description: Quote not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /quotes:
    post:
      summary: Create a transfer quote
      description: 'Generate a quote for a cross-currency transfer between any combination of accounts

        and UMA addresses. This endpoint handles currency exchange and provides the necessary

        instructions to execute the transfer.


        **Transfer Types Supported:**

        - **Account to Account**: Transfer between internal/external accounts with currency exchange.

        - **Account to UMA**: Transfer from an internal account to an UMA address.

        - **UMA to Account or UMA to UMA**: This transfer type will only be funded by payment instructions, not from an internal account.


        **Key Features:**

        - **Flexible Amount Locking**: Always specify whether you want to lock the sending amount or receiving amount

        - **Currency Exchange**: Handles all cross-currency transfers with real-time exchange rates

        - **Payment Instructions**: For UMA or customer ID sources, provides banking details needed for execution


        **Important:** If you are transferring funds in the same currency (no exchange required),

        use the `/transfer-in` or `/transfer-out` endpoints instead.

        '
      operationId: createQuote
      tags:
      - Cross-Currency Transfers
      security:
      - BasicAuth: []
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        description: 'A unique identifier for the request. If the same key is sent multiple times, the server will return the same response as the first request.

          '
        schema:
          type: string
          example: <uuid>
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QuoteRequest'
            examples:
              accountToAccount:
                summary: Account to Account Transfer
                value:
                  source:
                    sourceType: ACCOUNT
                    accountId: InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965
                  destination:
                    destinationType: ACCOUNT
                    accountId: ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123
                  lockedCurrencySide: SENDING
                  lockedCurrencyAmount: 10000
                  description: Transfer between accounts, either internal or external.
              accountToUma:
                summary: Account to UMA Address Transfer
                value:
                  lookupId: LookupRequest:019542f5-b3e7-1d02-0000-000000000009
                  source:
                    sourceType: ACCOUNT
                    accountId: InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965
                  destination:
                    destinationType: UMA_ADDRESS
                    umaAddress: $receiver@uma.domain.com
                    currency: EUR
                  lockedCurrencySide: SENDING
                  lockedCurrencyAmount: 1000
                  description: 'Payment for invoice #1234'
              realTimeFundingToSparkWallet:
                summary: Real-time funding to Spark Wallet as an on-ramp flow. Immediate execution.
                value:
                  source:
                    sourceType: REALTIME_FUNDING
                    customerId: Customer:019542f5-b3e7-1d02-0000-000000000009
                    currency: USD
                  destination:
                    destinationType: ACCOUNT
                    accountId: ExternalAccount:b23dcbd6-dced-4ec4-b756-3c3a9ea3d456
                  lockedCurrencySide: RECEIVING
                  lockedCurrencyAmount: 10000
                  immediatelyExecute: true
                  description: Bitcoin reward payout!
      responses:
        '201':
          description: 'Transfer quote created successfully. The response includes exchange rates,

            fees, and transfer details. For transfers involving UMA addresses, payment

            instructions are also included for execution through banking systems.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
              example:
                id: Quote:019542f5-b3e7-1d02-0000-000000000006
                status: PENDING
                createdAt: '2025-10-03T12:00:00Z'
                expiresAt: '2025-10-03T12:05:00Z'
                source:
                  sourceType: ACCOUNT
                  accountId: InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965
                destination:
                  destinationType: ACCOUNT
                  accountId: ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123
                sendingCurrency:
                  code: USD
                  name: United States Dollar
                  symbol: $
                  decimals: 2
                receivingCurrency:
                  code: EUR
                  name: Euro
                  symbol: €
                  decimals: 2
                totalSendingAmount: 10000
                totalReceivingAmount: 9200
                exchangeRate: 0.92
                feesIncluded: 10
                transactionId: Transaction:019542f5-b3e7-1d02-0000-000000000005
        '202':
          description: 'Quote created but awaiting Strong Customer Authentication. Returned only for customers whose provider requires SCA (e.g. EU) on a realtime-funding source: the quote has status `PENDING_AUTHORIZATION` and carries an `scaChallenge`, and `paymentInstructions` are **withheld** until the challenge is authorized via `POST /quotes/{quoteId}/authorize`. Once authorized, the quote''s `paymentInstructions` are populated.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
        '400':
          description: Bad request - Missing or invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '412':
          description: Counterparty doesn't support UMA version
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error412'
        '424':
          description: Counterparty issue
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error424'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
        '501':
          description: Not implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error501'
  /quotes/{quoteId}/execute:
    post:
      summary: Execute a quote
      description: 'Execute a quote by its ID. This endpoint initiates the transfer between

        the source and destination accounts.


        This endpoint can only be used for quotes with a `source` which is either an internal account,

        or has direct pull functionality (e.g. ACH pull with an external account).


        When the quote''s `source` is an internal account of type `EMBEDDED_WALLET`,

        the request must include a `Grid-Wallet-Signature` header. The header value

        is the full Grid wallet signature built over the `payloadToSign` value from

        the quote''s `paymentInstructions[].accountOrWalletInfo` entry with the

        session private key of a verified authentication credential on the source

        Embedded Wallet.


        Once executed, the quote cannot be cancelled and the transfer will be processed.

        '
      operationId: executeQuote
      tags:
      - Cross-Currency Transfers
      security:
      - BasicAuth: []
      parameters:
      - name: quoteId
        in: path
        required: true
        description: The unique identifier of the quote to execute
        schema:
          type: string
        example: Quote:019542f5-b3e7-1d02-0000-000000000001
      - name: Idempotency-Key
        in: header
        required: false
        description: 'A unique identifier for the request. If the same key is sent multiple times, the server will return the same response as the first request.

          '
        schema:
          type: string
          example: <uuid>
      - name: Grid-Wallet-Signature
        in: header
        required: false
        description: Full Grid wallet signature over the `payloadToSign` returned in the quote's `paymentInstructions[].accountOrWalletInfo` entry, produced with the session private key of a verified authentication credential on the source Embedded Wallet. Required when the quote's source is an internal account of type `EMBEDDED_WALLET`; ignored for other source types.
        schema:
          type: string
        example: eyJwdWJsaWNLZXkiOiIwMmExYjIuLi4iLCJzY2hlbWUiOiJTSUdOQVRVUkVfU0NIRU1FX1RLX0FQSV9QMjU2Iiwic2lnbmF0dXJlIjoiMzA0NTAyMjEwMC4uLiJ9
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExecuteQuoteRequest'
      responses:
        '200':
          description: 'Quote processed. The outcome depends on whether SCA applies to the customer (currently EU customers):


            - **No SCA required:** the transfer is initiated and the quote status advances (`PROCESSING` / `COMPLETED`).


            - **SCA required:** the transfer is **not** initiated yet. The quote is returned with status `PENDING_AUTHORIZATION` and an `scaChallenge`; release the transfer by authorizing the quote you already hold — `POST /quotes/{quoteId}/authorize` (re-calling `execute` returns 409). A pre-funded send is a single challenge, so one authorization releases it. The challenge (and its SMS code / passkey assertion) only comes into existence once this call initiates the transfer, so the proof is always supplied on the follow-up authorize, never inline on this call. If an SMS code lapses, re-send it via `POST /quotes/{quoteId}/authorize/resend`.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
        '400':
          description: Bad request - Invalid quote ID or quote cannot be confirmed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized. Also returned when the quote's source is an internal account of type `EMBEDDED_WALLET` and the provided `Grid-Wallet-Signature` header is missing, malformed, or does not match the quote's `payloadToSign`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '404':
          description: Quote not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '409':
          description: Conflict - Quote already confirmed, expired, or in invalid state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error409'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /crypto/estimate-withdrawal-fee:
    post:
      summary: Estimate crypto withdrawal fee
      description: 'Estimate the network and application fees for a cryptocurrency withdrawal from a crypto internal account to an external blockchain address. Use this to show fee information to customers before they initiate a withdrawal.

        '
      operationId: estimateCryptoWithdrawalFee
      tags:
      - Cross-Currency Transfers
      security:
      - BasicAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EstimateCryptoWithdrawalFeeRequest'
            examples:
              estimateUSDCWithdrawal:
                summary: Estimate fee for USDC withdrawal on Solana
                value:
                  internalAccountId: InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123
                  currency: USDC
                  cryptoNetwork: SOLANA
                  amount: 1000000
                  destinationAddress: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
      responses:
        '200':
          description: Fee estimation returned successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateCryptoWithdrawalFeeResponse'
        '400':
          description: Bad request - Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '404':
          description: Internal account not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
components:
  schemas:
    PaymentEmbeddedWalletInfo:
      title: Embedded Wallet
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - type: object
        required:
        - accountType
        - payloadToSign
        properties:
          accountType:
            type: string
            enum:
            - EMBEDDED_WALLET
            description: Discriminator value identifying this as Embedded Wallet payment instructions.
          payloadToSign:
            type: string
            description: JSON-encoded transaction signing payload that must be stamped, as-is (byte-for-byte, without re-serialization), with the session private key of a verified authentication credential on the source Embedded Wallet. The resulting Grid wallet signature is passed as the `Grid-Wallet-Signature` header on `POST /quotes/{quoteId}/execute` to authorize the outbound transfer from the wallet.
            example: '{"type":"ACTIVITY_TYPE_SIGN_TRANSACTION_V2","timestampMs":"1746736509954","organizationId":"org_abc123","parameters":{"signWith":"wallet_abc123def456","unsignedTransaction":"ea69b4bf05f775209f26ff0a34a05569180f7936579d5c4af9377ae550194f72","type":"TRANSACTION_TYPE_ETHEREUM"},"generateAppProofs":true}'
    EurAccountInfoBase:
      type: object
      required:
      - accountType
      - iban
      properties:
        accountType:
          type: string
          enum:
          - EUR_ACCOUNT
        iban:
          type: string
          description: The IBAN of the bank account
          example: DE89370400440532013000
          minLength: 15
          maxLength: 34
          pattern: ^[A-Z]{2}[0-9]{2}[A-Za-z0-9]{11,30}$
        swiftCode:
          type: string
          description: The SWIFT/BIC code of the bank
          example: DEUTDEFF
          minLength: 8
          maxLength: 11
          pattern: ^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$
      example:
        accountType: EUR_ACCOUNT
        iban: DE89370400440532013000
        swiftCode: DEUTDEFF
    PaymentBwpAccountInfo:
      title: BWP Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/BwpAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type: string
            description: Unique reference code that must be included with the payment to properly credit it
            example: UMA-Q12345-REF
    QuoteSourceType:
      type: string
      enum:
      - ACCOUNT
      - REALTIME_FUNDING
      description: Type of quote funding source
      example: ACCOUNT
    PaymentSlvAccountInfo:
      title: SLV Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/SlvAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type: string
            description: Unique reference code that must be included with the payment to properly credit it
            example: UMA-Q12345-REF
    ExecuteQuoteRequest:
      type: object
      description: Optional body for executing a quote. Only needed to request a specific Strong Customer Authentication factor (`scaFactor`) for the challenge this call issues; omit the body entirely otherwise.
      properties:
        scaFactor:
          $ref: '#/components/schemas/ScaFactor'
          description: Optional preferred factor for the Strong Customer Authentication challenge this call issues. Only relevant for customers in a region where SCA is required (e.g. EU); ignored otherwise. Valid values for a per-transaction challenge are `SMS_OTP` (default) and `PASSKEY` — `TOTP` cannot carry the required dynamic linking and is rejected here. Omit to default to `SMS_OTP`.
    PaymentVndAccountInfo:
      title: VND Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/VndAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type: string
            description: Unique reference code that must be included with the payment to properly credit it
            example: UMA-Q12345-REF
    TzsAccountInfo:
      allOf:
      - $ref: '#/components/schemas/TzsAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - MOBILE_MONEY
    PaymentBrlAccountInfo:
      title: BRL Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - type: object
        required:
        - qrCode
        properties:
          accountType:
            type: string
            enum:
            - BRL_ACCOUNT
          qrCode:
            type: string
            description: A PIX QR code payload that can be used to fund the transaction. This can be rendered as a QR code image or pasted into a PIX-compatible banking app.
            minLength: 1
    PaymentJmdAccountInfo:
      title: JMD Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/JmdAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type: string
            description: Unique reference code that must be included with the payment to properly credit it
            example: UMA-Q12345-REF
    PaymentHkdAccountInfo:
      title: HKD Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/HkdAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type: string
            description: Unique reference code that must be included with the payment to properly credit it
            example: UMA-Q12345-REF
    ReceiverLookupResponse:
      type: object
      required:
      - supportedCurrencies
      - lookupId
      properties:
        supportedCurrencies:
          type: array
          description: List of currencies supported by the receiving account
          items:
            $ref: '#/components/schemas/CurrencyPreference'
        requiredPayerDataFields:
          type: array
          description: Fields required by the receiving institution about the payer before payment can be completed
          items:
            $ref: '#/components/schemas/CounterpartyFieldDefinition'
        lookupId:
          type: string
          description: Unique identifier for the lookup. Needed in the subsequent create quote request.
          example: Lookup:019542f5-b3e7-1d02-0000-000000000009
    Error404:
      type: object
      required:
      - message
      - status
      - code
      properties:
        status:
          type: integer
          enum:
          - 404
          description: HTTP status code
        code:
          type: string
          description: '| Error Code | Description |

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

            | TRANSACTION_NOT_FOUND | Transaction not found |

            | INVITATION_NOT_FOUND | Invitation not found |

            | USER_NOT_FOUND | Customer not found |

            | QUOTE_NOT_FOUND | Quote not found |

            | LOOKUP_REQUEST_NOT_FOUND | Lookup request not found |

            | TOKEN_NOT_FOUND | Token not found |

            | BULK_UPLOAD_JOB_NOT_FOUND | Bulk upload job not found |

            | REFERENCE_NOT_FOUND | Reference not found |

            | UMA_NOT_FOUND | The UMA address is well-formed but no receiver exists at the counterparty VASP |

            | STABLECOIN_PROVIDER_ACCOUNT_NOT_FOUND | Stablecoin provider account link not found |

            '
          enum:
          - TRANSACTION_NOT_FOUND
          - INVITATION_NOT_FOUND
          - USER_NOT_FOUND
          - QUOTE_NOT_FOUND
          - LOOKUP_REQUEST_NOT_FOUND
          - TOKEN_NOT_FOUND
          - BULK_UPLOAD_JOB_NOT_FOUND
          - REFERENCE_NOT_FOUND
          - UMA_NOT_FOUND
          - STABLECOIN_PROVIDER_ACCOUNT_NOT_FOUND
        message:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    InrAccountInfo:
      allOf:
      - $ref: '#/components/schemas/InrAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - UPI
              - NEFT
              - RTGS
    GtqAccountInfoBase:
      type: object
      required:
      - accountType
      - accountNumber
      - bankAccountType
      - bankName
      properties:
        accountType:
          type: string
          enum:
          - GTQ_ACCOUNT
        accountNumber:
          type: string
          description: The account number of the bank
          minLength: 1
          maxLength: 34
        bankAccountType:
          type: string
          description: The bank account type
          enum:
          - CHECKING
          - SAVINGS
        bankName:
          type: string
          description: The name of the beneficiary's bank
          minLength: 1
          maxLength: 255
      example:
        accountType: GTQ_ACCOUNT
        accountNumber: '1234567890'
        bankAccountType: CHECKING
        bankName: Example Bank
    CadAccountInfoBase:
      type: object
      required:
      - accountType
      - bankCode
      - branchCode
      - accountNumber
      properties:
        accountType:
          type: string
          enum:
          - CAD_ACCOUNT
        bankCode:
          type: string
          description: Canadian financial institution number (3 digits)
          example: '001'
          minLength: 3
          maxLength: 3
          pattern: ^[0-9]{3}$
        branchCode:
          type: string
          description: Transit number identifying the branch (5 digits)
          example: '00012'
          minLength: 5
          maxLength: 5
          pattern: ^[0-9]{5}$
        accountNumber:
          type: string
          description: Bank account number (7-12 digits)
          example: '1234567'
          minLength: 7
          maxLength: 12
          pattern: ^[0-9]{7,12}$
    EgpAccountInfo:
      allOf:
      - $ref: '#/components/schemas/EgpAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - BANK_TRANSFER
              - MOBILE_MONEY
    PaymentNgnAccountInfo:
      title: NGN Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/NgnAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type: string
            description: Unique reference code that must be included with the payment to properly credit it
            example: UMA-Q12345-REF
    QuoteDestinationOneOf:
      oneOf:
      - $ref: '#/components/schemas/AccountDestination'
      - $ref: '#/components/schemas/UmaAddressDestination'
      discriminator:
        propertyName: destinationType
        mapping:
          ACCOUNT: '#/components/schemas/AccountDestination'
          UMA_ADDRESS: '#/components/schemas/UmaAddressDestination'
    PaymentHtgAccountInfo:
      title: HTG Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/HtgAccountInfo'
      - type: object
        required:
        - reference
        properties:
          reference:
            type:

# --- truncated at 32 KB (140 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lightspark/refs/heads/main/openapi/lightspark-cross-currency-transfers-api-openapi.yml