Lightspark Sandbox API

Endpoints to trigger test cases in sandbox

Operations 7

POST /sandbox/webhooks/test Send a test webhook #
POST /sandbox/send Simulate sending funds #
POST /sandbox/uma/receive Simulate payment send to test receiving an UMA payment #
POST /sandbox/internal-accounts/{accountId}/fund Simulate funding an internal account #
POST /sandbox/cards/{id}/simulate/authorization Simulate a card authorization #
POST /sandbox/cards/{id}/simulate/clearing Simulate a card clearing #
POST /sandbox/cards/{id}/simulate/return Simulate a card return #

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-sandbox-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-sandbox-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Grid Sandbox 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: Sandbox
  description: Endpoints to trigger test cases in sandbox
paths:
  /sandbox/webhooks/test:
    post:
      summary: Send a test webhook
      description: Send a test webhook to the configured endpoint
      operationId: sendTestWebhook
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      responses:
        '200':
          description: Webhook delivered successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestWebhookResponse'
        '400':
          description: Bad request - Webhook delivery failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /sandbox/send:
    post:
      summary: Simulate sending funds
      description: 'Simulate sending funds to the bank account as instructed in the quote.

        This endpoint is only for the sandbox environment and will fail for production platforms/keys.

        '
      operationId: sandboxSend
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxSendRequest'
      responses:
        '200':
          description: Funds received successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutgoingTransaction'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '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'
  /sandbox/uma/receive:
    post:
      summary: Simulate payment send to test receiving an UMA payment
      description: 'Simulate sending payment from an sandbox uma address to a platform customer to test payment receive.

        This endpoint is only for the sandbox environment and will fail for production platforms/keys.

        '
      operationId: sandboxReceive
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxUmaReceiveRequest'
      responses:
        '200':
          description: Payment triggered successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IncomingTransaction'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '404':
          description: Sender or receiver not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /sandbox/internal-accounts/{accountId}/fund:
    post:
      summary: Simulate funding an internal account
      description: 'Simulate receiving funds into an internal account in the sandbox environment. This is useful for testing scenarios where you need to add funds to a customer''s or platform''s internal account without going through a real bank transfer or following payment instructions.

        This endpoint is only for the sandbox environment and will fail for production platforms/keys.

        '
      operationId: sandboxFundInternalAccount
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      parameters:
      - name: accountId
        in: path
        required: true
        description: The ID of the internal account to fund
        schema:
          type: string
        example: InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxFundRequest'
            examples:
              fundUSDAccount:
                summary: Fund USD internal account with $1,000
                value:
                  amount: 100000
              fundBTCAccount:
                summary: Fund BTC internal account with 0.01 BTC
                value:
                  amount: 1000000
      responses:
        '200':
          description: Internal account funded successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalAccount'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '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'
  /sandbox/cards/{id}/simulate/authorization:
    post:
      summary: Simulate a card authorization
      description: 'Simulate an inbound card authorization in the sandbox environment. Drives the same internal `authorize` + `reconcile` paths the card issuer would call in production, so platforms can exercise Grid''s decisioning + funding-source pull behavior end-to-end without an external network round-trip.


        The decisioning outcome is controlled by the last three characters of `merchant.descriptor`:


        | Suffix | Outcome | | ------ | ------- | | `002`  | Decline — `INSUFFICIENT_FUNDS` (the pull on the funding source fails) | | `003`  | Decline — `CARD_PAUSED` (intended to verify a frozen card refuses auths) | | `005`  | Delayed pull (~30s) — exercises the `PENDING → CONFIRMED` path | | `006`  | Pull succeeds but the confirmation event reports `FAILED` — exercises the high-urgency `EXCEPTION` alert | | any other | Approved |


        Production returns `404` on this path.

        '
      operationId: sandboxSimulateCardAuthorization
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: The id of the card to simulate an authorization against.
        schema:
          type: string
        example: Card:019542f5-b3e7-1d02-0000-000000000010
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxCardAuthorizationRequest'
            examples:
              coffeeAuth:
                summary: Approved $12.50 auth at a coffee shop
                value:
                  amount: 1250
                  currency:
                    code: USD
                  merchant:
                    descriptor: BLUE BOTTLE COFFEE SF
                    mcc: '5814'
                    country: US
              declinedInsufficientFunds:
                summary: Declined — insufficient funds (descriptor suffix `002`)
                value:
                  amount: 50000
                  currency:
                    code: USD
                  merchant:
                    descriptor: AMAZON RETAIL US-002
                    mcc: '5942'
                    country: US
      responses:
        '200':
          description: Simulated authorization processed. Returns the resulting card transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardTransaction'
        '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'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '404':
          description: Card not found (also returned in production for this path)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /sandbox/cards/{id}/simulate/clearing:
    post:
      summary: Simulate a card clearing
      description: 'Simulate a clearing (settlement) event against an existing `CardTransaction` in the sandbox environment.


        - A clearing `amount` greater than the authorized amount exercises the over-auth post-hoc-pull path (e.g. restaurant tip on top of a 20% over-auth).

        - A clearing `amount` of `0` exercises the `AUTHORIZATION_EXPIRY` path — the auth expires with no clearing posted.

        - Suffix-driven outcomes on the parent transaction''s id govern whether the post-hoc pull succeeds (use the suffix table from `simulate/authorization` to construct deterministic test cases).


        Production returns `404` on this path.

        '
      operationId: sandboxSimulateCardClearing
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: The id of the card the clearing applies to.
        schema:
          type: string
        example: Card:019542f5-b3e7-1d02-0000-000000000010
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxCardClearingRequest'
            examples:
              tipOnTopClearing:
                summary: Clearing larger than auth — exercises post-hoc pull
                value:
                  cardTransactionId: CardTransaction:019542f5-b3e7-1d02-0000-000000000100
                  amount: 1500
              authorizationExpiry:
                summary: Clearing of 0 — exercises authorization expiry
                value:
                  cardTransactionId: CardTransaction:019542f5-b3e7-1d02-0000-000000000100
                  amount: 0
      responses:
        '200':
          description: Simulated clearing processed. Returns the updated card transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardTransaction'
        '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'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '404':
          description: Card or card transaction not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
  /sandbox/cards/{id}/simulate/return:
    post:
      summary: Simulate a card return
      description: 'Simulate a merchant-initiated `RETURN` against an existing settled card transaction in the sandbox environment. Creates a `CardRefund` on the parent and either flips the parent to `REFUNDED` (full refund) or keeps it `SETTLED` with a non-zero `refundedAmount` (partial refund).


        Production returns `404` on this path.

        '
      operationId: sandboxSimulateCardReturn
      tags:
      - Sandbox
      security:
      - BasicAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: The id of the card the return applies to.
        schema:
          type: string
        example: Card:019542f5-b3e7-1d02-0000-000000000010
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxCardReturnRequest'
            examples:
              fullRefund:
                summary: Full refund of a $15.00 settled transaction
                value:
                  cardTransactionId: CardTransaction:019542f5-b3e7-1d02-0000-000000000100
                  amount: 1500
      responses:
        '200':
          description: Simulated return processed. Returns the updated card transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardTransaction'
        '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'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '404':
          description: Card or card transaction 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:
    Refund:
      type: object
      required:
      - reference
      - initiatedAt
      - status
      properties:
        reference:
          type: string
          description: The unique reference ID of the refund
          example: UMA-Q12345-REFUND
        initiatedAt:
          type: string
          format: date-time
          description: When the refund was initiated
          example: '2025-08-15T14:30:00Z'
        settledAt:
          type: string
          format: date-time
          description: When the refund was settled
          example: '2025-08-15T14:35:00Z'
        status:
          type: string
          enum:
          - PENDING
          - COMPLETED
          - FAILED
          description: Current status of the refund
          example: COMPLETED
        reason:
          type: string
          enum:
          - TRANSACTION_FAILED
          - USER_CANCELLATION
          - TIMEOUT
          description: Reason for the refund
          example: TRANSACTION_FAILED
    BasePaymentAccountInfo:
      type: object
      required:
      - accountType
      properties:
        accountType:
          $ref: '#/components/schemas/PaymentAccountType'
    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
    TransactionType:
      type: string
      enum:
      - INCOMING
      - OUTGOING
      description: Type of transaction (incoming payment or outgoing payment)
    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}'
    CardTransaction:
      title: Card Transaction
      type: object
      required:
      - type
      - id
      - status
      - direction
      - merchant
      - authorizedAmount
      - accountId
      - customerId
      - platformCustomerId
      - authorizedAt
      - createdAt
      - updatedAt
      description: Parent transaction row for a card authorization and all of the pulls / settlements / refunds that reconcile against it. Child events are rolled up into the `pullSummary`, `refundSummary`, and `settlementSummary` aggregates. Delivered as the payload of the generic transaction webhook stream (extends the Transaction model with a card destination type) on every transition.
      properties:
        type:
          type: string
          enum:
          - CARD
          description: Discriminator identifying this transaction as a card transaction in the `Transaction` list.
        id:
          type: string
          description: System-generated unique card transaction identifier
          readOnly: true
          example: CardTransaction:019542f5-b3e7-1d02-0000-000000000100
        cardId:
          type: string
          description: The id of the `Card` this transaction was made on.
          example: Card:019542f5-b3e7-1d02-0000-000000000010
        customerId:
          type: string
          description: System ID of the customer (cardholder) this transaction belongs to.
          example: Customer:019542f5-b3e7-1d02-0000-000000000001
        platformCustomerId:
          type: string
          description: Platform-specific ID of the customer (cardholder) this transaction belongs to.
          example: 18d3e5f7b4a9c2
        issuerTransactionToken:
          type: string
          description: Opaque identifier for the transaction on the underlying issuer. Used to cross-reference Grid records against issuer dashboards and webhooks.
          example: lithic_txn_b81c2a4f
          readOnly: true
        status:
          $ref: '#/components/schemas/CardTransactionStatus'
        direction:
          $ref: '#/components/schemas/TransactionDirection'
          description: Card transactions debit the customer's account.
          example: DEBIT
        merchant:
          $ref: '#/components/schemas/CardMerchant'
        authorizedAmount:
          $ref: '#/components/schemas/CurrencyAmount'
        settledAmount:
          $ref: '#/components/schemas/CurrencyAmount'
        refundedAmount:
          $ref: '#/components/schemas/CurrencyAmount'
        accountId:
          type: string
          description: Internal account id that funded this transaction (the funding source selected by Authorization Decisioning at auth time).
          example: InternalAccount:019542f5-b3e7-1d02-0000-000000000002
        pullSummary:
          $ref: '#/components/schemas/CardPullSummary'
        refundSummary:
          $ref: '#/components/schemas/CardRefundSummary'
        settlementSummary:
          $ref: '#/components/schemas/CardSettlementSummary'
        authorizedAt:
          type: string
          format: date-time
          description: When the auth was approved.
          example: '2026-05-08T14:30:00Z'
        lastEventAt:
          type: string
          format: date-time
          description: Timestamp of the most recent reconcile event (pull / clearing / refund) against this transaction.
          example: '2026-05-08T15:42:11Z'
        createdAt:
          type: string
          format: date-time
          description: Creation timestamp (same as `authorizedAt` for card transactions).
          readOnly: true
          example: '2026-05-08T14:30:00Z'
        updatedAt:
          type: string
          format: date-time
          description: Last update timestamp.
          readOnly: true
          example: '2026-05-08T15:42:11Z'
    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:
          - MYR_ACCOUNT
        bankName:
          type: string
          description: The name of the bank
          minLength: 1
          maxLength: 255
        accountNumber:
          type: string
          description: Malaysian bank account number
          minLength: 1
          maxLength: 34
          example: '1234567890'
        swiftCode:
          type: string
          description: The SWIFT/BIC code of the bank
          example: MABORUMMYYY
          minLength: 8
          maxLength: 11
          pattern: ^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$
      example:
        accountType: MYR_ACCOUNT
        bankName: Example Bank
        accountNumber: '1234567890'
        swiftCode: MABORUMMYYY
    InternalAccountType:
      title: Internal Account Type
      type: string
      enum:
      - INTERNAL_FIAT
      - INTERNAL_CRYPTO
      - EMBEDDED_WALLET
      description: 'Classification of an internal account.


        - `INTERNAL_FIAT`: A Grid-managed fiat holding account (for example, the USD holding account used as the source for Payouts flows).

        - `INTERNAL_CRYPTO`: A Grid-managed crypto holding account denominated in a stablecoin such as USDC.

        - `EMBEDDED_WALLET`: A self-custodial Embedded Wallet provisioned for the customer. Outbound transfers require a session signature produced by the customer''s device — see the Embedded Wallets guide.'
    HkdAccountInfoBase:
      type: object
      required:
      - accountType
      - bankName
      - accountNumber
      - swiftCode
      properties:
        accountType:
          type: string
          enum:
          - HKD_ACCOUNT
        bankName:
          type: string
          description: The name of the bank
          minLength: 1
          maxLength: 255
        accountNumber:
          type: string
          description: Hong Kong bank account number
          minLength: 1
          maxLength: 34
          example: '123456789012'
        swiftCode:
          type: string
          description: The SWIFT/BIC code of the bank
          example: HSBCHKHHHKH
          minLength: 8
          maxLength: 11
          pattern: ^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$
      example:
        accountType: HKD_ACCOUNT
        bankName: Example Bank
        accountNumber: '123456789012'
        swiftCode: HSBCHKHHHKH
    PaymentUgxAccountInfo:
      title: UGX Account
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/UgxAccountInfo'
      - 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
    UsdAccountInfoBase:
      type: object
      required:
      - accountType
      - accountNumber
      - routingNumber
      properties:
        accountType:
          type: string
          enum:
          - USD_ACCOUNT
        accountNumber:
          type: string
          description: The account number of the bank
          minLength: 1
          maxLength: 34
        routingNumber:
          type: string
          description: The ABA routing number
          example: '021000021'
          minLength: 9
          maxLength: 9
          pattern: ^[0-9]{9}$
      example:
        accountType: USD_ACCOUNT
        accountNumber: '1234567890'
        routingNumber: '021000021'
    PaymentBaseWalletInfo:
      title: Base Wallet
      allOf:
      - $ref: '#/components/schemas/BasePaymentAccountInfo'
      - $ref: '#/components/schemas/BaseWalletInfo'
      - type: object
        properties:
          assetType:
            type: string
            description: Type of asset
            enum:
            - USDC
    EgpAccountInfo:
      allOf:
      - $ref: '#/components/schemas/EgpAccountInfoBase'
      - type: object
        required:
        - paymentRails
        properties:
          paymentRails:
            type: array
            items:
              type: string
              enum:
              - BANK_TRANSFER
              - MOBILE_MONEY
    AccountTransactionSource:
      title: Account Source
      allOf:
      - $ref: '#/components/schemas/BaseTransactionSource'
      - type: object
        required:
        - accountId
        - sourceType
        properties:
          sourceType:
            type: string
            enum:
            - ACCOUNT
          accountId:
            type: string
            description: Source account identifier
            example: InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965
          onChainTransaction:
            $ref: '#/components/schemas/OnChainTransaction'
            description: On-chain transaction that delivered funds from this source, when the source is an external crypto wallet. Populated once the crypto transfer has settled.
        description: Source account details
    IncomingTransactionFailureReason:
      type: string
      enum:
      - LNURLP_FAILED
      - PAY_REQUEST_FAILED
      - PAYMENT_APPROVAL_WEBHOOK_ERROR
      - PAYMENT_APPROVAL_TIMED_OUT
      - OFFRAMP_FAILED
      - MISSING_MANDATORY_PAYEE_DATA
      - QUOTE_EXPIRED
      - QUOTE_EXECUTION_FAILED
      description: Reason for failure of an incoming transaction. This is used to provide more context on why a transaction fa

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