Skip to content

Fees

How each payment's fee is computed, when it is fixed, whether a refund gives it back, and where to see your app's rule. About 5 minutes to read. A fee is taken only from an app with settlements on (Settlements) — today every capture is fee-free.

There is no public price list: the operator sets the fee per app, by contract.

The payment rule

The operator writes a payment rule for each app. Rules are versioned: a rule applies from its effective_from until a new version with a later effective_from takes over. A rule in effect is history — never edited, never deleted (a change is a new version). A rule that has not started yet may still be edited by the operator.

Field Rule Meaning
fee_bps 0 – 5000 percentage in basis points (100 = 1 %, 5000 = 50 %)
fee_fixed 0 – 1 000 000 ₮ a fixed amount added to each payment
fee_min · fee_max 0 – 50 000 000 ₮ or null, min ≤ max floor · ceiling
refund_fee boolean, default false whether refunds give the fee back in proportion
schedule · settle_time · delay_days Settlements the settlement schedule (Ulaanbaatar time, T+0 – T+14)

With no rule, the default: no fee, weekdays at 10:00, T+1.

Formula

fee = round_half_up(amount × fee_bps / 10000) + fee_fixed
      → at least fee_min → at most fee_max → at most amount

round_half_up — the nearest integer, exact halves up; on the percentage alone, once per payment
fee_bps amount Computation fee
150 (1.5 %) 10 033 150.495 → 150 150
150 (1.5 %) 10 034 150.51 → 151 151
150 (1.5 %) 100 1.5 → 2 2
200 (2 %) + fee_fixed 50 25 000 500 + 50 550

An intent's fee and net (amount − fee) are set only for a payment captured while the app's settlements are on; null otherwise, in test and before capture (Payment intent).

When the fee is fixed

The fee is computed under the rule in force at the moment the capture becomes owed (automatic: the person confirmed and the hold was placed; manual: your capture call) and written on the intent — never recomputed. A later change of the rule, or a retried capture, leaves the fee as it was fixed.

The fee is not taken out at capture: the capture moves the full amount to clearing, and the settlement takes the fee (the Settlement's fee).

Fees and refunds

  • refund_fee: false (default): a refund keeps the fee — the payment happened. If after a full refund there is no money to take the fee from, it moves to the next settlement (fee_carried_*).
  • refund_fee: true: each refund gives back its share of the fee:

share(R) = round_half_up(fee × R / amount), a refund's share = share(earlier refunds + this one) − share(earlier refunds).

The shares of partial refunds add up exactly to the whole fee once everything is refunded. Example: a payment with a 100₮ fee refunded in three equal parts gives back 33 + 34 + 33 = 100.

The fee given back shows as fee_returned on the settlement and on the refund's line.

Where to see it

The developer console's API — GET /api/v1/miniapp/dev/apps/{id}/payment-rule (an organisation session, miniapp.read). The operator's notes and who wrote the rule are not shown:

{
  "current": {
    "id": "8f2c…", "version": 2, "effective_from": "2026-11-01T00:00:00Z", "in_effect": true, "current": true,
    "fee_bps": 150, "fee_fixed": 0, "fee_min": null, "fee_max": 5000, "refund_fee": false,
    "schedule": "weekdays", "settle_time": "10:00", "timezone": "Asia/Ulaanbaatar", "delay_days": 1,
    "created_at": "…", "updated_at": "…"
  },
  "upcoming": [],
  "default": { "fee_bps": 0, "fee_fixed": 0, "schedule": "weekdays", "settle_time": "10:00", "delay_days": 1, "…": "…" },
  "settlements_enabled": true,
  "settlement_since": "2026-11-01T00:00:00Z"
}

current — the rule in force now (null: the default applies); upcoming — versions not started yet (soonest first); settlements_enabled — whether the app has settlements on. Reading the rule through the server API (an API key) is coming soon; for now, the console.

Test mode

Test payments carry no fee (fee = null, never settled) — the rule's effect cannot be seen in test mode; compute it with the formula above.