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

# Check fee

> Calculates the transfer fee and total debit amount before you submit a disbursement. Provide the destination bank SWIFT code and the net amount the beneficiary should receive. The quote fails if the resulting gross amount would exceed the account available balance or merchant transfer limits. Recommended before transfer.



## OpenAPI

````yaml https://payment-b2b.singapay.id/api/docs/merchant-api.json post /api/v1.0/disbursement/{account_id}/check-fee
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/disbursement/{account_id}/check-fee:
    post:
      tags:
        - Disbursement (Money Out)
      summary: Check fee
      description: >-
        Calculates the transfer fee and total debit amount before you submit a
        disbursement. Provide the destination bank SWIFT code and the net amount
        the beneficiary should receive. The quote fails if the resulting gross
        amount would exceed the account available balance or merchant transfer
        limits. Recommended before transfer.
      operationId: disbursementCheckFee
      parameters:
        - name: account_id
          in: path
          required: true
          schema:
            description: >-
              Unique identifier (ULID) of the merchant account that will be
              debited. Must belong to the authenticated merchant.
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DisbursementCheckFeeRequestBody'
      responses:
        '200':
          description: >-
            Success. The `data` object contains the gross amount, transfer fee,
            net amount, and destination bank names.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckFeeResponderSuccessEnvelope'
        '403':
          description: >-
            Forbidden. The merchant lacks permission for this account, or the
            account available balance is insufficient for the quoted gross
            amount.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope403'
        '404':
          description: >-
            Not found. No account exists for the given identifier, or it does
            not belong to the authenticated merchant.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope404'
        '422':
          description: >-
            Unprocessable entity. Request validation failed (error code
            4229901). Check field formats and disbursement amount limits.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponderErrorEnvelope422'
      security:
        - BearerAuth: []
          PartnerId: []
components:
  schemas:
    DisbursementCheckFeeRequestBody:
      description: >-
        Request body for calculating transfer fee and gross debit before
        submitting a disbursement.
      required:
        - bank_swift_code
        - amount
      properties:
        bank_swift_code:
          description: >-
            SWIFT or BIC code of the destination bank. Must match a supported
            bank in the platform bank directory.
          type: string
          example: BRINIDJA
        amount:
          description: >-
            Net amount to be credited to the beneficiary, in IDR. Must be within
            merchant-specific minimum and maximum disbursement limits. The quote
            fails if the gross amount (net plus fee) would exceed the account
            available balance.
          type: number
          example: 50000
      type: object
    CheckFeeResponderSuccessEnvelope:
      description: >-
        Success response envelope for disbursement check fee endpoint. Contains
        the fee quote breakdown in `data`.
      properties:
        status:
          description: HTTP status code echoed in the response body.
          type: integer
          example: 200
        success:
          description: Indicates whether the request completed successfully.
          type: boolean
          example: true
        data:
          $ref: '#/components/schemas/DisbursementFeeQuoteResource'
          description: Response payload containing the fee quote breakdown.
      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
    DisbursementFeeQuoteResource:
      description: >-
        Fee and amount breakdown returned by the check fee endpoint before a
        transfer is submitted.
      properties:
        gross_amount:
          description: >-
            Total amount that would be debited from the merchant account (net
            amount plus transfer fee), as a decimal string.
          type: string
          example: '51000.00'
        transfer_fee:
          description: >-
            Transfer fee for the given bank and amount, as a decimal string in
            IDR.
          type: string
          example: '1000.00'
        net_amount:
          description: >-
            Amount the beneficiary would receive. Matches the net `amount` sent
            in the check fee request.
          type: string
          example: '50000.00'
        currency:
          description: ISO currency code. Always `IDR`.
          type: string
          example: IDR
        beneficiary:
          description: Display names for the destination bank used in the fee calculation.
          properties:
            full_name:
              description: Full legal or display name of the destination bank.
              type: string
              example: Bank Rakyat Indonesia
            short_name:
              description: Short bank code or abbreviation (for example `BRI`).
              type: string
              example: BRI
          type: object
      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
  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

````