Lightspark Cross-Currency Transfers API

Endpoints for creating and confirming quotes for cross-currency transfers

Operations 6

GET /receiver/uma/{receiverUmaAddress} Look up an UMA address for payment #
GET /receiver/external-account/{accountId} Look up an external account for payment #
GET /quotes/{quoteId} Get quote by ID #
POST /quotes Create a transfer quote #
POST /quotes/{quoteId}/execute Execute a quote #
POST /crypto/estimate-withdrawal-fee Estimate crypto withdrawal fee #

Work with this as data

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

MCP server

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

https://apis.io/mcp

Tools for apis

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

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/lightspark-cross-currency-transfers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

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

Get an API key

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

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

OpenAPI Specification

lightspark-cross-currency-transfers-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Grid 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:
    Quote:
      type: object
      required:
      - id
      - status
      - expiresAt
      - createdAt
      - source
      - destination
      - sendingCurrency
      - receivingCurrency
      - totalSendingAmount
      - totalReceivingAmount
      - exchangeRate
      - feesIncluded
      - transactionId
      properties:
        id:
          type: string
          description: Unique identifier for this quote
          example: Quote:019542f5-b3e7-1d02-0000-000000000006
        status:
          type: string
          enum:
          - PENDING
          - PENDING_AUTHORIZATION
          - PROCESSING
          - COMPLETED
          - FAILED
          - EXPIRED
          description: 'Current status of the quote. `PENDING_AUTHORIZATION` occurs only for customers in a region where Strong Customer Authentication is required (e.g. EU): the quote carries an `scaChallenge` that must be authorized before execution, and for realtime-funding sources `paymentInstructions` are withheld until it is satisfied.'
          example: PENDING
        createdAt:
          type: string
          format: date-time
          description: When this quote was created
          example: '2025-10-03T12:00:00Z'
        expiresAt:
          type: string
          format: date-time
          description: 'Absolute UTC timestamp when the rate locked in this quote becomes invalid and the quote can no longer be executed. The window depends on the rail and corridor: instant rails (Lightning, Spark, USDC on Solana/Base/Polygon, RTP, SEPA Instant) typically expire in 1–5 minutes; corridors with longer settlement guarantees may have longer windows. Always rely on this timestamp rather than assuming a fixed window.'
          example: '2025-10-03T12:05:00Z'
        source:
          $ref: '#/components/schemas/QuoteSourceOneOf'
        destination:
          $ref: '#/components/schemas/QuoteDestinationOneOf'
        sendingCurrency:
          $ref: '#/components/schemas/Currency'
          description: Currency for the sending amount
        receivingCurrency:
          $ref: '#/components/schemas/Currency'
          description: Currency for the receiving amount
        totalSendingAmount:
          type: integer
          format: int64
          description: The total amount that will be sent in the smallest unit of the sending currency (eg. cents).
          exclusiveMinimum: 0
          example: 123010
        totalReceivingAmount:
          type: integer
          format: int64
          description: The total amount that will be received in the smallest unit of the receiving currency (eg. cents).
          exclusiveMinimum: 0
          example: 1000
        exchangeRate:
          type: number
          description: Number of sending currency units per receiving currency unit.
          exclusiveMinimum: 0
        feesIncluded:
          type: integer
          format: int64
          description: 'The fees associated with the quote in the smallest unit of the sending currency (eg. cents). Note: this value may fluctuate between quotes — some underlying fee components are defined in the receiving currency, so their equivalent in the sending currency moves with the FX rate. The fees shown here are locked only for the lifetime of this quote.'
          minimum: 0
          example: 10
        paymentInstructions:
          type: array
          description: Payment instructions for executing the payment. This is not required when using an internal account source.
          items:
            $ref: '#/components/schemas/PaymentInstructions'
          example:
          - accountOrWalletInfo:
              accountType: USD_ACCOUNT
              paymentRails:
              - ACH
              - WIRE
              accountNumber: '1234567890'
              routingNumber: '021000021'
              bankName: Chase Bank
              reference: UMA-Q12345-REF
            instructionsNotes: Include reference UMA-Q12345-REF in memo
          - accountOrWalletInfo:
              accountType: SPARK_WALLET
              assetType: BTC
              address: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu
              invoice: lnbc15u1p3xnhl2pp5jptserfk3zk4qy42tlucycrfwxhydvlemu9pqr93tuzlv9cc7g3sdqsvfhkcap3xyhx7un8cqzpgxqzjcsp5f8c52y2stc300gl6s4xswtjpc37hrnnr3c9wvtgjfuvqmpm35evq9qyyssqy4lgd8tj637qcjp05rdpxxykjenthxftej7a2zzmwrmrl70fyj9hvj0rewhzj7jfyuwkwcg9g2jpwtk3wkjtwnkdks84hsnu8xps5vsq4gj5hs
        transactionId:
          type: string
          description: The ID of the transaction created from this quote.
          example: Transaction:019542f5-b3e7-1d02-0000-000000000005
        remittanceInformation:
          type: string
          maxLength: 80
          description: 'Free-form information about the payment that travels with it to the recipient, as provided on the quote request. The field this populates depends on the payment rail: for ACH it populates the Addenda record, for FedNow and RTP it populates the remittanceInformation field, and for wires it populates the OBI (Originator to Beneficiary Information) / beneficiary information.'
          example: '12345'
        counterpartyInformation:
          $ref: '#/components/schemas/CounterpartyInformation'
          description: Additional information about the counterparty, if available and required by the platform in their configuration.
        rateDetails:
          $ref: '#/components/schemas/OutgoingRateDetails'
          description: Details about the rate and fees for the transaction.
        scaChallenge:
          $ref: '#/components/schemas/ScaChallenge'
          readOnly: true
          description: 'Present only while `status` is `PENDING_AUTHORIZATION`: the Strong Customer Authentication challenge to satisfy before this quote can be executed (or, for realtime-funding sources, before `paymentInstructions` are issued). Omitted for customers outside SCA-regulated regions (non-EU).'
    BasePaymentAccountInfo:
      type: object
      required:
      - accountType
      properties:
        accountType:
          $ref: '#/components/schemas/PaymentAccountType'
    QuoteDestinationOneOf:
      oneOf:
      - $ref: '#/components/schemas/AccountDestination'
      - $ref: '#/components/schemas/UmaAddressDestination'
      discriminator:
        propertyName: destinationType
        mapping:
          ACCOUNT: '#/components/schemas/AccountDestination'
          UMA_ADDRESS: '#/components/schemas/UmaAddressDestination'
    BdtAccountInfo:
      allOf:
      - $ref: '#/components/schemas/BdtAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - BANK_TRANSFER
              - MOBILE_MONEY
    PhpAccountInfo:
      allOf:
      - $ref: '#/components/schemas/PhpAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - BANK_TRANSFER
    XofAccountInfoBase:
      type: object
      required:
      - accountType
      - phoneNumber
      - provider
      - region
      properties:
        accountType:
          type: string
          enum:
          - XOF_ACCOUNT
        phoneNumber:
          type: string
          description: The phone number in international format
          example: '+1234567890'
          minLength: 7
          maxLength: 15
          pattern: ^\+[0-9]{6,14}$
        provider:
          type: string
          description: The mobile money provider name
          minLength: 1
          maxLength: 255
        region:
          type: string
          description: Country code within the West African CFA franc zone
          minLength: 2
          maxLength: 2
          pattern: ^[A-Z]{2}$
          enum:
          - BJ
          - CI
          - SN
          - TG
      example:
        accountType: XOF_ACCOUNT
        phoneNumber: '+1234567890'
        provider: Example Provider
        region: BJ
    PaymentEthereumWalletInfo:
      title: Ethereum Wallet
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/EthereumWalletInfo'
      - type: object
        properties:
          assetType:
            type: string
            description: Type of asset
            enum:
            - USDC
    HkdAccountInfo:
      allOf:
      - $ref: '#/components/schemas/HkdAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - BANK_TRANSFER
    PaymentUsdAccountInfo:
      title: USD Bank Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/UsdAccountInfo'
      - 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
    PaymentCadAccountInfo:
      title: CAD Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/CadAccountInfo'
      - 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
    PaymentGhsAccountInfo:
      title: GHS Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/GhsAccountInfo'
      - 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
    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}'
    UgxAccountInfo:
      allOf:
      - $ref: '#/components/schemas/UgxAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - MOBILE_MONEY
    MyrAccountInfoBase:
      type: object
      required:
      - accountType
      - bankName
      - accountNumber
      - swiftCode
      properties:
        accountType:
          type: string
          enum:


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