Check an IP address
curl --request POST \
--url https://api.proxyjam.com/public/v1/ip-check \
--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"
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', 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",
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"
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")
.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")
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{
"verdict": "<string>",
"risk_score": 123,
"charge": {},
"signals": {},
"vendors": [
{}
],
"partial": true,
"cached": true,
"id": {}
}IP reputation
Check an IP address
Score any public IP address against three independent reputation sources.
POST
/
ip-check
Check an IP address
curl --request POST \
--url https://api.proxyjam.com/public/v1/ip-check \
--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"
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', 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",
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"
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")
.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")
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{
"verdict": "<string>",
"risk_score": 123,
"charge": {},
"signals": {},
"vendors": [
{}
],
"partial": true,
"cached": true,
"id": {}
}Scores one address and returns a single verdict alongside each source’s own
reading. The verdict follows a fixed rule — it is never an average of the
scores, because the sources use incompatible scales.
Billable. Send an
Idempotency-Key so a retry replays the original answer
instead of paying twice. Every proxy order you have been delivered grants one
free check, and a repeat of a recent check on the same address is free for
everyone. Use Get check quota to see what is left
before you call.
This endpoint is behind the
ip_reputation.check.enabled feature flag. Read
GET /flags to find out whether it is available to you; a disabled feature
answers 403.Request
string
required
The IPv4 or IPv6 address to check. Must be publicly routable — private and
reserved ranges have no reputation to report and are rejected with
422.
IPv6 is canonicalised, so the ip in the response may differ from what you
sent; treat the returned value as the address that was checked.string
A UUID you generate per submission and reuse on retry. Reusing a key with a
different address answers
409.Response
string
clean, suspicious, risky or blacklisted.integer
0–100. The highest score any source gave, not the mean.
object
amount (decimal string — parse it, do not assume a number), currency
(always USD) and free. free: true with cached: true means a recent
result was reused; free: true with cached: false means one of your free
checks was spent.object
tor, vpn, proxy_detected, datacenter, recent_abuse, known_abuser
and blocklists. proxy_detected and datacenter are reported for
information only and never move the verdict — a bare address carries no
statement of what it is meant to be.object[]
One entry per source:
vendor, label, status (ok or unavailable),
and — when it answered — band (clean, suspicious, high_risk), score
and risk. A source that could not be reached is excluded from the verdict
rather than counted as clean, so never read a missing band as a good sign.Each entry also carries score_metric, risk_metric and score_derived,
which say what that source’s two values actually are. Read them before
putting two sources side by side: score is a measurement for some sources
and a band midpoint for others, and risk is not the same question from one
source to the next — one reports a risk level, another how frequently the
address is reported. A high score beside a low wording is those two fields
disagreeing about the question, not the source contradicting itself.boolean
True when at least one source could not be reached, so the verdict rests on
fewer opinions than usual.
boolean
True when a recent result for this exact address was reused. Cached answers
are free and are not stored in your history.
string | null
Identifies the stored result for Get a check.
null for a cached answer, which stores nothing.Errors
| Status | Meaning |
|---|---|
403 | The feature is not enabled for your account. |
409 | Insufficient USD balance (details.required is the price), or the Idempotency-Key was already used for a different address. |
422 | The address is unparseable or not publicly routable. |
429 | Too many checks. details.retry_after and the Retry-After header give the delay in seconds. |
503 | Too few sources answered. Nothing was charged. |
Example
curl -X POST https://api.proxyjam.com/public/v1/ip-check \
-H "X-API-Key: pj_AbCdEf..." \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-H "Content-Type: application/json" \
-d '{"ip": "8.8.8.8"}'
from proxyjam import ProxyJamClient
with ProxyJamClient(api_key="pj_live_...") as proxyjam:
result = proxyjam.ip_check.check("8.8.8.8", idempotency_key="550e8400-...")
print(result.verdict, result.risk_score)
for source in result.vendors:
print(source.label, source.status, source.band)