VRPMoney movementDemo data

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

http
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

  1. 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.

  2. 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.

  3. 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.

  4. 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