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/balanceResponse 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
frozenand never appear inpending_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:
- PayIn credits. Every successful incoming payment (minus the platform fee) is credited to the USDT wallet of the merchant's operating balance.
- Payouts (PayOut). Creating a payout places a hold on the USDT wallet
(at the SELL rate at creation time): the amount stays reserved in
frozenuntil the final outcome — a debit (COMPLETED) or a release (FAILED/EXPIRED). - 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 code | Currency name | Minor unit |
|---|---|---|
| RUB | Russian ruble | Kopeck (0.01 RUB) |
| USDT | Tether (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 intofrozenuntil 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
frozenreflects 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).