Skip to content

Changelog

This page records changes that affect a Partner Gateway integration. The endpoint reference remains the source for the current request and response shape.

The 2026-09-16 Partner Gateway contract baseline established the contract before the first partner integration. Treat clients built against the previous contract as requiring migration.

The Partner Gateway tells the pricing engine that the partner’s amount is what the payer pays. Fees come out of that amount:

FigureMeaning under DEDUCTED
amount / grossWhat the payer pays and what leaves the partner’s balance for a payout
feeThe combined provider fee and Moria fee shown to the partner
net_amountWhat the partner receives after the fee

For example, a collection can be represented as:

amount / gross = 11200.0000
fee = 78.4000
net_amount = 11121.6000

DEDUCTED is a default, not a request field. A partner- or organisation-scoped pricing rule may explicitly use ON_TOP:

ModePayer paysRecipient receives
DEDUCTEDbase_amountbase_amount - provider_fee - margin
ON_TOPbase_amount + provider_fee + marginbase_amount

ON_TOP remains the meaning used by Moria’s own member/product paths: the member states what should land, and the fees are added above it. A negotiated Partner Gateway rule can use the same mode without changing the API code.

Partner-facing surfaces expose one fee figure. The provider/margin split remains internal for accounting and reconciliation, but it is not part of the Partner Gateway contract.

SurfacePrevious contractCurrent contract
Payment responses and quotesprovider_fee + marginOne combined fee
Payout responses and payout.succeededamount onlyamount + fee + net_amount
GET /v1/partners/balancewithdrawablebalance + available + pending

Under the default DEDUCTED payout mode, amount is reserved and leaves the partner balance; fee is deducted from it; net_amount is what reaches the bank. The three balance figures answer different questions: total partner liability, currently withdrawable funds, and funds still pending settlement.

See Create a payment, Request a payout, and Check your balance for the current examples.

2026-09-16 — Whole-IDR provider validation

Section titled “2026-09-16 — Whole-IDR provider validation”

The provider boundary for money-in instruments requires gross to represent a whole IDR amount. Moria checks the canonical DECIMAL(20,4) value exactly in integer units; it does not use floating-point arithmetic and it does not round.

Under the default DEDUCTED mode, this means the payer’s requested amount must be whole IDR. Under ON_TOP, the resulting provider gross—including fees—must be whole IDR.

Input grossResult
11200.0000Allowed; sent to the provider as 11200
12084.0000Allowed
11200.4000Rejected before the provider call
10120.3500Rejected before the provider call
0.0001Rejected before the provider call
0.0000Not rejected by this whole-IDR check; existing amount/domain validation still applies

Fractional provider amounts return the existing invalid-payload contract:

{
"error": {
"code": "REQUEST_INVALID_PAYLOAD",
"message": "Payment amount must be a whole IDR amount for this payment method."
},
"request_id": "req_…"
}

This validation does not change DEDUCTED or ON_TOP pricing, internal gross_amount, net_amount, provider fees, margins, database columns, or accounting records. In particular, fractional internal fees and net amounts remain valid when the provider-facing gross is whole. No amount is rounded up or down.

For the complete failure taxonomy, see Errors.