🎉 We just launched long anticipated residential proxies & pay-per-GB!
Pay once, switch between multiple proxy providers.
50% discount for a limited time. See more →
Documentation menu

Free proxy API

GET /api/free-proxy returns Litport's current public free-proxy observations. It requires no authentication.

Request#

curl --get 'https://litport.net/api/free-proxy' \
  --data-urlencode 'country=de' \
  --data-urlencode 'protocol=http' \
  --data-urlencode 'uptimeRating=90' \
  --data-urlencode 'sortBy=responseTimeMs_asc' \
  --data-urlencode 'limit=50'
Parameter Type Default Current behavior
country string all Case-insensitive ISO-2 code. The value is uppercased; no aliases are applied.
limit integer 50 Accepted range 10–1000. Invalid or out-of-range values are ignored.
page integer 1 Accepted range 1–1000. Invalid or out-of-range values are ignored.
sortBy string pingAt_desc Field: pingAt, responseTimeMs, or createdAt. Direction: asc or desc. Invalid values are ignored.
anonymityLevel string all Exact filter. Unknown values usually return an empty array.
protocol string all Exact filter such as http, https, or socks5. Unknown values usually return an empty array.
uptimeRating integer none Minimum 24-hour uptime percentage, 1–100. Invalid values are ignored.
responseTimeMs integer none Maximum HTTP response time in milliseconds, 1–10000. Invalid values are ignored.
format string json json, csv, txt, or txt-proto. Unknown values fall back to JSON.
download flag off When present for a supported format, returns an attachment.

country uses a case-insensitive ISO-2 code and is uppercased for lookup. It has no alias table: use country=gb; country=uk may return an empty array. PPG proxy usernames have different compatibility behavior.

Response behavior#

The default JSON response is a bare array with no data envelope, total, or hasMore value. Pagination is blind: page offset is (page - 1) * limit, and an empty array means no rows matched that page.

Responses send Cache-Control: no-cache, no-store, must-revalidate. Do not rely on an intermediary cache. Invalid numeric parameters and invalid sortBy values are silently ignored in this version, leaving their defaults. Unknown exact filter values commonly produce an empty array rather than a 400 response.

[
  {
    "protocol": "http",
    "host": "192.0.2.10",
    "port": 8080,
    "externalIp": "192.0.2.10",
    "geoCountry": "US",
    "responseTimeMs": 420,
    "uptimeRating": 97,
    "pingAt": "2026-08-25T12:00:00.000Z"
  }
]

Example addresses in this documentation are reserved for documentation and are not live proxies.

JSON fields#

Field Type Meaning
protocol string Proxy protocol.
host string Proxy hostname or IP address.
port integer Proxy port.
externalIp string Observed exit IP.
geoCountry string ISO-2 exit country.
geoCountryFlagEmoji string Country flag for display.
geoRegion string Observed exit region.
geoCity string Observed exit city.
geoTimezone string Observed exit timezone.
asn integer Observed autonomous system number.
asnOrgName string Observed network organization.
anonymityLevel string Measured anonymity classification.
anonymityLevelRating integer Normalized anonymity score.
responseTimeMs integer Measured HTTP response time in milliseconds.
responseTimeRating integer Normalized response-time score.
uptimeRating integer Rounded 24-hour uptime percentage.
createdAt date-time When Litport first observed this proxy.
pingAt date-time When Litport last checked this proxy.

createdAt records when Litport first observed the proxy. pingAt records the last check and is the relevant freshness signal.

CSV and text formats#

# CSV
curl 'https://litport.net/api/free-proxy?format=csv&limit=25'
# host:port, one proxy per line
curl 'https://litport.net/api/free-proxy?format=txt&limit=25'
# protocol://host:port, one proxy per line
curl 'https://litport.net/api/free-proxy?format=txt-proto&limit=25'

Use download=1 with a supported format to request an attachment. CSV is returned as text/csv; text variants use text/plain; JSON uses application/json.

JavaScript example#

const url = new URL('https://litport.net/api/free-proxy')
url.searchParams.set('country', 'us')
url.searchParams.set('limit', '25')

const response = await fetch(url)
if (!response.ok) throw new Error(`HTTP ${response.status}`)
const proxies = await response.json()

Python example#

import json
import urllib.parse
import urllib.request

query = urllib.parse.urlencode({"country": "us", "limit": 25})
with urllib.request.urlopen(f"https://litport.net/api/free-proxy?{query}") as response:
    proxies = json.load(response)