Escrow is a native Monei feature. It works for users acting directly through the Monei app, and for third-party apps via Monei Connect. This page covers the Connect side.
How it works
Escrow uses a hold model, not a transfer model. When you place a hold, the payer’s funds aren’t moved anywhere, they’re simply marked unavailable to spend. Nothing physically leaves their wallet until you release it.Hold funds
Call
escrow:create with a payer, payee, and amount. The payer’s available balance drops by that amount immediately. Their total balance doesn’t change.Payer confirms fulfilment
Your app decides when the condition is met, order delivered, service completed, milestone reached. There’s no built-in timer or webhook for this: you own that logic entirely.
Scopes
| Scope | What it allows | Sensitive |
|---|---|---|
escrow:create | Hold funds from the user’s wallet | Yes |
escrow:release | Release held funds to the payee | Yes |
escrow:refund | Return held funds to the payer | Yes |
escrow:dispute | Flag a held escrow as disputed | Yes |
escrow:read | View escrow transaction status | No |
Dispute resolution is not exposed via Connect. Once an escrow is disputed, only a Monei admin can resolve it. Your app can flag a dispute, but the outcome is decided on Monei’s side. See Disputes below.
Platform fees
If your app takes a cut on transactions it facilitates, passplatformFeeAmount when you place the hold. The fee is deducted from the payee’s payout at release time, the payer is never charged more than the amount you hold.
Your app needs a fee recipient wallet configured before you can hold funds with a nonzero
platformFeeAmount. Contact support@monei.cc to set this up, holds with an unconfigured fee recipient are rejected before any funds are touched.Endpoints
escrow:create
holdReference is your idempotency key. Retrying a hold with the same reference returns the original hold instead of creating a second one, safe to retry on timeouts or network errors.
platformFeeAmount is optional and only valid alongside a configured fee recipient. Omit it entirely if your app doesn’t take a cut.
For milestone-based payments, add depositAmount to release a portion immediately while the rest stays held:
PARTIAL rather than HELD when a deposit has already gone out.
escrow:release
escrow:refund
escrow:dispute
release and refund are both frozen, they’ll return 403 Forbidden until a Monei admin resolves the dispute.
escrow:read
mine/paying and mine/receiving list the user’s escrow history from each side. mine/pending-incoming returns a single figure, the total still held and committed to the user as a payee, useful for showing “funds on the way” before they’re spendable.
Escrow status values
| Status | Meaning |
|---|---|
HELD | Funds are held, nothing released yet |
PARTIAL | Some funds released (e.g. a milestone deposit), remainder still held |
DISPUTED | Frozen. release and refund are blocked until an admin resolves it |
RELEASED | Fully released to the payee |
REFUNDED | Fully returned to the payer |
Disputes
Dispute resolution is intentionally kept off Connect. Your app can raise a dispute withescrow:dispute, but the actual outcome, release or refund, is decided by a Monei admin, not by either party or by your app’s backend. This is by design: allowing either side (or an integrator acting on their behalf) to resolve their own dispute would defeat the point of escrow.
If your product needs its own dispute-handling workflow (e.g. a support team reviewing evidence before deciding), build that on your side and contact Monei with the outcome you’ve reached. Automated dispute resolution via Connect may be added in a future version.
Example: order flow
Scopes Reference
See how escrow scopes fit alongside the rest of Monei Connect
Errors & Rate Limits
What a blocked or unauthorized escrow call looks like

