Consent once. Pay variable amounts within the limits.
A mandate lets a payee pull changing amounts — utility bills, subscriptions, top-ups — straight from the user’s bank account, but only within the limits the user approved. Anything above a limit is rejected, and the user can pause or revoke at any moment.
Sandbox only: mock banks and synthetic data. No real money moves.
Charge a utility bill under a mandate
POST /v1/vrp/mandate/create
{ "access_token": "access-sandbox-…", "account_id": "acc_…",
"payee": { "name": "Shahar Kommunal",
"account_number": "20208000900765432109" },
"limits": { "max_per_payment": 500000,
"period": "month", "period_limit": 1000000 },
"expires_at": "2027-10-01T00:00:00Z" }
→ { "mandate": { "mandate_id": "mandate_01J…",
"status": "awaiting_authorization" } }
POST /v1/vrp/payment/create
{ "mandate_id": "mandate_01J…", "amount": 312400,
"idempotency_key": "bill-2026-10-gas" }
→ { "charge": { "status": "executing" },
"remaining_in_period": 687600 }How it works
- 01
Request a mandate
Your server calls /vrp/mandate/create with the payee, a per-payment cap, a period limit (day / week / month / year) and an expiry.
- 02
The user approves once
In your consent centre or with one tap in Telegram (sandbox SCA: OTP 123456). Until then every charge is refused.
- 03
Charge variable amounts
Call /vrp/payment/create whenever a bill is due. Each charge is checked against the limits under a row lock, then paid as an A2A transfer.
- 04
The user stays in control
Every charge is logged and notified with Pause / Revoke buttons. Revocation applies to the very next charge.
What you get
✓Per-payment, period and count limits
Limit windows follow the Tashkent calendar. Exactly hitting a limit is allowed; one tiyin over is rejected with a clear rejection_code.
✓A full charge log
Every attempt — accepted, settled or rejected — is recorded and visible to you and to the user.
✓Safe under concurrency
Parallel charges serialise on the mandate, so the period limit holds under any load (tested with 10 simultaneous charges).
✓Idempotent
A retry with the same idempotency_key returns the original charge — nobody is charged twice.
✓Webhooks
VRP_MANDATE_STATUS_UPDATED and VRP_PAYMENT_STATUS_UPDATED keep your systems in sync.
✓Telegram notifications
Users get every charge in Telegram with one-tap Pause / Revoke — in Uzbek, Russian or English.
🛡 Consent & security
- ●Explicit consent before the first charge; strong customer authentication in production.
- ●Payee account numbers are encrypted at rest (AES-256-GCM); only the last four digits are ever returned.
- ●Instant pause and revocation by the user — from the consent centre, the Mini App or the bot.
- ●Every state change lands in an append-only audit log.
More products
🪪
Credit Passport
Consented cash-flow data with explained factors that licensed lenders may use. The borrower sees every access and can revoke it.
⚖️
Auto-Balancing
Rules that top up an account before a payment fails — suggest-and-confirm or fully automatic, with caps and a donor floor.
🏦
Treasury & Split Payments
One view of all company balances across banks, and a single payment split over several accounts — with reserves, roles and safe partial-failure handling.
🎨
White-label & platform
Your brand on the consent flow, plus API keys with per-key rate limits, usage analytics and signed webhooks — open banking as a service for banks, MFIs and fintechs.