> ## 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 by VA number

> Retrieve a paginated list of money-in transactions for a single Virtual Account, identified by its **VA number** rather than by transaction id. This is the convenient way to pull the full payment history of one specific Virtual Account.

Results are restricted to transactions created within the last 12 months and are ordered newest-first by default (`per_page` defaults to 50). The VA number is fixed by the path; all other filters behave exactly as on the List endpoint.

The following optional filters are available and may be combined: `transaction_id` (partial match), `merchant_reff_no` (partial 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}/detail-by-va-number/{va_number}
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}/detail-by-va-number/{va_number}:
    get:
      tags:
        - VA Transaction
      summary: List by VA number
      description: >-
        Retrieve a paginated list of money-in transactions for a single Virtual
        Account, identified by its **VA number** rather than by transaction id.
        This is the convenient way to pull the full payment history of one
        specific Virtual Account.


        Results are restricted to transactions created within the last 12 months
        and are ordered newest-first by default (`per_page` defaults to 50). The
        VA number is fixed by the path; all other filters behave exactly as on
        the List endpoint.


        The following optional filters are available and may be combined:
        `transaction_id` (partial match), `merchant_reff_no` (partial 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: vaTransactionsByVaNumber
      parameters:
        - name: account_id
          in: path
          description: >-
            ULID of the account that owns the Virtual Account. Must belong to
            the authenticated merchant.
          required: true
          schema:
            description: Account ULID
            type: string
            example: 01H9X8ZK3M7QF4N2VTB6RYJWPC
        - name: va_number
          in: path
          description: >-
            The Virtual Account number whose transactions are being listed (the
            VA number itself, not a ULID). Corresponds to the Laravel route
            segment `virtual_account_no`.
          required: true
          schema:
            description: Virtual account number
            type: string
            example: '88810012345678'
        - name: per_page
          in: query
          description: Number of items per page.
          required: false
          schema:
            type: integer
            default: 50
            example: 50
        - 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: 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

````