Skip to main content

PublicVPNList API v1

Read current prebuilt snapshots of technically checked OpenVPN, VLESS, Trojan, VMess, Shadowsocks, Hysteria2, TUIC, WireGuard and IKEv2 endpoints. API responses never build the catalog or run a VPN check in the request.

Important: PublicVPNList does not operate these third-party servers. A successful technical check does not guarantee privacy, identity, operator trust, logging practices or future availability.

Free API & downloads: 24-hour access

Get access here before using the API or downloading a dataset. Your key and download links expire after 24 hours. Return to this page and press the button to get new access; it does not renew automatically.

Checking access…

Protected by Google reCAPTCHA. Google’s Privacy Policy and Terms of Service apply.

Request permanent access

For permanent access, tell us your name, email and intended use. Requests are reviewed individually.

Already saved files are not revoked. A configuration may stop working earlier if its third-party server changes. Individual OpenVPN checks still use their existing single-use download token.

Available through the API

Current server records available in the API and metadata exports across all nine protocols. Counts refer to endpoint records; a host can have multiple configurations.

4,382Server records
59Countries
2.74 MbpsMedian measured speed
15.95 MbpsHighest measured speed

Speed measured for 4,142 of 4,382 records. Only checker-measured throughput is included; missing measurements are excluded, not treated as zero. Results depend on the checker location and are not guaranteed client speeds.

OpenVPN uses its API country. Other protocols use the geolocated countries of verified exit IPs, which can differ from server locations. Geography uses the local DB-IP Lite database; unknown locations stay separate. The API country filter uses the published country_code field; exit-IP grouping is shown here.

Availability by protocol
ProtocolRecordsCountriesMedian speedHighest speed
OpenVPN2,500482.44 Mbps10.83 Mbps
VLESS823283.84 Mbps10.43 Mbps
Trojan19475.88 Mbps8.89 Mbps
VMess197153.07 Mbps7.39 Mbps
Shadowsocks593194.69 Mbps11.32 Mbps
Hysteria266143.39 Mbps15.95 Mbps
TUIC911.82 Mbps1.95 Mbps
WireGuard00Not measuredNot measured
IKEv200Not measuredNot measured

On small screens, scroll the table sideways to see all speed columns.

Countries and measured speeds — all protocols combined
CountryRecordsSpeed measuredMedian speedHighest speed
Japan (JP)1,3371,301 / 1,3372.20 Mbps4.12 Mbps
South Korea (KR)1,0981,087 / 1,0982.66 Mbps5.09 Mbps
USA (US)762716 / 7623.70 Mbps6.52 Mbps
Netherlands (NL)315300 / 3156.91 Mbps9.76 Mbps
France (FR)132129 / 1326.44 Mbps9.82 Mbps
Italy (IT)102102 / 1027.94 Mbps9.37 Mbps
Canada (CA)9677 / 963.60 Mbps4.44 Mbps
Singapore (SG)8867 / 882.41 Mbps3.57 Mbps
Germany (DE)6045 / 606.64 Mbps11.23 Mbps
Hong Kong (HK)5513 / 552.37 Mbps5.66 Mbps
UK (GB)4441 / 445.90 Mbps8.94 Mbps
Russia (RU)4343 / 435.23 Mbps15.95 Mbps
Finland (FI)2521 / 256.06 Mbps11.38 Mbps
Croatia (LOCAL Name: Hrvatska) (HR)2323 / 231.37 Mbps1.50 Mbps
Poland (PL)2221 / 228.19 Mbps10.21 Mbps
Belarus (BY)1717 / 178.49 Mbps10.69 Mbps
Australia (AU)1313 / 131.75 Mbps2.70 Mbps
Spain (ES)1313 / 135.52 Mbps6.12 Mbps
India (IN)117 / 113.20 Mbps3.94 Mbps
Austria (AT)99 / 97.33 Mbps8.63 Mbps
Thailand (TH)98 / 93.11 Mbps3.69 Mbps
Türkiye (TR)86 / 86.27 Mbps7.00 Mbps
Ukraine (UA)88 / 83.62 Mbps5.87 Mbps
Romania (RO)71 / 72.32 Mbps2.32 Mbps
Switzerland (CH)77 / 72.67 Mbps3.84 Mbps
United Arab Emirates (AE)75 / 72.05 Mbps2.90 Mbps
Vietnam (VN)77 / 72.39 Mbps2.95 Mbps
Sweden (SE)65 / 62.63 Mbps7.54 Mbps
Malaysia (MY)51 / 50.76 Mbps0.76 Mbps
Mexico (MX)55 / 53.20 Mbps3.68 Mbps
Albania (AL)44 / 44.60 Mbps6.61 Mbps
Chile (CL)43 / 42.77 Mbps2.85 Mbps
Indonesia (ID)43 / 43.16 Mbps3.55 Mbps
Bulgaria (BG)33 / 35.50 Mbps6.66 Mbps
Latvia (LV)33 / 310.12 Mbps10.18 Mbps
Brazil (BR)22 / 21.68 Mbps2.99 Mbps
Czech Republic (CZ)22 / 24.55 Mbps8.68 Mbps
Hungary (HU)22 / 26.68 Mbps7.35 Mbps
Lithuania (LT)22 / 27.00 Mbps7.79 Mbps
New Zealand (NZ)22 / 22.49 Mbps2.77 Mbps
Peru (PE)22 / 21.00 Mbps1.59 Mbps
Bangladesh (BD)11 / 10.71 Mbps0.71 Mbps
Bosnia and Herzegowina (BA)11 / 11.71 Mbps1.71 Mbps
Costa Rica (CR)11 / 10.40 Mbps0.40 Mbps
Ecuador (EC)11 / 12.66 Mbps2.66 Mbps
Egypt (EG)11 / 11.12 Mbps1.12 Mbps
Estonia (EE)11 / 15.53 Mbps5.53 Mbps
Georgia (GE)11 / 13.12 Mbps3.12 Mbps
Grenada (GD)11 / 10.07 Mbps0.07 Mbps
Kazakhstan (KZ)10 / 1Not measuredNot measured
Moldova Republic of (MD)11 / 14.41 Mbps4.41 Mbps
Myanmar (MM)11 / 11.63 Mbps1.63 Mbps
Northern Mariana Islands (MP)11 / 11.88 Mbps1.88 Mbps
Paraguay (PY)11 / 12.29 Mbps2.29 Mbps
Philippines (PH)11 / 10.58 Mbps0.58 Mbps
Portugal (PT)11 / 11.46 Mbps1.46 Mbps
South Africa (ZA)10 / 1Not measuredNot measured
Taiwan (TW)11 / 11.95 Mbps1.95 Mbps
Yemen (YE)11 / 10.98 Mbps0.98 Mbps

OpenVPN · Snapshot updated: .

Other protocols · Snapshot updated: .

View protocol counts in the API · Download metadata exports

Quick start

Use the versioned /api/v1/ paths. Respect 429, apply backoff, cache the ETag, and check both expires_at and each record’s last_checked_at.

EndpointPurpose
GET /api/v1/serversFilter, sort and paginate server records
GET /api/v1/servers/{public_id}One record by stable public ID
GET /api/v1/countriesAvailable countries and counts; optional protocol filter
GET /api/v1/protocolsPublished protocols and transports
GET /api/v1/statsSnapshot counters; optional protocol filter
GET /api/v1/datasetVersion, lifecycle and export links; optional protocol filter
GET /api/v1/healthLightweight snapshot health; optional protocol filter
curl -H 'Authorization: Bearer YOUR_24_HOUR_KEY' -H 'Accept: application/json' \
  'https://publicvpnlist.com/api/v1/servers?protocol=vless&status=online&sort=last_checked&order=desc&per_page=50'
Result will appear here.

Filters and pagination

ParameterAccepted value
countryTwo-letter ISO code, for example US
protocolopenvpn, vless, trojan, vmess, shadowsocks, hysteria2, tuic, wireguard or ikev2. Omitted keeps the original OpenVPN default.
transporttcp, udp, websocket, grpc and other documented normalized transports
port1–65535
fresh_withinAge in seconds, 1–259200
min_speed, max_latency, min_uptimeNumeric technical filters; unknown uptime is null
statusonline means online at the last technical check
sortspeed, latency, uptime, last_checked, score, first_seen
orderasc or desc
page, per_pageDefault 1 / 50; maximum page size 200
fieldsComma-separated public fields
formatjson

Examples

PHP

$url = 'https://publicvpnlist.com/api/v1/servers?country=US&per_page=10';
$context = stream_context_create(['http' => ['header' => "Authorization: Bearer YOUR_24_HOUR_KEY\r\n"]]);
$data = json_decode(file_get_contents($url, false, $context), true);

Python

import requests
r = requests.get('https://publicvpnlist.com/api/v1/servers', params={'country': 'US'}, headers={'Authorization': 'Bearer YOUR_24_HOUR_KEY'}, timeout=15)
r.raise_for_status()
print(r.json()['data'])

JavaScript

const response = await fetch('https://publicvpnlist.com/api/v1/stats', {headers: {Authorization: 'Bearer YOUR_24_HOUR_KEY'}});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const payload = await response.json();

Record fields

FieldsMeaning
idStable public endpoint ID; never a Bitrix element ID.
country_code, country_name, cityPublished location metadata. Unknown or unverified city is null.
hostname, ip, protocol, transport, portPublic connection endpoint metadata allowed by the catalog policy.
speed_mbps, latency_msRepresentative measurements from the PublicVPNList checker region, not a client-side guarantee.
uptime_percent_7d, uptime_hours, sessionsnull until a matching trustworthy measurement window exists; values are never invented.
technical_quality_score, score_labelReachability/performance/freshness signal. It is not a privacy, identity or trust assessment.
last_checked_at, first_seen_at, config_updated_atUTC ISO 8601 timestamps; unknown config-update time is null.
freshness_status, availability_statusSnapshot-relative freshness and state at the last technical check.
source_name, source_urlUpstream attribution.
server_page_url, config_download_urlPublic catalog and current download location. OpenVPN keeps its existing protected download flow; verified URI protocols return the same download URL used by their live table.
v2rayng_urlv2rayNG Android deep link for VLESS, VMess, Trojan, Shadowsocks and Hysteria2. Imports this server as a subscription; the user starts the VPN in the app. Unsupported protocols return null.
connection_info_urlFetch on demand for config_uri, a direct profile v2rayng_url, and qr_payload. The same freshness and source checks as Download apply (404/410/503 errors). Do not cache or log the returned configuration.
qr_code_urlOpens an HTML QR viewer with SVG download, not an image endpoint. To render a QR in your own app, encode qr_payload from the connection JSON verbatim. It is null above 2,400 UTF-8 bytes. TUIC supports QR only. Client integration example.
transport_security, exit_ip, handshake_ms, https_first_byte_msProtocol-specific connection metadata and checker measurements. Unsupported or unknown values remain null; they are never inferred.
risk_flags, config_sha256Non-secret caution flags and a content hash where available; no configuration content is returned.

HTTP behavior

  • Free API limit: 60 requests per minute per short-lived keyed IP hash. The small health endpoint is not tied to the filesystem counter so monitoring remains available during counter-storage failures.
  • 401 missing, expired or revoked access key, 400 invalid parameter, 404 unknown endpoint/record, 405 method, 429 rate limit, 500 safe internal error.
  • Use ETag or Last-Modified; unchanged GET/HEAD requests return 304.
  • CORS allows GET/HEAD with an Authorization Bearer key; OPTIONS does not require a key. Authenticated responses use private, no-store caching. Duplicate query parameters are rejected.
  • Technical quality score is not a privacy, identity or trust assessment.

See the exact machine-readable contract in OpenAPI JSON and stable files on the exports page.

Changelog and migration policy

Access policy — September 18, 2026: API requests and every export require a free 24-hour key issued after Google reCAPTCHA. Previous anonymous integrations must obtain a key on this website and send it as a Bearer header. Permanent personal keys are available only after individual review. Legacy routes follow the same access policy.

v1.3 — September 18, 2026: protocol-specific countries, statistics, lifecycle and health; JSON/CSV/TXT/XML exports for every published protocol; downloads share the API generation. URI-protocol latency and tunnel RTT now use the measured HTTPS round trip, with null for missing measurements. Handshake and first-byte fields retain their separate meanings.

v1.2 — August 31, 2026: additive protocol filters, compact checked snapshots, current config download URLs and dedicated documentation for VLESS, Trojan, VMess, Shadowsocks, Hysteria2, TUIC, WireGuard and IKEv2. The no-filter default remains OpenVPN.

v1.1 — July 28, 2026: source-reported and PublicVPNList-measured fields are separate; health exposes snapshot age and generator state and remains independent of counter storage.

v1.0 — July 28, 2026: stable public IDs, strict filters, pagination, conditional caching, rate-limit headers and snapshot exports.

The earlier multiprotocol preview remains temporarily available on its old specialist routes and with ?legacy=1 for list routes. New integrations should use the documented dataset response; legacy compatibility may be retired only after a published migration window.

Breaking changes require a new versioned path. Additive fields may appear in v1; integrations should ignore unknown fields. A deprecated major version will be documented before removal.

Acceptable use: cache results, avoid scraping HTML, do not use the service to conceal abuse, and report unwanted or incorrect endpoint listings through contact/takedown.