Changelog
This page records changes that affect a Partner Gateway integration. The endpoint reference remains the source for the current request and response shape.
2026-09-16 — Partner contract baseline
Section titled “2026-09-16 — Partner contract baseline”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.
DEDUCTED is the Partner Gateway default
Section titled “DEDUCTED is the Partner Gateway default”The Partner Gateway tells the pricing engine that the partner’s amount is what the payer pays. Fees come out of that amount:
| Figure | Meaning under DEDUCTED |
|---|---|
amount / gross | What the payer pays and what leaves the partner’s balance for a payout |
fee | The combined provider fee and Moria fee shown to the partner |
net_amount | What the partner receives after the fee |
For example, a collection can be represented as:
amount / gross = 11200.0000fee = 78.4000net_amount = 11121.6000DEDUCTED is a default, not a request field. A partner- or organisation-scoped pricing rule may explicitly use ON_TOP:
| Mode | Payer pays | Recipient receives |
|---|---|---|
DEDUCTED | base_amount | base_amount - provider_fee - margin |
ON_TOP | base_amount + provider_fee + margin | base_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.
Public fee and balance shapes
Section titled “Public fee and balance shapes”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.
| Surface | Previous contract | Current contract |
|---|---|---|
| Payment responses and quotes | provider_fee + margin | One combined fee |
Payout responses and payout.succeeded | amount only | amount + fee + net_amount |
GET /v1/partners/balance | withdrawable | balance + 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 gross | Result |
|---|---|
11200.0000 | Allowed; sent to the provider as 11200 |
12084.0000 | Allowed |
11200.4000 | Rejected before the provider call |
10120.3500 | Rejected before the provider call |
0.0001 | Rejected before the provider call |
0.0000 | Not 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.