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

# List

> Retrieve a paginated list of Virtual Account money-in transactions for an account. Each entry represents a single payment a customer made into one of the account's Virtual Accounts.

Results are restricted to transactions created within the last 12 months and are ordered newest-first by default. Use the query parameters below to paginate, sort, and filter the result set; pagination details are returned in the response `meta` object.

The following optional filters are available and may be combined: `transaction_id` (partial match), `merchant_reff_no` (partial match), `va_number` (exact match), `status`, `amount`, `amount_min`, `amount_max`, `has_settle`, `post_timestamp_from`/`post_timestamp_to`, `processed_timestamp_from`/`processed_timestamp_to`, and `settle_at_from`/`settle_at_to`. All timestamp filters accept a Unix timestamp in **milliseconds** and define an inclusive range.



## OpenAPI

````yaml https://payment-b2b.singapay.id/api/docs/merchant-api.json get /api/v1.0/va-transactions/{account_id}
openapi: 3.1.0
info:
  title: Singa Merchant API
  description: >-
    OpenAPI specification for the merchant/partner HTTP API. All routes below
    are additionally protected by `ip.whitelisted.merchant` — the caller IP must
    be registered for the credential or merchant. Obtain a JWT using `POST
    /api/v1.0/access-token/b2b` (Basic auth) or `POST
    /api/v1.1/access-token/b2b` (X-Signature) before calling secured endpoints.
  version: 1.0.0
servers:
  - url: https://sandbox-payment-b2b.singapay.id
    description: >-
      API host. Paths include `/api` prefix (see `RouteServiceProvider`).
      Replace scheme/host with your environment.
security: []
tags:
  - name: Security
    description: >-
      Merchant authentication (`OauthMerchantTokenController`). **v1.1** B2B
      token uses `X-CLIENT-ID`, `X-PARTNER-ID`, and `X-Signature` (no Basic
      auth). Secured routes also require the issued Bearer JWT plus
      `X-PARTNER-ID`.
  - name: Accounts
    description: >-
      Account management (`routes/merchantApiRoute.php`, `v1.0`). Path parameter
      `{id}` is always the account ULID.
  - name: Balance Inquiry
    description: >-
      Merchant and per-account balance inquiry (`BalanceController`, `v1.0`).
      Path `account_id` is the account ULID.
  - name: Statements
    description: >-
      Per-account statement list and detail
      (`AccountController::accountStatements`, `accountStatementDetail`, prefix
      `v1.0/statements`). Flugger responses; detail path param `{statement_id}`
      maps to `statements.transaction_id`.
  - name: Payment Link
    description: >-
      Payment link CRUD and payment-method catalog (`PaymentLinkApiController`,
      prefix `v1.0/payment-link-manage`). `account_id` is ULID;
      `payment_link_id` is numeric `payment_links.id`.
  - name: Payment Link History
    description: >-
      Payment link transaction/history listing and detail
      (`PaymentLinkApiController`, prefix `v1.0/payment-link-histories`).
      `history_id` is numeric `payment_link_histories.id`.
  - name: Virtual Account
    description: >-
      Native VA CRUD (`VirtualAccountController`, prefix
      `v1.0/virtual-accounts`). `account_id` and `virtual_account_id` are ULIDs.
  - name: VA Transaction
    description: >-
      VA money-in transaction listing and detail (`VirtualAccountController`,
      prefix `v1.0/va-transactions`).
  - name: QRIS (Money In)
    description: >-
      MPM dynamic QRIS list, show, and generate (`QrisMpmDynamicApiController`,
      prefix `v1.0/qris-dynamic`).
  - name: QRIS (Money Out)
    description: >-
      Issuer MPM decode/inquiry, payment credit (money out), and transaction
      status (`QrisIssuerMpmController`, `QrisApiV2Controller::checkStatus`,
      prefix `v2.0/qris`). Related list/detail: `GET
      /api/v2.0/qris/transaction/...`.
  - name: E-Wallet (Money In)
    description: >-
      E-Wallet Native checkout and transactions (`EwalletNativeApiController`,
      `EwalletNativeTransactionApiController`, `EwalletNativeV2ApiController`).
      Paths include `v1.0/ewallet-native`, `v1.0/ewallet-native-transactions`,
      and `v2.0/ewallet-native`.
  - name: E-Wallet (Money Out)
    description: >-
      E-wallet disbursement / top-up to beneficiary wallets
      (`EWalletTopUpController`, prefix `v2.0/ewallet`). Responses use the
      custom **`MerchantV2ApiEnvelope`** with **`MerchantV2ResponseCode`**
      (SP000–SP020).
  - name: Card (Money In)
    description: >-
      One-time card payment, cancel, and inquiry
      (`CardPaymentMerchantApiController`, prefix `v2.0/card`).
  - name: Subscription (Recurring)
    description: >-
      Credit-card recurring subscription plans (`SubscriptionPlanApiController`,
      prefix `v2.0/recurring`). Plan `{id}` is UUID (`sub_plans.id`).
  - name: Direct Debit
    description: >-
      Direct Debit — bind a customer bank account once via hosted webview, then
      charge it host-to-host (`DirectDebitMerchantController`, prefix
      `v2.0/direct-debit`). Binding `{binding_id}` and transaction
      `{transaction_id}` are UUIDs. Responses use the
      **`MerchantV2ApiEnvelope`** with both standard SP000–SP020 codes and
      Direct-Debit-specific codes (`SP_DD_*`). The `/charge` endpoint is
      additionally protected by **`X-Signature`** + **`X-Timestamp`**
      (`verify.signature-internal`); see operation parameters for the signing
      scheme.
  - name: Account Transfer
    description: >-
      Move funds between sub-accounts within the same merchant
      (`AnotherAccountApiController`, prefix `v1.0/account-transfer`). The
      transfer endpoint requires request signature headers
      (`verify.signature-internal`). Both accounts must belong to the
      authenticated merchant and be accessible to the credential.
  - name: Disbursement (Money Out)
    description: >-
      Bank disbursement (`DisbursementController` **v1.0**,
      `DisbursementV2Controller` **v2.0**). **v1.0**
      list/show/fee/beneficiary/transfer use Flugg envelopes; v1 inquiry-status
      uses the **custom v2 envelope** (`MerchantV2ApiEnvelope`, codes
      **SP000–SP020**). **v2.0** check-beneficiary, transfer, and inquiry-status
      use the same custom envelope — see component schema
      **`MerchantV2ResponseCode`** for the full response code table.
  - name: Cardless Withdrawal
    description: >-
      Cardless withdrawal API for initiating ATM cash withdrawals without a
      physical card. Supports creating withdrawals with OTP generation, listing
      transaction history, viewing transaction details, canceling pending
      withdrawals, and deleting canceled records. All endpoints use the
      `v1.0/cardless-withdrawals` route prefix and the standard success/error
      response envelope. Path parameter `{id}` refers to the `transaction_id`
      (platform-assigned business identifier).
paths:
  /api/v1.0/va-transactions/{account_id}:
    get:
      tags:
        - VA Transaction
      summary: List
      description: >-
        Retrieve a paginated list of Virtual Account money-in transactions for
        an account. Each entry represents a single payment a customer made into
        one of the account's Virtual Accounts.


        Results are restricted to transactions created within the last 12 months
        and are ordered newest-first by default. Use the query parameters below
        to paginate, sort, and filter the result set; pagination details are
        returned in the response `meta` object.


        The following optional filters are available and may be combined:
        `transaction_id` (partial match), `merchant_reff_no` (partial match),
        `va_number` (exact match), `status`, `amount`, `amount_min`,
        `amount_max`, `has_settle`, `post_timestamp_from`/`post_timestamp_to`,
        `processed_timestamp_from`/`processed_timestamp_to`, and
        `settle_at_from`/`settle_at_to`. All timestamp filters accept a Unix
        timestamp in **milliseconds** and define an inclusive range.
      operationId: vaTransactionsIndex
      parameters:
        - name: account_id
          in: path
          description: >-
            ULID of the account whose VA transactions are being listed. Must
            belong to the authenticated merchant.
          required: true
          schema:
            description: Account ULID
            type: string
            example: 01H9X8ZK3M7QF4N2VTB6RYJWPC
        - name: per_page
          in: query
          description: Number of items per page.
          required: false
          schema:
            type: integer
            default: 25
            example: 25
        - name: sort_by
          in: query
          description: >-
            Column to sort by (e.g. `id`, `created_at`, `amount`,
            `post_timestamp`).
          required: false
          schema:
            type: string
            default: id
            example: id
        - name: sort_order
          in: query
          description: Sort direction.
          required: false
          schema:
            type: string
            default: desc
            enum:
              - asc
              - desc
        - name: transaction_id
          in: query
          description: Filter by business transaction id (partial/substring match).
          required: false
          schema:
            type: string
            example: VA-20251024
        - name: merchant_reff_no
          in: query
          description: Filter by merchant reference number (partial/substring match).
          required: false
          schema:
            type: string
            example: INV-2025-001
        - name: va_number
          in: query
          description: Filter by Virtual Account number (exact match).
          required: false
          schema:
            type: string
            example: '88810012345678'
        - name: status
          in: query
          description: Filter by exact transaction status.
          required: false
          schema:
            type: string
            enum:
              - unpaid
              - paid
              - expired
              - failed
            example: paid
        - name: amount
          in: query
          description: Filter by exact transaction amount (IDR).
          required: false
          schema:
            type: number
            example: 1200000
        - name: amount_min
          in: query
          description: Filter by minimum transaction amount (IDR), inclusive.
          required: false
          schema:
            type: number
            example: 100000
        - name: amount_max
          in: query
          description: Filter by maximum transaction amount (IDR), inclusive.
          required: false
          schema:
            type: number
            example: 5000000
        - name: has_settle
          in: query
          description: >-
            Filter by settlement state. True returns only transactions already
            settled to the merchant balance.
          required: false
          schema:
            type: boolean
            example: true
        - name: post_timestamp_from
          in: query
          description: >-
            Lower bound (inclusive) on the posted time, as a Unix timestamp in
            milliseconds.
          required: false
          schema:
            type: integer
            example: 1729728000000
        - name: post_timestamp_to
          in: query
          description: >-
            Upper bound (inclusive) on the posted time, as a Unix timestamp in
            milliseconds.
          required: false
          schema:
            type: integer
            example: 1729814400000
        - name: processed_timestamp_from
          in: query
          description: >-
            Lower bound (inclusive) on the processed time, as a Unix timestamp
            in milliseconds.
          required: false
          schema:
            type: integer
            example: 1729728000000
        - name: processed_timestamp_to
          in: query
          description: >-
            Upper bound (inclusive) on the processed time, as a Unix timestamp
            in milliseconds.
          required: false
          schema:
            type: integer
            example: 1729814400000
        - name: settle_at_from
          in: query
          description: >-
            Lower bound (inclusive) on the settlement time, as a Unix timestamp
            in milliseconds.
          required: false
          schema:
            type: integer
            example: 1729728000000
        - name: settle_at_to
          in: query
          description: >-
            Upper bound (inclusive) on the settlement time, as a Unix timestamp
            in milliseconds.
          required: false
          schema:
            type: integer
            example: 1729814400000
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderSuccessVaTransactionCollection'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope401'
        '403':
          description: Access denied to this account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope403'
        '404':
          description: Account not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope404'
        '422':
          description: Missing `X-PARTNER-ID`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope422'
      security:
        - BearerAuth: []
          PartnerId: []
components:
  schemas:
    ResponderSuccessVaTransactionCollection:
      description: Standard success envelope wrapping a paginated list of VA transactions.
      required:
        - status
        - success
        - data
      properties:
        status:
          description: HTTP status code of the response.
          type: integer
          example: 200
        success:
          description: Always true for successful responses.
          type: boolean
          example: true
        data:
          description: The list of VA transactions for the current page.
          type: array
          items:
            $ref: '#/components/schemas/VaTransactionResource'
        pagination:
          description: >-
            Pagination metadata for the collection — current page, per-page
            size, total item count, and total page count (Laravel paginator
            output).
          type: object
          additionalProperties: true
      type: object
    ResponderErrorEnvelope401:
      required:
        - status
        - success
        - error
      properties:
        status:
          type: integer
          example: 401
        success:
          type: boolean
          example: false
        error:
          $ref: '#/components/schemas/ResponderErrorBody401'
      type: object
    ResponderErrorEnvelope403:
      required:
        - status
        - success
        - error
      properties:
        status:
          type: integer
          example: 403
        success:
          type: boolean
          example: false
        error:
          $ref: '#/components/schemas/ResponderErrorBody403'
      type: object
    ResponderErrorEnvelope404:
      required:
        - status
        - success
        - error
      properties:
        status:
          type: integer
          example: 404
        success:
          type: boolean
          example: false
        error:
          $ref: '#/components/schemas/ResponderErrorBody404'
      type: object
    ResponderErrorEnvelope422:
      required:
        - status
        - success
        - error
      properties:
        status:
          type: integer
          example: 422
        success:
          type: boolean
          example: false
        error:
          $ref: '#/components/schemas/ResponderErrorBody422'
        data:
          type: object
          example:
            errors:
              field:
                - error message
          additionalProperties: true
      type: object
    VaTransactionResource:
      description: >-
        A single Virtual Account money-in transaction, as produced by
        `TransactionTransformer`. Each record represents one payment made by a
        customer into one of the account's Virtual Accounts. All monetary values
        are in Indonesian Rupiah (IDR), and the `post_timestamp` /
        `processed_timestamp` / `settle_at` fields are Unix timestamps expressed
        in milliseconds.
      properties:
        transaction_id:
          description: >-
            Business identifier of the transaction. This is the value to pass as
            the `transaction_id` path parameter on the Show endpoint — not the
            numeric database primary key.
          type: string
          example: VA-20251024-0001H9X8ZK
        merchant_reff_no:
          description: >-
            Merchant-supplied reference number associated with the Virtual
            Account, echoed back for reconciliation. Null when none was
            provided.
          type:
            - string
            - 'null'
          example: INV/2025/10/0001
        va_number:
          description: The Virtual Account number the customer paid into.
          type: string
          example: '88810012345678'
        account:
          $ref: '#/components/schemas/VaTransactionAccountSnippet'
          description: Summary of the account that owns the Virtual Account.
        bank:
          $ref: '#/components/schemas/VaTransactionBankSnippet'
          description: Details of the bank channel that received the payment.
        notes:
          description: >-
            Free-text note attached to the transaction. Null when none was
            recorded.
          type:
            - string
            - 'null'
          example: 'Pembayaran order #1024'
        status:
          description: >-
            Current status of the transaction. `unpaid` — awaiting payment;
            `paid` — payment received successfully; `expired` — the Virtual
            Account expired before payment; `failed` — payment failed or was
            reversed by the bank.
          type: string
          enum:
            - unpaid
            - paid
            - expired
            - failed
          example: paid
        fees:
          $ref: '#/components/schemas/VaTransactionFeeSnippet'
          description: Processing fee charged by the payment channel for this transaction.
        amount:
          $ref: '#/components/schemas/MoneyAmount'
          description: Gross amount paid by the customer for this transaction.
        post_timestamp:
          description: >-
            Time the transaction was posted (created), as a Unix timestamp in
            milliseconds, returned as a string.
          type: string
          example: '1729748679474'
        processed_timestamp:
          description: >-
            Time the transaction was processed/confirmed by the bank, as a Unix
            timestamp in milliseconds, returned as a string.
          type: string
          example: '1729748707000'
        has_settle:
          description: >-
            True when the funds from this transaction have been settled to the
            merchant balance; false otherwise. Exposed as the `has_settle` list
            filter.
          type: boolean
          example: true
        settle_at:
          description: >-
            Time the transaction was settled to the merchant, as a Unix
            timestamp in milliseconds. Null when not yet settled.
          type:
            - integer
            - 'null'
          example: 1729753200000
      type: object
    ResponderErrorBody401:
      properties:
        code:
          type: integer
          example: 401
        message:
          type: string
          example: Unauthorized merchant, please sign in
      type: object
    ResponderErrorBody403:
      properties:
        code:
          type: integer
          example: 403
        message:
          type: string
          example: Access denied.
      type: object
    ResponderErrorBody404:
      properties:
        code:
          type: integer
          example: 404
        message:
          type: string
          example: Account not found.
      type: object
    ResponderErrorBody422:
      properties:
        code:
          type: integer
          example: 422
        message:
          type: string
          example: Validation error.
        errors:
          type: object
          example:
            field:
              - error message
      type: object
    VaTransactionAccountSnippet:
      description: >-
        Summary of the merchant account that owns the Virtual Account this
        transaction was paid into.
      properties:
        id:
          description: >-
            ULID of the account that owns the Virtual Account. Use this value as
            the `account_id` path parameter on the VA Transaction endpoints.
          type: string
          example: 01H9X8ZK3M7QF4N2VTB6RYJWPC
        name:
          description: Display name of the account as configured by the merchant.
          type: string
          example: Toko Sumber Rejeki
        email:
          description: >-
            Contact email registered on the account. Null when no email was
            configured.
          type:
            - string
            - 'null'
          example: finance@sumberrejeki.co.id
        phone:
          description: >-
            Contact phone number registered on the account, in local format.
            Null when no phone was configured.
          type:
            - string
            - 'null'
          example: '081234567890'
      type: object
    VaTransactionBankSnippet:
      description: >-
        Details of the bank channel through which this Virtual Account payment
        was received.
      properties:
        short_name:
          description: Short, human-readable name of the issuing bank.
          type: string
          example: BRI
        number:
          description: Numeric bank code (Indonesian sandi bank) of the issuing bank.
          type: string
          example: '002'
        swift_code:
          description: >-
            SWIFT/BIC code of the issuing bank, used for international
            identification.
          type: string
          example: BRINIDJA
        bank_code:
          description: >-
            Internal channel code used by Singa Payment Gateway to identify the
            bank integration.
          type: string
          example: BRI
      type: object
    VaTransactionFeeSnippet:
      description: >-
        Processing fee charged by the payment channel for this Virtual Account
        transaction.
      properties:
        name:
          description: Name of the payment vendor/channel the fee applies to.
          type: string
          example: BRI Virtual Account
        amount:
          description: >-
            Total fee amount deducted for this transaction, expressed in the
            currency below.
          type: number
          example: 4500
        currency:
          description: ISO 4217 currency code of the fee amount.
          type: string
          example: IDR
      type: object
    MoneyAmount:
      description: >-
        A monetary value paired with its currency. Used for every balance field
        returned by the balance inquiry endpoints.
      required:
        - value
        - currency
      properties:
        value:
          description: >-
            Monetary amount represented as a decimal string, with two decimal
            places to preserve cents.
          type: string
          example: '1234.56'
        currency:
          description: ISO 4217 currency code. Always `IDR`.
          type: string
          example: IDR
      type: object
  securitySchemes:
    BearerAuth:
      type: http
      description: >-
        JWT issued by `POST /api/v1.1/access-token/b2b`. Send `Authorization:
        Bearer <token>`.
      bearerFormat: JWT
      scheme: bearer
    PartnerId:
      type: apiKey
      description: Merchant API key (`Credential.api_key`). Required on every request.
      name: X-PARTNER-ID
      in: header

````