Documentation
Install the browser script, read results in JavaScript, or call the server API.
1. Install (browser)
Paste before </body> on every page you want to protect. Use your public key (Free or Paid).
<script src="https://proxy.offerzono.com/js/guard.js" data-key="YOUR_PUBLIC_KEY" async></script>
- data-keyPublic key (required)
- data-cache="30"Reuse result for N minutes in the same tab (saves queries). 0 = check every page
- data-callback="fn"Calls window.fn(result) after each check
Popup style (hard block / closable / off), threshold and custom text are set per key in your dashboard.
2. Read the result in JavaScript
document.addEventListener('proxyguard:result', function (e) {
var r = e.detail;
if (r.status !== 'ok') return; // skipped (limit reached, domain not allowed...)
console.log(r.verdict, r.score, r.type); // allow | warn | block
if (r.verdict === 'block') {
document.getElementById('claimBtn').disabled = true;
}
// send r.token to your server and verify it (step 4)
});
// or: window.ProxyGuard.on(function (r) { ... });
// recheck: window.ProxyGuard.recheck();Result example:
{
"status": "ok",
"token": "9f2c...e41a",
"verdict": "block",
"score": 95,
"type": "VPN",
"bot": false,
"flags": [{"code":"vpn","label":"VPN","group":"network"},{"code":"tz_mismatch","label":"Timezone Mismatch","group":"network"}],
"ip": {"address":"185.x.x.x","country":"NL","country_name":"Netherlands","asn":"AS9009","isp":"M247 Europe SRL"},
"webrtc": {"ip":"39.x.x.x","country":"PK","country_name":"Pakistan"},
"browser_tz": "Asia/Karachi"
}When status is skip, the reason is one of: limit_reached no_plan domain_not_allowed invalid_key rate_limited. Nothing is shown to the visitor in this case.
3. Server API (check any IP)
Use your secret key - never put it in HTML. Every call uses 1 query.
GET https://proxy.offerzono.com/api/v1/ip/8.8.8.8?key=YOUR_SECRET_KEY
{
"status": "ok",
"ip": "8.8.8.8",
"proxy": "yes",
"type": "Hosting",
"risk": 60,
"verdict": "warn",
"country": "United States",
"isocode": "US",
"asn": "AS15169",
"provider": "Google LLC",
"flags": ["datacenter"],
"queries_today": 12,
"daily_limit": 1000
}PHP example:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$res = json_decode(file_get_contents('https://proxy.offerzono.com/api/v1/ip/' . urlencode($ip) . '?key=YOUR_SECRET_KEY'), true);
if ($res && $res['status'] === 'ok' && $res['verdict'] === 'block') {
exit('VPN / Proxy not allowed');
}4. Verify a browser token (anti-tamper)
A visitor can disable JavaScript. For important actions (faucet claim, withdraw) send r.token with your form and verify it on your server. Verification is free (no query used). Tokens expire after 2 hours.
GET https://proxy.offerzono.com/api/v1/verify?token=TOKEN&key=YOUR_SECRET_KEY&ip=VISITOR_IP
<?php
$t = preg_replace('/[^a-f0-9]/', '', $_POST['pg_token'] ?? '');
$v = json_decode(file_get_contents('https://proxy.offerzono.com/api/v1/verify?token=' . $t . '&key=YOUR_SECRET_KEY&ip=' . urlencode($_SERVER['REMOTE_ADDR'])), true);
if (!$v || $v['status'] !== 'ok' || $v['verdict'] === 'block' || $v['ip_match'] === false) {
exit('Security check failed');
}Detection flags
| Code | Name | Meaning |
|---|---|---|
| tor | Tor Network | Exit node of the Tor anonymity network |
| vpn | VPN | IP belongs to a known VPN provider range |
| proxy | Proxy | IP is listed as an open / public proxy |
| datacenter | Datacenter / Hosting | IP belongs to a hosting / datacenter range |
| asn_hosting | Hosting ISP (ASN) | ISP name / ASN matches a hosting or VPN company |
| blacklist | Blacklisted IP | IP is on the admin blacklist |
| proxy_headers | Proxy Headers | Request carries proxy / forwarding headers |
| webrtc_leak | WebRTC IP Leak | WebRTC revealed a different (real) IP than the connection |
| tz_mismatch | Timezone Mismatch | Browser timezone does not match the IP country |
| webdriver | WebDriver Active | navigator.webdriver is true (Selenium / Puppeteer / Playwright) |
| headless | Headless Browser | Headless Chrome / Phantom signature found |
| automation | Automation Tool | Automation framework variables found in the page |
| bot_ua | Bot User-Agent | User-Agent is empty or belongs to a bot / script |
| zero_viewport | Zero Window Size | Window / screen dimensions are zero |
| no_plugins | No Browser Plugins | Desktop browser reports zero plugins |
| no_languages | No Languages | navigator.languages is empty |
| software_gl | Software Renderer | WebGL uses a software renderer (VM / headless) |
| chrome_missing | Fake Chrome | User-Agent says Chrome but window.chrome is missing |
| perm_mismatch | Permission Mismatch | Notification permission state is inconsistent (headless) |
| touch_mismatch | Device Mismatch | Mobile User-Agent without touch support (emulator) |