Sell VPN access under your own brand. Your backend creates subscribers through our API, or you add them by hand in the partner dashboard with no code, and each one gets a single subscription URL with VLESS Reality, Hysteria2 and XHTTP lines that Happ reads. For days when a network lets only whitelisted services through there is olcRTC: it carries traffic inside a video call, in apps that run it, where that video service gets through. Subscribers' traffic is charged per GB to a balance you prepay in TON, and we can start you on a free trial.
VPN partner APIVPN reseller APIwhite-label VPNwholesale VPNVPN API for Telegram bots
A REST API with JSON answers for your backend, one subscription URL for each of your users, and a dashboard for the money, the settings and, if you have no backend, the subscribers themselves. The full reference is in the Partner API documentation.
SUBSCRIPTION · HAPP
One URL per subscriber
Every exit your account can use, direct and through an entry node in Russia, or only the exits, routes and transports you choose, with VLESS Reality, Hysteria2 and XHTTP lines in the base64 list Happ reads. v2rayNG and Hiddify read it too; XHTTP lines need an Xray-core app such as Happ or v2rayNG.
BRANDING
Your name, your domain
Your title, support link and web page link on the subscription, and your prefix on every line's name, set by you in the dashboard. Point a subdomain of yours at us, or serve the URL through your own server, and the URL your users add is yours.
OLCRTC · OPTIONAL
A transport shaped like a video call
Once we switch olcRTC on for you, the subscription's other formats add olcRTC lines, for networks that let little else through. They need a client that runs olcRTC.
PRICING
Per GB, prepaid in TON
Each GB costs the node's price plus a 20% network fee, charged to a balance you top up in TON; olcRTC has a price of its own from 20 November 2026 (see 04). There is no monthly fee: you pay for the traffic your subscribers move.
FREE TRIAL
Test before you pay
We can start a free trial on your account: 7 days, 10 subscribers and 50 GB by default. Past any limit, the balance pays from then on and nothing restarts.
DASHBOARD
Subscribers, money and keys in one place
Behind your proofkit.org sign-in with two-factor: subscribers added by hand with an end date, a traffic quota and a link or a QR code to hand over; trial usage, balance, charges per day, wallet top-up and withdrawal; API key rotation with a 24-hour overlap; the subscription's branding and route filters.
Also in the API: the node catalogue with each node's price for you and the total with the fee, connecting a subscriber to one country or node, their live sessions and configs, usage and cost per subscriber over any window, and disabling or resetting a subscriber.
// how it works
From a key to a working subscription
Two calls from your backend. The quick start walks through every step, and the API explorer runs the calls with your key. No backend? The dashboard does both by hand: Without code.
01
Get a key
Open a ticket: we set up your partner account, start a free trial if we agree one, and issue your API key, shown once.
02
Create a subscriber
One call with your own ID for the person. The same ID returns the same subscriber, so a retry is safe, and nothing is charged until their traffic moves.
03
Hand out one URL
Serve the subscription from your own domain through your server, or hand out its hosted URL on proofkit.org. The app refreshes it every hour by default.
~/your-backend
# PK=https://proofkit.org/api/v1/partner KEY=pk_…$ curl -s -X POST $PK/subscribers \
-H "X-Partner-Key: $KEY" -H "Content-Type: application/json" \
-d '{"external_id": "tg_123456789"}'
{"external_id": "tg_123456789", "sub_token": "…", "created": true, …}$ curl -s -H "X-Partner-Key: $KEY" \
"$PK/subscribers/tg_123456789/subscription?format=happ"
# the base64 list: a VLESS Reality line for every route,# Hysteria2 and XHTTP lines where the route carries them
// ways to work with us
Four ways in, by who pays
Resell with your own billing, from a backend or by hand with no code, let the users of your Telegram Mini App bring their own balance, or simply send people over.
SERVER-TO-SERVER · YOU PAY
Provision subscribers from your backend
Your server holds an API key, creates subscribers under your own IDs and hands each one a subscription URL. They never sign up with us, and their traffic is charged to your prepaid balance.
No backend and no key. In the partner dashboard you type an order or booking number, choose how long the access lasts and how much traffic it carries, and hand over a link or a QR code. Opened in a browser, the link is a setup page with your title. Their traffic is charged to your prepaid balance.
Your Mini App sends Telegram's initData and we check Telegram's signature for your bot. Each user gets their own ProofKit account, tops up in TON and pays for their own traffic.
A ProofKit account comes with an invite link under Dashboard → Invite Friends. A fifth of what ProofKit keeps from each charge of the people you invite, 4% of the charge, is credited to your ProofKit balance.
Each subscriber gets one subscription that lists every exit your account can use, each one direct and, where it is linked, through an entry node in Russia. On 2026-09-26 that is 16 exit countries, 8 of them in Europe (DE, ES, FR, GB, IT, NL, PL and SE), and the marketplace lists the current exits. You can narrow the list for all your subscribers in the partner dashboard: only the exit countries you name, for example the European ones, only direct routes or only routes through the entry in Russia, and the transports each route carries; a route you leave out is never opened. Every route has a VLESS Reality line, plus Hysteria2 and XHTTP lines where the route carries them. The default format is the base64 list that Happ, v2rayNG and Hiddify read; XHTTP lines need an Xray-core app such as Happ or v2rayNG. A JSON format gives the same lines as data, with each line's exit and entry country, if you would rather build a different list for each subscriber. When olcRTC is on for you, the JSON format also carries olcRTC lines and takes an olcRTC place for the subscriber (see 02); the Happ format never does, so fetch it for users whose app cannot run olcRTC.
The first fetch opens the subscriber's routes and can take a few seconds. A route that cannot be opened right now is left out and tried again on the next fetch: on a full or offline node, with no balance left, past the limit of 50 sessions per subscriber, or not opened within the fetch's five seconds, so a first fetch during a bulk import can come back partial. Later fetches return the same lines while nothing changes. A Reality, Hysteria2 or XHTTP line's credentials change only when its session ends, and the app picks up the new line on its next refresh, hourly by default.
02 /olcRTC, for apps that run it
olcRTC carries traffic inside a video call, for networks that let little else through. Happ cannot run it, so its lines never come in the Happ list: they come in the subscription's Ghostlane format, named after the open-source client that also runs olcRTC, and in the JSON format. olcRTC lines appear only once we switch olcRTC on for you. Each node's olcRTC room carries only a few people at once and is shared with everyone on the network, so each partner has a share of the places, by default a fifth of the network's, and a subscriber's olcRTC lines are on one exit node, one of the exits you sell. The API's per-session olcRTC calls hold your subscribers to the same switch, share and single exit. When your share is in use or no node has a place, the olcRTC lines are left out and the rest of the subscription comes back. An olcRTC line changes when its room is replaced, and a subscriber who moves no traffic through that exit for half an hour can lose the place to someone else until one frees up; the app picks up the change on its next refresh. It is the slowest transport, meant for the days when nothing else gets through.
From 20 November 2026 olcRTC traffic is charged at one network-wide price per GB, read at every charge and never locked into a session; until then it costs the route's price. The price steps are in 04.
03 /Your brand and your domain
The subscription carries your title (any script, emoji included), a support link and a web page link, as the subscription headers that apps such as Happ display, along with how often the app refreshes it and this month's traffic. Every line's name starts with your prefix, like "MyVPN DE Direct" or "MyVPN DE via RU · Hysteria2". You set these yourself in the partner dashboard, or we set them for you: a title of up to 64 characters, a prefix of up to 32 without #, ?, & or $, https links, and a refresh interval from 1 to 168 hours. To give your users a URL on your own domain there are two ways. A managed domain: add one DNS record, sub.yourdomain.com CNAME subs.proofkit.org (DNS only, not proxied), request the name in the dashboard's Subscription tab, and once we approve it every subscriber's hosted URL answers on it, with a certificate we issue; it is for partners out of the free trial, up to three names. Or your own server: it answers its own URL, fetches the subscriber's subscription from our API with your key and passes the body and headers on. With neither, each subscriber has a hosted URL on proofkit.org with the same branded content. Opened in a browser, a hosted URL is a setup page with your title and support link that tells the person which app to install; an app that fetches the same URL gets the list, and you can switch the page off in the Subscription tab.
04 /What a GB costs
Each GB costs the node's price per GB plus a 20% network fee; through an entry node, both nodes' prices plus the fee. The price is locked when a route's session starts: a later rise does not reach it, a drop does (an agreed price stays as agreed). A GB is 1,073,741,824 bytes, upload and download together, charged as the nodes report traffic, about once a minute. There is no monthly fee: you pay only for the traffic your subscribers move.
Route, at prices on 2026-09-26
Node prices per GB
You pay per GB
Direct, the DE exit
0.001 TON
0.0012 TON
Direct, any other exit
0.01 TON
0.012 TON
DE via the entry in Russia
0.001 + 0.01 TON
0.0132 TON
Any other exit via the entry in Russia
0.01 + 0.01 TON
0.024 TON
A line through the entry in Russia costs the entry's price on top of the exit's, and your users pick lines themselves. Prices are set in TON and do not follow any fiat currency; operators can change them, and the marketplace shows each exit's current public price with the fee included. The partner catalogue lists every public node and any node granted to your account, with its price for you before the fee (price_per_gb_nano) and the total with the fee (total_price_per_gb_nano). We can agree a per-node price for your account, never below the node's own price, and grant you nodes that are not listed publicly.
olcRTC has a price of its own from 20 November 2026. It is one price per GB for the whole network, whatever the exit or the route, with the 20% network fee included; until then olcRTC costs the route's price. The price is read at every charge and never locked into a session. A route through the entry in Russia adds nothing to it, because olcRTC never passes the entry. A rise is announced at least 30 days before it starts, a cut may start at once, and the free trial covers olcRTC traffic. Partners and people who use ProofKit directly pay the same.
olcRTC traffic, from (00:00 UTC)
You pay per GB
Until 20 November 2026
The route's own price, as in the rows above
20 November 2026
0.0208 TON (about $0.03)
8 December 2026
0.0347 TON (about $0.05)
22 December 2026
0.0556 TON (about $0.08)
The olcRTC steps are set in TON too; the dollar figures are approximate, at 1 TON = $1.44. If the TON rate moves by more than 10 %, we may adjust the TON amounts; a rise is announced 30 days ahead, like any rise. Reality, Hysteria2 and XHTTP keep the prices above. The price in force and the steps to come are in olcrtc_pricing on GET /api/v1/partner/account; your partner dashboard shows what your subscribers' olcRTC traffic of the last 30 days costs at the last step.
05 /Prepaid in TON
Your subscribers' traffic is paid from a balance you top up in TON; there is no credit and no other payment method, and only Toncoin counts. In the partner dashboard you first link your partner wallet with a TonConnect proof, then deposit from it into the ProofKit escrow contract, which holds the deposit under that wallet's address. Your balance is credited only for the dashboard's deposit, or a transfer from the linked wallet with the comment deposit. A transfer with no comment stays in the contract credited to no one and can only be put right by hand: open a ticket under Support with the transaction. One with any other comment is rejected by the contract. One from any other wallet, a withdrawal from an exchange included, is that wallet's deposit, not added to your balance, so move the TON to the linked wallet first. Link before you deposit: a deposit sent before the link is picked up only while it is still among the escrow's 50 latest transactions. The contract accepts 0.05 TON or more per deposit, and the dashboard asks for at least 0.1 TON. A deposit reaches the balance once the escrow confirms it, usually within a minute.
At a zero balance, outside a free trial, new sessions are refused, the session whose traffic took the balance to zero is disconnected at once, and the other running ones end within about 15 seconds. The last traffic report on each can take the balance slightly below zero, which the next deposit covers first. After a top-up nothing restarts by itself: a subscription starts its routes again, with new credentials, on the app's next refresh, and sessions you started with connect need connecting again. Operators' claims for your subscribers' traffic are paid from your escrow deposit, and what the balance does not owe can be withdrawn to the partner wallet: ProofKit co-signs the withdrawal and your wallet sends it.
06 /Free trial
Before you pay, we can start a free trial on your account. Its traffic costs nothing while all of its limits hold: by default 7 days, 10 subscribers and 50 GB, set per partner. Every subscriber you create counts, disabled ones included, and while the trial runs, creating one more than it allows is refused with TRIAL_LIMIT. To add more during the trial, top up and ask us to end it, or ask us to raise its limits: up to 90 days at a time (a start or an extension), 100,000 subscribers and 100,000 GB. Once any limit is passed, the traffic is charged to your balance from the next report on, with nothing restarted, so top up before the trial ends or your subscribers' sessions end at zero. The dashboard and the API show the trial's end date and the subscribers and GB it has used.
07 /The partner dashboard
Your partner is run from a Partner section on proofkit.org. We attach it to an account you name: one that signs in with an email address, not a Telegram-only account, and runs no other partner. Once it runs your partner, that account can no longer sign in through any partner's Mini App. You sign in as usual and turn on two-factor sign-in, with an authenticator app or codes from Telegram, because the section moves money and keys. It shows your plan (free trial or prepaid) with the trial's usage, the balance with a warning under 1 TON, the charges per day over the last 30 days with a line under them for your subscribers' olcRTC traffic and its cost at the olcRTC price, the number of subscribers, your subscribers' olcRTC keys in use against your share once we switch olcRTC on for you, and your deposits and withdrawals. From it you link the partner wallet, top up, withdraw, set the subscription's branding and route filters with a preview of the lines, and rotate the API key: the new key is shown once and the old one keeps working for 24 hours, so your backend can switch without downtime. Subscribers are managed there too, with no code: add one by hand under an order or booking number, give it an end date, a traffic quota and its own exit countries, hand over its link as a QR code to scan, share or print, and reset or disable it later. A backend does the same through the API; see Without code: the dashboard.
08 /Russian networks
What gets through differs from one Russian network to another and changes over time, so the subscription gives your users more than one way in. Every exit comes direct and, where it is linked, through an entry node in Russia; the entry node only relays the encrypted connection, which ends at the exit node. Each route carries VLESS Reality, and Hysteria2 and XHTTP where it can. Hysteria2 runs over UDP, Reality and XHTTP over TCP, so when one line is blocked another may still work. The order we suggest: direct Reality first; if an exit's direct lines fail or crawl, the same exit via RU, which adds the entry's price (see 04); if Reality stalls or drops, Hysteria2 where UDP passes and XHTTP where it does not; on days when a network lets through only an approved list of services, olcRTC, in an app that runs it, carries traffic inside a video call. Reality stays on TCP 443 and direct Hysteria2 on UDP 443, while direct XHTTP uses TCP 8444 and the entry relays Hysteria2 and XHTTP on high ports, so on a network that opens only ports 80 and 443 the Reality lines, and direct Hysteria2 where UDP passes, are what can still connect. Today one entry node in Russia carries every via-RU line, for everyone on the network: if it is down, those lines fail together and the direct lines remain. For these networks keep both kinds of route and all three transports in your filters; the dashboard can also limit the list to the via-RU routes or to the direct ones. We do not test Russian mobile operators ourselves and make no promise for any of them: use the trial on the networks your users are on.
09 /Subscribers stay yours
A subscriber is an ID you choose, up to 128 bytes (64 Cyrillic letters) and unique within your account. They have no ProofKit login, and the only identity we hold for them is that ID; we record their sessions and traffic, not the sites they visit (see the partner terms). Disabling one ends their sessions and removes their credentials from the nodes at once, and their subscription answers 404; their olcRTC keys drop at the next room-health pass, which runs about every five minutes. Creating the same ID again re-enables them, and so, once olcRTC is on for you, does asking the API for an olcRTC line for them. If a subscription URL leaks, a reset gives the subscriber a new hosted URL, ends their sessions and revokes their olcRTC keys; the next fetch hands out fresh credentials. If you serve the URL through your own server, change that URL too: a reset replaces the credentials and our hosted URL, not the one your server answers.
10 /Usage you can reconcile
Usage is recorded interval by interval as the traffic is billed, so any window you ask for counts exactly the bytes billed inside it; the nodes report traffic about once a minute, so a window's edges are as sharp as those reports. The default window is the last 30 days. Each subscriber's line has bytes sent, bytes received and the cost copied from the charge itself, zero inside the free trial, and subscribers who used nothing are listed too. There is no usage webhook, and a traffic quota needs none: set one on a subscriber, through the API or in the dashboard, and once its traffic reaches it the subscriber is cut off, with no lines in its subscription until you raise the quota or set it again. An end date works the same way.
11 /What can go wrong
There is no uptime guarantee: any node can go offline. The catalogue shows which agents are online, a connect that fails names the reason, such as AGENT_OFFLINE, NODE_AT_CAPACITY or NODE_OVERLOADED, and a subscription leaves out the routes it cannot open. Every exit blocks BitTorrent and ends a session that has uploaded more than 30 GB and more than one and a half times what it downloaded (whatever the traffic is), then keeps that subscriber off that exit for an hour (see Torrent Guard in the partner terms). A session opened with connect or the olcRTC call that carries no traffic within an hour of starting is closed and its config stops working; the subscription's lines are kept. Each key may make 300 API calls and 1,200 subscription fetches a minute, and the answers report what is left in X-RateLimit-* headers. API errors share one JSON shape with a stable code; a request the server cannot parse, such as malformed JSON, gets a plain-text answer instead.
12 /Telegram Mini App sign-in
Your Mini App sends Telegram's initData to our partner sign-in. We check Telegram's own signature for your bot, refuse data older than five minutes, and return access and refresh tokens for that user's ProofKit account, the same account our own bot would give them. From there your app uses the ordinary user API: balance, connect and configs, and TON deposits and withdrawals once the user links a wallet with a TonConnect proof for a domain we accept (proofkit.org, or yours once we add it). Your Mini App's origins are allow-listed for our API, and the sign-in is accepted only from them and only with your bot on file. Accounts protected by two-factor sign-in, operator and admin accounts, and accounts that run a partner cannot sign in through a partner Mini App (ACCOUNT_NOT_ALLOWED). Users who create their account through your Mini App are recorded as arriving through you.
13 /Getting a key
There is no self-serve sign-up. Sign in to proofkit.org, or create a free account, and open a ticket under Support, category "Other", with Partner API in the subject; the link fills both in. Say what you run, the countries and transports you need, the traffic you expect and which account will run your dashboard: one that signs in with an email address and runs no other partner. We set up your partner account, start a free trial if you want one, switch on subscriptions, grant any nodes we agree on and issue your first key; the subscription's branding and filters you set in the dashboard. A key is shown once and we keep only its hash and prefix, so store it on your server. A key rotated in the dashboard leaves the old one working for 24 hours; a key we issue by hand replaces every older key at once. A partner that adds its subscribers by hand needs no key: ask with Start without code, and we set up the same account without one. Read the partner terms before you open the ticket.
// faq
Common questions
What does a GB cost?
The node's price per GB plus a 20% network fee; through an entry node in Russia, both nodes' prices plus the fee. The partner catalogue lists each node's price for you and the total with the fee. Prices are set in TON and do not follow any fiat currency. There is no monthly fee: your balance is charged only for the traffic your subscribers move, upload and download together. olcRTC traffic has a price of its own from 20 November 2026, the same on every exit and route: 0.0208 TON per GB (about $0.03), 0.0347 TON (about $0.05) from 8 December 2026 and 0.0556 TON (about $0.08) from 22 December 2026. Until 20 November 2026 it costs the route's price.
Is there a minimum deposit?
The escrow contract accepts deposits of 0.05 TON or more, and the partner dashboard asks for at least 0.1 TON. A deposit counts only when it comes from your linked partner wallet, through the dashboard or with the comment "deposit". There is no minimum balance to keep, but there is no credit either: at zero, outside a free trial, new sessions are refused and running ones end.
How do we pay?
In TON, prepaid. You link your partner wallet in the dashboard and top up from it into the ProofKit escrow contract. Your balance is credited only for the dashboard's deposit or a transfer from that wallet with the comment "deposit". A transfer with no comment stays in the contract credited to no one, one with any other comment is rejected by the contract, and one from any other wallet, an exchange's included, is held for that wallet and not added to your balance. Only Toncoin counts.
Can we test before we pay?
Yes. We can start a free trial on your partner account: its traffic costs nothing while its limits hold. The default limits are 7 days, 10 subscribers and 50 GB. Past any of them, the traffic is charged to your balance. The trial runs on the live network; there is no separate test environment.
Does one subscription URL work in Happ with Reality, Hysteria2 and XHTTP?
Yes. Each subscriber has one subscription in the base64 format Happ reads, with a VLESS Reality line for every route and Hysteria2 and XHTTP lines where the route carries them. v2rayNG and Hiddify read the same format, but XHTTP lines need an Xray-core app such as Happ or v2rayNG. olcRTC lines come only in the Ghostlane format and the JSON form, never in the Happ list, because Happ cannot run olcRTC.
Can the subscription carry our brand and our domain?
Your brand, yes: your title, support link, web page link and a prefix on every line's name, which you set in your partner dashboard. For your domain there are two ways: once you are out of the free trial, point a subdomain of yours at us with one DNS record and, when we approve it, every subscriber's hosted URL answers on it; or let your server answer its own subscription URL and fetch each subscriber's subscription from our API with your key. Either way the URL your users add is yours, not proofkit.org.
What do you recommend for Russian mobile networks?
Hand out the whole subscription, so your users can switch to another line when one is blocked. Every exit comes direct and, where it is linked, through an entry node in Russia, with Reality, Hysteria2 and XHTTP lines where the route carries them. Try direct Reality first; if an exit's direct lines fail, the same exit via RU; if Reality stalls, Hysteria2 where UDP passes and XHTTP where it does not; on days when only approved services get through, olcRTC in an app that runs it. Today one entry node in Russia carries every via-RU line. We do not test Russian mobile operators ourselves, so try your users' networks during the trial.
Do my subscribers need a ProofKit account?
Not when you create them, through the server-to-server API or by hand in the dashboard. A subscriber is an ID you choose; they have no ProofKit login, and the only identity we hold for them is that ID. We record their sessions and traffic, not the sites they visit. Users who sign in through your Telegram Mini App do get their own account and pay for themselves.
Is there an uptime guarantee?
No. Any node can go offline. The catalogue shows whether each node's agent is online, a failed connect returns a named error, and a subscription leaves out the routes it cannot open and returns the rest.
Can we work without writing code?
Yes. In the partner dashboard you add a subscriber by hand: an order or booking number, how long the access lasts and how much traffic it carries, then you hand over its link or its QR code. Opened in a browser, the link is a setup page with your title that tells the person which app to install. No API key is needed. Ask with Start without code on this page, and we set up your partner account.
How do we get an API key?
Sign in to proofkit.org, or create a free account, and open a ticket under Support, category "Other", with Partner API in the subject: what you run, the countries and transports you need, the traffic you expect, and the account that will run your partner dashboard, one that signs in with an email address, not only with Telegram, and runs no other partner. There is no self-serve sign-up. We set up your partner account and issue the key, which is shown once.
Is the API documented?
Yes, publicly. The Partner API documentation at proofkit.org/partner-docs has a quick start, the full reference with every endpoint, field and error code, and guides to paying in TON, to users in Russia and to working from the dashboard without code. The partner terms are at proofkit.org/partner-terms.
// talk to us
Request access
Each button opens a Support ticket with the category "Other", its subject and our questions filled in; sign in first, or create a free account. With a backend, tell us what you run, the countries and transports you need, the traffic you expect, and the account that will run your partner dashboard: we set up your partner account, start a free trial if we agree one, and issue your key. With no backend, tell us what you do, who gets the access and how many people: we set up the same account, and you add them by hand. The Partner API documentation, its quick start and the partner terms are public.