Hosted checkout
Create a payment without touching card data. We host the form — your theme, four languages, light and dark, mobile first — and hand the payer back to you with a result.
In active development · payvan.net
PayVAN is a payment platform built from scratch — hosted checkout, card acquiring with 3-D Secure 2, payouts, recurring, crypto and smart routing. One signed API, one dashboard, and one very stubborn rule: we never report an outcome the bank hasn't confirmed.
The platform
No stitching together a gateway, a 3-DS vendor, a payout provider, a crypto processor and a reporting tool. PayVAN is one contour: the checkout, the processing core, the routing, the ledger and the dashboard were designed together.
Create a payment without touching card data. We host the form — your theme, four languages, light and dark, mobile first — and hand the payer back to you with a result.
The whole flow lives on our side: frictionless and challenge, every challenge screen shape, browser and merchant-initiated flows. The outcome of a challenge doesn't depend on whether the browser made it back.
Single payments, blocks and captures, partial refunds, cancellations, each payment with all its operations in one read. Every mutation is idempotent and replay-safe.
Push money out to cards against a payout balance you can read at any time. More than the balance and it is refused up front; what is accepted gets a terminal status only when the bank actually says what happened.
Scheduled charges on a saved card: pause, resume, change the amount, cancel — by subscription id, with no card involved. Terms of the offer and a cycle limit are part of the subscription, not of your cron job.
An invoice page in one request: fixed or free amount, the payer fields you need, a code you can send anywhere. Revoke it, track what it collected, reuse it.
Many acquirers behind one contract. Route by BIN, currency, country, cost or provider health, and move traffic without shipping code on your side.
Operations, balances, reports, payment links, your team and their roles. Configuration lives in one place and reaches processing over a bus, so what the dashboard shows is what the gateway actually applies.
dash.payvan.netSigned, deduplicated by id and retried twelve times with growing backoff when your endpoint is having a bad afternoon. They can land out of order, so a status call stays the tiebreaker — we say that in the docs instead of letting you find out.
Wallet tokens go to the same endpoints as a card — one extra field, no separate integration. On our checkout they appear by themselves where the payer's device supports them.
One customer record across your shops, with the verification you have already done declared to us — at payment time or later, when it finishes. Routing can use it.
Look an operation up by transaction, by your own order id, or by period. The ledger answers, not a cache — so the figure in your books and the figure in ours are the same.
Payers who hold USDT and other coins can settle with them, while you price, invoice and reconcile in fiat exactly as before. The rate is fixed before the payment starts, so the amount that reaches your balance is the amount you asked for — no wallets to run, no volatility to hedge, no second set of books.
One integration
Acquirers come and go, terms change, a provider has a bad week. That is our problem, not your release cycle. You keep talking to one API contract while traffic moves underneath it.
For developers
REST over JSON, one signature scheme, a request id that makes retries safe, and a sandbox talking to an emulated bank — including a full 3-D Secure 2 flow you can drive from tests. The whole contract is public, with an OpenAPI file you can generate a client from.
// Create a payment session — no card data ever reaches you.
POST https://pay.payvan.net/v1/checkout/sessions
X-SHOP-ID: 1042
X-REQUEST-ID: 6f1c2a48-4f6e-4a1e-9a2c-1c8c9a2f9e01
X-REQUEST-TIMESTAMP: 1791181232
X-REQUEST-SIGNATURE: v1=<hex HMAC-SHA256 of the canonical string>
{
"PaymentType": "Pay",
"Amount": "49.00",
"Currency": "USD",
"OrderId": "order-1043",
"Description": "Pro plan, November",
"ExtraData": {
"SuccessUrl": "https://shop.example/paid",
"DeclineUrl": "https://shop.example/failed",
"CancelUrl": "https://shop.example/cart"
},
"CustomerInfo": { "Language": "en", "Email": "[email protected]" }
}
// 201 Created — send the payer to CheckoutUrl, we take it from there.
{
"SessionId": "6d0f3c1e-2a4b-4c1d-9e5f-0a7b8c9d0e1f",
"CheckoutUrl": "https://pay.payvan.net/pay/6d0f3c1e-2a4b-4c1d-9e5f-0a7b8c9d0e1f",
"ExpiresAt": "2026-10-12T12:40:00Z"
}
// Already PCI-certified? Post the card yourself. Same four headers.
POST https://api.payvan.net/v1/payments
{
"Amount": "49.00",
"Currency": "USD",
"OrderId": "order-1043",
"Description": "Pro plan, November",
"PaymentMethod": "Card",
"CustomerInfo": {
"Email": "[email protected]",
"IP": "203.0.113.10",
"Country": "US",
"Language": "en"
},
"PaymentDetails": {
"CardholderName": "JANE DOE",
"CardNumber": "4111111111111111",
"ExpMonth": "12",
"ExpYear": "2030",
"CVC": "123"
},
"ExtraData": { "WebhookUrl": "https://shop.example/hooks/payments" }
}
// 201 means accepted, not paid: the outcome comes by webhook or status check.
{ "TransactionId": "3554", "OrderId": "order-1043", "Amount": "49.00", "Currency": "USD" }
// PaymentMethod ApplePay or GooglePay takes a wallet token in PaymentDetails.Token.
// A subscription starts with its first payment — on the checkout or direct.
POST https://pay.payvan.net/v1/checkout/sessions
{
"Amount": "9.99",
"Currency": "USD",
"OrderId": "order-2001",
"Description": "Basic plan",
"RebillFlag": true,
"Subscription": {
"Description": "Basic plan",
"Interval": { "Unit": "month", "Count": 1 },
"MaxCycles": 12,
"OfferUrl": "https://shop.example/terms"
},
"ExtraData": { "ReturnUrl": "https://shop.example/return" }
}
// Afterwards it is yours to steer, by subscription id — no card involved.
POST https://api.payvan.net/v1/subscriptions/8812/pause
POST https://api.payvan.net/v1/subscriptions/8812/resume
PATCH https://api.payvan.net/v1/subscriptions/8812 { "Amount": "14.99" }
POST https://api.payvan.net/v1/subscriptions/8812/cancel
// Signed, deduplicated by X-WEBHOOK-ID, retried 12 times: 30 s, doubling to 6 h.
POST https://shop.example/hooks/payments
X-SHOP-ID: 1042
X-WEBHOOK-ID: 9a3c1f70-5c21-4a8e-9f0b-7c2d1e4a6b88
X-WEBHOOK-TIMESTAMP: 1791181232
X-WEBHOOK-SIGNATURE: v1-webhook=<hex HMAC-SHA256 of the canonical string>
{
"Event": "Payment",
"TransactionId": "3554",
"OrderId": "order-1043",
"ShopId": "1042",
"Amount": "49.00",
"Currency": "USD",
"DateTime": "2026-10-12T11:22:05Z",
"CardMasked": "411111******1111",
"RRN": "123456789012",
"Email": "[email protected]",
"ExtraData": { "plan": "pro" },
"IsTest": false
}
// The string you sign, and the one you verify, are built the same way:
v1-webhook\nPOST\n{FULL_URL}\n{SHOP_ID}\n{WEBHOOK_ID}\n{TIMESTAMP}\n{hex(SHA-256(BODY))}
Retry with the same X-REQUEST-ID and you get the first answer back, for 24 hours — never a second charge. Reuse it for a different request and we say so, loudly.
Every request carries an HMAC over method, path, shop, request id, timestamp and a hash of the body, valid ±5 minutes. Rotating the secret keeps both keys alive, so nothing breaks mid-rotation.
A bank emulator on separate hosts and keys. You pick the scenario with the test card's CVC and expiry month: declines, timeouts, every 3-D Secure 2 path — so your error branches get tested too.
docs.payvan.net is a written guide plus an OpenAPI 3.1 reference; openapi.yaml generates your client, and signing examples in Python and Node are there to paste.
Security
Our checkout captures the card in isolated fields served from our own card domain. Six inputs are inside the card perimeter — not your page, not your servers, not your logs.
If the bank hasn't told us what happened, the operation stays RESULT_UNKNOWN until it does. We would rather show you an unfinished payment than a wrong one.
Every operation is a workflow that survives restarts and retries only what is safe to retry. Deploys don't lose payments.
Each state transition is recorded with who, when and why. Support answers questions from the record, not from a guess.
Where we are
PayVAN isn't live yet — and we would rather say so than dress a prototype up as a bank. Here is exactly what stands today.
Gateway, transaction core, hosted checkout, webhooks and an emulated bank with a complete 3-D Secure 2 flow, working end to end in our test environment — and the whole merchant API written up at docs.payvan.net.
Merchant cabinet with roles and reports, payment links, payout balance and top-ups, routing configuration delivered to processing over the bus. The sandbox hosts are being stood up next, so integration can start before the first acquirer signs. The first crypto rail is written and tested, and waits on a merchant account before it carries live traffic.
PCI DSS assessment of the card perimeter, first acquiring contracts, and production traffic on payvan.net.
We are looking for a small number of launch partners — teams who want to shape the API before it sets. Tell us what you are building and how you would want to charge for it.