Compare every source
curl --request POST \
--url https://api.proxyjam.com/public/v1/ip-check/sources \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"ip": "<string>"
}
'import requests
url = "https://api.proxyjam.com/public/v1/ip-check/sources"
payload = { "ip": "<string>" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({ip: '<string>'})
};
fetch('https://api.proxyjam.com/public/v1/ip-check/sources', 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://api.proxyjam.com/public/v1/ip-check/sources",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'ip' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.proxyjam.com/public/v1/ip-check/sources"
payload := strings.NewReader("{\n \"ip\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.proxyjam.com/public/v1/ip-check/sources")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ip\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proxyjam.com/public/v1/ip-check/sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ip\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"listings": [
{}
],
"cached_check": {}
}IP reputation
Compare every source
What each reputation source says about one address, side by side, for free.
POST
/
ip-check
/
sources
Compare every source
curl --request POST \
--url https://api.proxyjam.com/public/v1/ip-check/sources \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"ip": "<string>"
}
'import requests
url = "https://api.proxyjam.com/public/v1/ip-check/sources"
payload = { "ip": "<string>" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({ip: '<string>'})
};
fetch('https://api.proxyjam.com/public/v1/ip-check/sources', 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://api.proxyjam.com/public/v1/ip-check/sources",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'ip' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.proxyjam.com/public/v1/ip-check/sources"
payload := strings.NewReader("{\n \"ip\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.proxyjam.com/public/v1/ip-check/sources")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ip\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proxyjam.com/public/v1/ip-check/sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ip\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"listings": [
{}
],
"cached_check": {}
}The companion to Check an IP address, not a cheaper
version of it. That endpoint asks three vendors and returns one verdict. This
one shows what each source says and leaves the judgement to you.
Free, and free structurally. The published blocklists are held locally, so
consulting them is a database lookup rather than a request. The paid vendors
are not called at all — their rows appear only when a recent check on the same
address is still cached, which is what
cached_check reports. Nothing is
charged and no free allowance is spent.
Do not compare the vendors’ numbers directly
Each vendor row carriesscore_metric, risk_metric and score_derived, and
they exist because the columns invite a comparison the numbers cannot support:
scoreis a measurement for some vendors and a band midpoint for others. Whenscore_derivedistrue, that vendor published no number of its own and ours is arithmetic, not their finding.riskis not the same question twice. One vendor reports a risk level; another reports how frequently the address is seen abusing. A high score beside a low wording is those two fields answering different questions, not a vendor contradicting itself.
Body
string
required
A public IPv4 or IPv6 address. Private and reserved ranges are refused.
Response
object[]
Every published list held locally, whether or not it contains the address:
source, label, claim, listed, network, attribution and
synced_at.Silent sources are included on purpose — a table of hits alone cannot be
told apart from one whose corpus never loaded. Check synced_at before
trusting a listed: false: null means that list has never loaded here.claim says what membership would mean, and the three are not
interchangeable. blocklist is a publisher saying not to route the address,
and it is the only one that decides a verdict. recent_abuse is a honeypot
report from the last couple of days, which ordinary residential addresses
pass through routinely. tor_exit describes what the address is, not what
it did.network is the matching range rather than the address you asked about — a
/20 listing and a single-host listing are different claims.object | null
The vendors’ rows from a recent check on this address, reused for free:
vendors (same shape as in Check an IP address),
verdict and risk_score.null means no vendor was asked — not that every vendor was unreachable.
This endpoint never calls one.Errors
| Status | Meaning |
|---|---|
403 | The feature is off for your account. Read GET /flags. |
422 | The address is missing, malformed, or not publicly routable. |
429 | Too many requests. |
Example
curl -X POST https://api.proxyjam.com/public/v1/ip-check/sources \
-H "X-API-Key: $PROXYJAM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ip": "1.10.16.42"}'
from proxyjam import ProxyJamClient
with ProxyJamClient(api_key="pj_live_…") as client:
survey = client.ip_check.sources("1.10.16.42")
for entry in survey.listings:
if entry.listed:
print(f"{entry.label}: {entry.network} ({entry.claim})")
Response
{
"ip": "1.10.16.42",
"checked_at": "2026-09-09T06:29:30Z",
"listings": [
{
"source": "blocklist_de",
"label": "blocklist.de",
"claim": "recent_abuse",
"listed": false,
"network": null,
"attribution": "blocklist.de",
"synced_at": "2026-09-09T06:29:30Z"
},
{
"source": "spamhaus_drop",
"label": "Spamhaus DROP",
"claim": "blocklist",
"listed": true,
"network": "1.10.16.0/20",
"attribution": "The Spamhaus Project",
"synced_at": "2026-09-09T06:29:30Z"
}
],
"cached_check": null
}