S
docs.syncra.money
Finance

Merchant balances

Managing merchant financial balances, balance types, and the supported fiat currencies and crypto in Syncra V2

Managing merchant balances

The Syncra V2 platform provides a multi-currency financial gateway that lets merchants accept and pay out funds in multiple CIS and Asian fiat currencies, and accumulate and withdraw funds in crypto (USDT).

For every merchant, the system tracks balances per wallet type and currency.


Get merchant balances

To request the current financial state of your balances, send the following GET request:

GET /api/v1/p2p/merchant/balance

Response format (200 OK)

The response contains an object with a top-level wallets array (no data wrapper), where each entry holds the wallet ID, currency, available, frozen, total, and in-transit (pending_credits) balances. All amounts are int64 in minor units and are passed in JSON as strings (the proto3 JSON format). A live staging response:

{
  "wallets": [
    {
      "wallet_id": "1af2d1ee-7fc3-4796-9dda-10d97af62094",
      "currency": "USDT",
      "available": "95982",
      "frozen": "4018",
      "total": "100000",
      "pending_credits": "0"
    },
    {
      "wallet_id": "9b2fcbd6-b6f4-4f17-a94d-b7309f84bde5",
      "currency": "USDT",
      "available": "0",
      "frozen": "0",
      "total": "0",
      "pending_credits": "0"
    }
  ]
}

wallets are the merchant's real wallets from the money service: each entry corresponds to an actual wallet with its own currency and its own wallet_id (a wallet UUID; the TRC-20 deposit address is a separate entity, see Wallet → Deposit Address). There are no synthetic or aggregated entries in the response — the array reflects the wallets that are actually provisioned. frozen reflects active holds (see Frozen funds).

All amounts in responses are passed in the minor units of the corresponding currency (kopecks for RUB, cents for USDT) as 64-bit integers (int64). In JSON, int64 values are serialized as strings ("available": "95982") — the proto3 JSON format, which prevents precision loss in JS clients.


Pending credits (pending_credits)

The pending_credits field of each wallet is the amount that has already been earned by completed deals but has not reached available yet: after a deal reaches COMPLETED, its net credit goes through the internal fee-distribution queue, and until that settles, the money shows as in transit.

  • Always returned, including 0 — both figures, available and pending, are visible at all times.
  • The same minor unit as the other wallet fields (cents for USDT), serialized as a string.
  • The zero-escrow invariant: holds live in frozen and never appear in pending_credits — the in-transit amount is at most the net credits of completed deals awaiting distribution.
  • The cabinet displays it as "In transit" so it is clear why the net of a completed deal is not yet in the available balance.

The typical life cycle: a deal reaches COMPLETED → the net appears in pending_credits → the background fee distribution settles the credit → the amount moves to available, and pending_credits decreases by the same amount.


How the merchant balance works

The merchant balance is a set of multi-currency wallets in the money service, listed by GET /balance. Each wallet holds one currency; operations move a specific wallet:

  1. PayIn credits. Every successful incoming payment (minus the platform fee) is credited to the USDT wallet of the merchant's operating balance.
  2. Payouts (PayOut). Creating a payout places a hold on the USDT wallet (at the SELL rate at creation time): the amount stays reserved in frozen until the final outcome — a debit (COMPLETED) or a release (FAILED/ EXPIRED).
  3. Deposits. The operating balance is topped up with USDT deposits to the merchant's TRC-20 address (Wallet → Deposit Address).

Balance "types" such as MAIN/INSURANCE/DEPOSIT are not modeled in API V2: GET /balance returns only the actual wallets, without classification. Collateral (insurance) accounts exist in the trader-team domain and are not visible in the merchant API.


Supported currencies

Syncra V2 is a multi-currency platform. The list of supported currencies is defined by the tenant configuration (the p2p_currencies table) and an administrator can extend it in real time without restarting services.

Example currencies:

ISO codeCurrency nameMinor unit
RUBRussian rubleKopeck (0.01 RUB)
USDTTether (USDT)Cent (0.01 USDT)

The GET /api/v1/p2p/merchant/currencies endpoint returns the current list of currencies for your tenant; for payment methods, use GET /payment-methods. The exact set depends on your tenant and region.


Frozen funds

The frozen value in the API response is the amount temporarily locked on the wallet:

  • Payout hold: When you create a payout request (POST /deals/payout), the transaction amount plus the estimated fee moves into frozen until the trader or the bank confirms the payout. On success, the funds are debited for good; on failure, they return to the available balance (available).
  • Dispute holds — REMOVED 2026-09-28: the card dispute flow (chargeback/RDR) has been removed from the platform — no new freezes of this type occur, and frozen reflects payout holds only. Disputed deals are handled by the appeal process, which does not freeze the merchant balance (an arbitration decision changes the deal status, not wallet holds).

On this page