Partner API documentation
Changes
Partner API v1 · revision 1.13 · 9 November 2026
What was added to the Partner API, and when. The API has one major version, v1, and it only grows.
All the guides · OpenAPI spec and explorer · Need more? Talk to us · Partner terms
What was added to the Partner API, and when. The API has one major version, v1, and it only
grows: see Versions and compatibility. A revision
is listed on the day it went live. Revisions 1.0 to 1.3 were numbered afterwards, from the
history of this documentation.
Revision 1.13
9 November 2026
- The session of a partner's Telegram Mini App is bounded to the subscription. A user who signs in
through your Mini App (
POST /) gets a session that carries the mark of a partner's Mini App in every token it has, the tokens a refresh returns included. It reads the account (the profile, the balance, the usage, the sessions, the subscription and its lines, the payments) and connects by country (api/ v1/ partners/ {partner_id}/ auth/ telegram POST /withapi/ v1/ connect exit_country, andentry_countryif you like: ProofKit's own selector picks the node). It can no longer link a wallet, ask for a withdrawal or a claim, connect to a node, an entry or a service by name, switch a session to one, change the profile, the two-factor sign-in or the Telegram link, or make an API key, an extra link, a partner or a node. Those calls answer403with the codeDOOR_SCOPEand the sentence "Sign in on proofkit.org to do this.": send the user to proofkit.org, where, signed in, they do all of it. The list is in the section "What the session may do" of the Mini App integration guide you were sent. A session your Mini App opened before this revision is bounded the same way from its next refresh. - Not changed: no route, field, parameter or status of the Partner API with your key
(
X-Partner-Key), and nothing of the MCP server. A partner with no Telegram Mini App is not affected.
Revision 1.12
3 November 2026
transporton every event ofGET /: the transport the session's connections came in through in the minute that ended it, the one that carried most of those to ports other than 80 and 443, or of all of them in a minute with none. It is one ofguard-events vless_reality,vless_xhttp,hysteria2,vless_webtunnelandolcrtc, the words ofsupported_transportsinGET /, orcatalogue null: foruploadandsession_limit, which are judged by the session's bytes whatever they came in through, and when the exit could not say. Until now an event said which exit and why, not which way the subscriber came in. The set can grow: treat a value you do not know as other.- Not changed: no other field, parameter or status. The five reasons, the counts, the paging and the 30 days are as they were.
Revision 1.11
2 November 2026
- WebTunnel on a direct route. A route straight to an exit can now carry the
vless_webtunnelline, not only a route through an entry. It comes as before: you listvless_webtunnelinsub_transports, and the line is the fourth of its route, after XHTTP, with a name ending· WebTunnel, in thehappandjsonformats ofGET /and at the hostedsubscribers/ {external_id}/ subscription /sub/URL. On a direct route it runs to a name on a domain that ProofKit controls, at the exit's own address, so to a network it looks like a visit to an ordinary website; it is for networks that cut the other lines. An exit serves it only while it is working, and the route has its other lines meanwhile. No list for the Ghostlane app carries it, as before. See WebTunnel.<sub_token> vless_webtunnelamong thesupported_transportsof an exit inGET /, while a route straight to it can carry the line. Until now only an entry named it. If your code read the value there as "through an entry", readcatalogue node_typeas well: on an exit it means a direct route. In the same way avless_webtunnelentry of a subscription may now haveedge_idandentry_countryset tonull, as every direct route does.- The WebTunnel box of the Partner page's Subscription tab is shown once an entry or an exit you can sell serves the line, and the preview names the line on a direct route that serves it.
- Not changed: no field, parameter or status is added, and
nullinsub_transportsis still Reality, Hysteria2 and XHTTP.GET …/still lists three transports and the bundle of those three, and theconfigs transportofPOST …/ignoresconnect "vless_webtunnel"as it ignores every value but"hysteria2".
Revision 1.10
2 November 2026
GET /: every time Torrent Guard ended one of your subscribers' sessions, kept for 30 days. An event names the subscriber (guard-events external_idandsubscriber_id), thereason(upload,session_limit,scan,torrentorbittorrent), the time, the exit node (node_id,node_country,node_type), the session and the numbers behind the decision: the session's bytes for the first two reasons, the minute's destination counts for the other three.sinceandlimitpage through it, andpolled_toandhas_moresay where to continue. We send no notice: you poll.- Not changed: no existing call or answer. Ended sessions are still not listed, and a session that ends for any reason but Torrent Guard has no event.
Revision 1.9
28 October 2026
stake_nanoonGET /: the stake locked on your partner, in nanoTON,account 0for a partner without one.balance_nanois as it was: the balance of your billing account before any stake is taken off. The connect gate works frombalance_nano − stake_nano, less any stake locked in nodes your billing account owns.
Revision 1.8
27 October 2026
- WebTunnel: a fourth transport,
vless_webtunnel, for a partner that lists it. Its line runs VLESS over HTTPUpgrade and TLS to a name on a domain that the entry's operator controls, so to a network it looks like a visit to that operator's website. It is off until you list it insub_transports, wherenullis still Reality, Hysteria2 and XHTTP. See WebTunnel. vless_webtunnelas thetransportof an entry inGET /withsubscribers/ {external_id}/ subscription format=json. In thehappandjsonformats of that call and at the hosted/sub/URL the line closes a route through an entry, after XHTTP, and its name ends<sub_token> · WebTunnel. No list for the Ghostlane app carries it: neitherformat=ghostlanenor the hosted/sub/URL.<sub_token>/ unified vless_webtunnelamong thesupported_transportsof an entry inGET /, while one of its links to an exit in the list serves a line. An exit never names it.catalogue - The WebTunnel box of the Partner page's Subscription tab, shown once an entry you can sell
serves the line (and, once ticked, until you untick it), and
vless_webtunnelas a value ofsub_transportsin the dashboard's settings call. - Not changed:
GET …/still lists three transports and the bundle of those three, and theconfigs transportofPOST …/ignoresconnect "vless_webtunnel"as it ignores every value but"hysteria2".
Revision 1.7
20 October 2026
- Subscriber device limit: how many devices may receive a subscriber's subscription, the devices that did, and removing one or letting it back. See Subscriber device limit.
device_limitonPOST /andsubscribers PATCH /;subscribers/ {external_id} device_limitanddeviceson the subscriber wherever it is answered (GET /,subscribers/ {external_id} POST /) and in the list,subscribers/ {external_id}/ reset GET /.subscribers GET /,subscribers/ {external_id}/ devices DELETE /andsubscribers/ {external_id}/ devices/ {device_id} POST /.subscribers/ {external_id}/ devices/ {device_id}/ allow GET /and the hosted subscription URLs read the device an app names in its request headers,subscribers/ {external_id}/ subscription x-hwid,x-device-os,x-ver-os,x-device-modelanduser-agent. A fetch the limit refuses is answered200with no route andx-hwid-active,x-hwid-max-devices-reachedorx-hwid-not-supported,x-hwid-limit,announceandannounce-url; every answer that judged the device of a subscriber with a limit carriessubscription-always-hwid-enable: 1.- The error codes
INVALID_DEVICE_LIMIT,DEVICE_NOT_FOUNDandDEVICE_LIMIT.
Revision 1.6
19 October 2026
POST /chooses an exit that serves any olcRTC carrier, andsubscribers/ {external_id}/ olcrtc olcrtc_urlin its answer is the first line ofolcrtc_urls: the Telemost line while the exit serves Telemost, the next carrier's otherwise. Until now only an exit that served Telemost was chosen. From 18 October 2026, when Telemost stopped being offered, the call answered503 NO_OLCRTC_NODE.- MTS Link is an olcRTC carrier:
mtslinkinolcrtc_carriersand as thecarrierof a line, whose name ends· MTS. See The olcRTC link.
Revision 1.5
11 October 2026
- Subscriber exit countries: a subscriber's own list of exit countries, in place of your partner's list for that subscriber. See Subscriber exit countries.
- Subscriber expiry: the instant a subscriber's subscription ends, which the platform enforces itself. See Subscriber expiry.
exit_countriesandexpires_atonPOST /andsubscribers PATCH /;subscribers/ {external_id} exit_countries,expires_atandexpiredon the subscriber wherever it is answered (GET /,subscribers/ {external_id} POST /) and in the list.subscribers/ {external_id}/ reset expire=in thesubscription-userinfoheader carries the subscriber's end date when it has one.- The error codes
INVALID_EXIT_COUNTRIES,INVALID_EXPIRES_ATandSUBSCRIPTION_EXPIRED. PATCH /withsubscribers/ {external_id} "quota_bytes": nullclears the quota, as this reference has said since revision 1.3. Until now such a call changed nothing.POST /withsubscribers quota_bytesanswerscreated: truefor a subscriber the call made, as it does without one. Until now such a call answeredcreated: false.
Revision 1.4
11 October 2026
- Every answer names the revision that produced it, in the
X-Partner-Api-Versionheader. See Versions and compatibility. - The OpenAPI document of every revision stays available, at
https://proofkit.org/for this one.partner-api/ versions/ 1.4.json
Revision 1.3
10 October 2026
- Subscriber quotas: an optional traffic allowance per subscriber, which the platform enforces itself. See Subscriber quotas.
quota_bytesonPOST /;subscribers quota_bytes,quota_used_bytes,quota_remaining_bytesandover_quotaon the subscriber wherever it is answered (GET /,subscribers/ {external_id} POST /), in the list, on each row ofsubscribers/ {external_id}/ reset GET /and onusage GET /.subscribers/ {external_id}/ usage PATCH /.subscribers/ {external_id} - The error codes
INVALID_QUOTAandQUOTA_EXHAUSTED.
Revision 1.2
10 October 2026
hosted_baseonGET /: the base of your hosted subscription URLs while a domain of your own is active.account
Revision 1.1
4 October 2026
- The olcRTC part of usage:
olcrtc_bytes,olcrtc_cost_nanoandolcrtc_list_cost_nanoon each row ofGET /and onusage GET /, with their totals.subscribers/ {external_id}/ usage olcrtc_pricingonGET /.account
Revision 1.0
27 September 2026
- The first published contract: the account, the catalogue, subscribers and their list, connect, sessions and their configs, the subscription, olcRTC, and usage.