curl --request GET \
--url https://closedvpn.io/auth/vpn-user-stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://closedvpn.io/auth/vpn-user-stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://closedvpn.io/auth/vpn-user-stats', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://closedvpn.io/auth/vpn-user-stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://closedvpn.io/auth/vpn-user-stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://closedvpn.io/auth/vpn-user-stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://closedvpn.io/auth/vpn-user-stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"connected": true,
"privateIP": "10.8.0.6",
"publicIP": "203.0.113.1",
"bytesReceived": 1048576,
"bytesSent": 524288,
"connectedTime": "02:15:00"
}{
"message": "Organization ID is required"
}{
"message": "Unauthorized"
}{
"message": "You do not have permission to access this organization"
}{
"message": "Organization not found"
}{
"message": "Server error"
}VPN User Stats
Returns real-time VPN connection statistics for the authenticated user in a specific organization, including connection status, IP addresses and traffic data.
curl --request GET \
--url https://closedvpn.io/auth/vpn-user-stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://closedvpn.io/auth/vpn-user-stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://closedvpn.io/auth/vpn-user-stats', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://closedvpn.io/auth/vpn-user-stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://closedvpn.io/auth/vpn-user-stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://closedvpn.io/auth/vpn-user-stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://closedvpn.io/auth/vpn-user-stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"connected": true,
"privateIP": "10.8.0.6",
"publicIP": "203.0.113.1",
"bytesReceived": 1048576,
"bytesSent": 524288,
"connectedTime": "02:15:00"
}{
"message": "Organization ID is required"
}{
"message": "Unauthorized"
}{
"message": "You do not have permission to access this organization"
}{
"message": "Organization not found"
}{
"message": "Server error"
}Authorizations
Personal Access Token (PAT) passed in the Authorization header (e.g., Bearer <pat>) for authenticated API requests. PATs are generated via /auth/generate-pat after authenticating through the magic link flow.
Query Parameters
"60c72b2f5f1b2c001c8e4b1a"
Response
The caller's connection state. When the user is not connected, or the VPN host cannot be reached, the body is {"connected": false} and no other field is present. Every field except connected is returned only when connected is true.
true
Address assigned to the client inside the tunnel
"10.8.0.6"
Public address of the VPN host
"203.0.113.1"
1048576
524288
Session duration formatted as HH:MM:SS
"02:15:00"

