Tot ce ai nevoie pentru a integra OpenIPApi în aplicația ta. URL de bază: https://api.openipapi.com (versionat ca /v1).
threat_score și semnalele VPN/proxy/Tor sunt intrări pentru logica ta de decizie. Combină-le cu semnale de cont, plată, dispozitiv și comportament — nu le folosi niciodată ca unic temei pentru blocare. Vezi Metodologia datelor pentru detalii.
Toate cererile API trebuie să includă cheia API în antetul X-API-Key . Poți găsi cheia API în consolă.
X-API-Key: oip_your_api_key_here
Toate cererile API sunt făcute la următorul URL de bază prin HTTPS:
https://api.openipapi.com
Specificație care poate fi citită de mașini (OpenAPI 3.1): /openapi.yaml.
Toate răspunsurile sunt JSON. Răspunsurile de succes returnează HTTP 200.
Răspunsurile de eroare returnează un cod de stare 4xx sau 5xx corespunzător cu un câmp error .
{
"error": "invalid_api_key",
"message": "The provided API key is invalid or has been revoked.",
"status": 401
}
Interoghează geolocalizarea, rețeaua și datele de amenințare pentru o singură adresă IP.
https://api.openipapi.com/v1/lookup/{ip}
| Parametru | Tip | Descriere |
|---|---|---|
| ip | path | Adresă IPv4 sau IPv6 de interogat. |
| fields | query (optional) | Listă separată prin virgulă a câmpurilor de nivel superior de returnat: geo,network,threat,abuse. |
| date | query (optional) | Interogare istorică — returnează instantaneul acestui IP la data indicată (YYYY-MM-DD). Până la 365 de zile în urmă. Necesită Pro+. Returnează o eroare no_snapshot dacă nu sunt disponibile date pentru acea dată. |
| Câmp | Descriere | Plan |
|---|---|---|
| ip | The queried IP address. | All |
| type | IPv4 or IPv6. | All |
| geo.country_code | 2-letter ISO 3166-1 country code. | All |
| geo.country | Full country name. | All |
| geo.region | Region / state name. | All |
| geo.region_code | Region / state code. | All |
| geo.city | City name. | All |
| geo.postal_code | Postal / ZIP code. | All |
| geo.latitude | Latitude (decimal degrees). | All |
| geo.longitude | Longitude (decimal degrees). | All |
| geo.timezone | IANA timezone identifier (e.g. Europe/Berlin). | All |
| geo.is_sanctioned | True if the country is on OFAC, EU, or UN sanction lists. | All |
| geo.sanction_lists | Array of applicable sanction programs, e.g. ["OFAC","EU"]. | All |
| network.asn | Autonomous System Number. | Starter+ |
| network.as_name | AS organisation name. | Starter+ |
| network.as_domain | AS organisation domain. | Starter+ |
| network.isp | Internet Service Provider name. | All |
| network.organization | Network organisation name. | All |
| network.connection_type | residential, datacenter, mobile, education, or government. | All |
| threat.is_vpn | True if the IP is a known VPN endpoint. | Pro+ |
| threat.is_proxy | True if the IP is a known open proxy. | Pro+ |
| threat.is_tor | True if the IP is a Tor exit node. | Pro+ |
| threat.is_relay | True if the IP is an anonymous relay. | Pro+ |
| threat.is_hosting | True if the IP belongs to a hosting provider. | Pro+ |
| threat.threat_score | Composite risk score 0–100. A signal, not a final verdict — combine with account, payment, device and behavior data. | Pro+ |
| threat.threat_categories | Array of threat category strings. | Pro+ |
| threat.bot_type | Verified bot identifier (e.g. "googlebot", "bingbot") or null. Verified via reverse-DNS + forward confirmation. | All |
| abuse.contact_email | Abuse contact email from WHOIS data. | Pro+ |
$ curl https://api.openipapi.com/v1/lookup/185.220.101.45 \
-H "X-API-Key: oip_your_api_key_here"
{
"ip": "185.220.101.45",
"type": "IPv4",
"geo": {
"country_code": "DE",
"country": "Germany",
"region": "Hessen",
"region_code": "HE",
"city": "Frankfurt am Main",
"postal_code": "60313",
"latitude": 50.1109,
"longitude": 8.6821,
"timezone": "Europe/Berlin",
"is_sanctioned": false,
"sanction_lists": []
},
"network": {
"asn": 205100,
"as_name": "F3 Netze e.V.",
"as_domain": "f3netze.de",
"isp": "F3 Netze",
"organization": "F3 Netze e.V.",
"connection_type": "datacenter"
},
"threat": {
"is_vpn": true,
"is_proxy": false,
"is_tor": true,
"is_relay": false,
"is_hosting": true,
"threat_score": 85,
"threat_categories": ["tor_exit_node", "known_abuser"],
"bot_type": null
},
"abuse": {
"contact_email": "abuse@f3netze.de"
}
}
Interoghează mai multe adrese IP într-o singură cerere. Limitele de dimensiune ale lotului depind de planul tău.
https://api.openipapi.com/v1/lookup/batch
plan_required . | Plan | IP-uri maxime per cerere |
|---|---|
| Starter | 100 |
| Pro | 500 |
| Business | 1,000 |
| Enterprise | 5,000 |
{
"ips": [
"185.220.101.45",
"8.8.8.8",
"1.1.1.1"
]
}
Returnează un array încapsulat de obiecte complete de interogare, în aceeași ordine ca cererea.
{
"results": [
{ "ip": "185.220.101.45", /* full lookup object */ },
{ "ip": "8.8.8.8", /* full lookup object */ },
{ "ip": "1.1.1.1", /* full lookup object */ }
],
"count": 3
}
Returnează geolocalizarea și datele de amenințare pentru adresa IP care face cererea. Util pentru funcționalitățile „Care este IP-ul meu?".
https://api.openipapi.com/v1/me
Răspunsul este identic cu GET /v1/lookup/{ip} cu IP-ul apelantului completat.
$ curl https://api.openipapi.com/v1/me \
-H "X-API-Key: oip_your_api_key_here"
Recuperează informații detaliate despre un Număr de Sistem Autonom. Necesită planul Starter sau superior.
https://api.openipapi.com/v1/asn/{asn}
Parametrul asn acceptă formatele 13335 și AS13335 .
$ curl https://api.openipapi.com/v1/asn/13335 \
-H "X-API-Key: oip_your_api_key_here"
{
"asn": 13335,
"as_name": "Cloudflare, Inc.",
"as_domain": "cloudflare.com",
"organization": "Cloudflare, Inc.",
"country_code": "US",
"ip_ranges_count": 1284,
"total_ips": 2359296
}
Validează o adresă IP și determină tipul acesteia. Nu consumă cota de interogare.
https://api.openipapi.com/v1/validate/{ip}
{
"ip": "185.220.101.45",
"valid": true,
"type": "IPv4",
"private": false,
"bogon": false
}
Scor de fraudă compus (0–100) cu nivel de risc și recomandare acționabilă. Combină semnale de VPN, proxy, Tor, datacenter și abuz istoric. Plan Starter sau superior
https://api.openipapi.com/v1/fraud/{ip}
{
"ip": "185.220.101.45",
"fraud_score": 92,
"risk_level": "critical",
"signals": {
"is_vpn": true,
"is_proxy": false,
"is_tor": true,
"is_datacenter": true,
"is_known_attacker": true,
"high_risk_country": false
},
"recommendation": "block"
}
| Scor | Nivel de risc | Recomandare | Acțiune tipică |
|---|---|---|---|
| 0–30 | low | allow | Lasă cererea să treacă |
| 31–60 | medium | review | Înregistrează pentru revizuire manuală |
| 61–85 | high | challenge | Solicită CAPTCHA / 2FA / autentificare suplimentară |
| 86–100 | critical | block | Respinge și alertează |
Date de sondare a rețelei în timp real de la cele peste 60 de noduri active de probing: porturi TCP deschise, bannere de servicii, DNS invers, detalii complete ale certificatelor TLS (subiect, emitent, SAN-uri, valabilitate) și categorii de servicii detectate. Plan Pro sau superior
https://api.openipapi.com/v1/probe/{ip}
"stale": true.{
"ip": "185.220.101.45",
"reachable": true,
"last_probed": "2026-04-18T14:23:11+00:00",
"age_hours": 2.3,
"stale": false,
"refresh_queued": false,
"probe_count_24h": 14,
"probed_from_nodes": 8,
"open_ports": [
{ "port": 22, "service": "ssh", "banner": "SSH-2.0-OpenSSH_8.9p1" },
{ "port": 80, "service": "http", "banner": "nginx/1.24.0" },
{ "port": 443, "service": "https", "banner": null },
{ "port": 9001, "service": "tor-relay", "banner": null }
],
"reverse_dns": "tor-exit.f3netze.de",
"tls": {
"subject_cn": "*.f3netze.de",
"issuer": "Let's Encrypt",
"valid_from": "2026-02-10T00:00:00Z",
"valid_to": "2026-05-10T00:00:00Z",
"sans": ["f3netze.de", "*.f3netze.de"],
"fingerprint": "7e:4f:...:b2:e1"
},
"banners": {
"22": "SSH-2.0-OpenSSH_8.9p1",
"80": "nginx/1.24.0"
},
"detected_services": {
"is_tor_relay": true,
"is_ssh_open": true,
"is_web_server": true,
"is_vpn": false,
"is_proxy": false
}
}
22 (ssh), 80 / 8080 (http), 443 / 8443 (https), 1080 (socks5), 3128 / 8888 (http-proxy), 9001 / 9030 (tor-relay / tor-dir), 9050 / 9150 (tor-socks), 1194 (openvpn), 4500 (ipsec-nat-t), 51820 (wireguard).
Identifică dacă un IP aparține unui pool de proxy rezidențial cunoscut, VPN comercial sau interval de datacenter. Spre deosebire de semnalele generice is_proxy , acest endpoint atribuie IP-ul furnizorului specific (Bright Data, Oxylabs, NordVPN, etc.) — esențial pentru echipele de fraudă care trebuie să permită unii furnizori și să blocheze alții. Add-on Proxy Intel
https://api.openipapi.com/v1/proxy-attribution/{ip}
{
"ip": "2.56.16.42",
"detected": true,
"primary_provider": {
"provider": "unknown_vpn",
"display_name": "Unknown VPN",
"network_type": "vpn",
"confidence": 0.75
},
"networks": [
{
"provider": "unknown_vpn",
"network_type": "vpn",
"confidence": 0.75,
"source": "x4bnet-vpn",
"cidr": "2.56.16.0/22"
},
{
"provider": "unknown_datacenter",
"network_type": "datacenter",
"confidence": 0.75,
"source": "x4bnet-datacenter"
}
],
"recommendation": "treat_as_vpn"
}
residential — pool-uri de proxy rezidențial (Bright Data, Oxylabs, Smartproxy, IPRoyal, Hola, Honeygain, EarnApp, Peer2Profit, SOAX)vpn — furnizori VPN comerciali (NordVPN, ExpressVPN, Surfshark, Mullvad, ProtonVPN, PIA, IPVanish, CyberGhost)datacenter — furnizori de hosting utilizați frecvent pentru ieșire de proxy comercial (AWS, DigitalOcean, OVH, Hetzner, etc.)tor — noduri de ieșire / relay Tormobile — pool-uri de proxy ale operatorilor mobili| Recomandare | Semnificație |
|---|---|
| no_proxy_detected | IP-ul nu corespunde niciunui pool cunoscut — tratează ca trafic normal. |
| treat_as_commercial_proxy | IP-ul se află într-un pool de proxy rezidențial — probabil malițios pe site-uri fără scraping. |
| treat_as_vpn | IP-ul se află într-un interval VPN comercial — aplică politica VPN. |
| treat_as_datacenter | IP-ul provine dintr-un interval de datacenter — nu este un utilizator rezidențial real. |
| block_or_challenge | Ieșire Tor — blochează sau solicită autentificare puternică. |
Returnează statistici de utilizare pentru perioada de facturare curentă a contului tău.
https://api.openipapi.com/v1/account/usage
{
"plan": "Pro",
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"lookups_used": 184320,
"lookups_limit": 500000,
"lookups_remaining": 315680,
"reset_at": "2026-04-01T00:00:00Z"
}
Listează bazele de date MMDB disponibile pentru planul tău. Înlocuitori drop-in MaxMind .mmdb pentru utilizare offline / de margine — funcționează cu orice cititor MaxMind DB (PHP, Go, Python, Node.js, Rust, Java).
https://api.openipapi.com/v1/database/list
{
"plan": "Business",
"sources": [
{
"source": "country",
"filename": "geo-whois-asn-country.mmdb",
"size_bytes": 8225621,
"updated_at": "2026-04-18T02:00:00+00:00",
"etag": "\"fa2b851f9155838b\"",
"download_url": "https://api.openipapi.com/v1/database/download/country"
}
]
}
Transmite fișierul MMDB brut. Suportă ETag +
If-None-Match pentru GET-uri condiționale (304 Not Modified când fișierul nu s-a schimbat). Limită de rată: 10 descărcări per sursă pe zi.
https://api.openipapi.com/v1/database/download/{source}
| Sursă | Conținut | Licență | Plan necesar |
|---|---|---|---|
| country | Cod de țară + ASN | CC0 | Pro |
| asn | ASN + organizație | CC0 | Business |
| city-geolite2 | Oraș, regiune, lat/lon, fus orar (GeoLite2) | MaxMind GeoLite2 EULA | Business |
| city-dbip | Oraș (alternativă la GeoLite2) | DB-IP Lite | Enterprise |
# Download latest MMDB
$ curl -H "X-API-Key: YOUR_KEY" \
-o asn.mmdb \
https://api.openipapi.com/v1/database/download/asn
# Use with maxmind-db/reader
$ composer require maxmind-db/reader
<?php
use MaxMind\Db\Reader;
$reader = new Reader('asn.mmdb');
$record = $reader->get('8.8.8.8');
// ['autonomous_system_number' => 15169,
// 'autonomous_system_organization' => 'Google LLC']
Fiecare răspuns /v1/lookup include două câmpuri în blocul geo care indică dacă țara IP-ului este supusă sancțiunilor internaționale.
| Câmp | Descriere |
|---|---|
| geo.is_sanctioned | true dacă țara apare pe orice listă de sancțiuni monitorizată; false în caz contrar. |
| geo.sanction_lists | Array de identificatori ai programelor de sancțiuni aplicabile: OFAC, EU, UN, UK. Array gol [] când nu este sancționat. |
Liste de sancțiuni acoperite: OFAC (SUA), UE, Consiliul de Securitate ONU, OFSI Regatul Unit. Țările semnalate în prezent includ Iran, Coreea de Nord, Rusia, Belarus, Siria, Cuba, Venezuela, Sudan și altele. Lista este menținută și actualizată pe măsură ce programele se schimbă.
"geo": {
"country_code": "IR",
"country": "Iran",
...
"is_sanctioned": true,
"sanction_lists": ["OFAC", "EU", "UN"]
}
OpenIPApi efectuează verificare DNS invers dublu pentru a identifica crawlerele legitime. Rezultatul este disponibil în threat.bot_type la fiecare interogare.
| Câmp | Valori |
|---|---|
| threat.bot_type |
null (nu este un bot verificat) sau unul dintre: googlebot,
google_special_crawl,
bingbot,
applebot,
yandexbot,
duckduckbot,
facebookbot,
semrushbot,
ahrefsbot,
mj12bot
|
Metodă de verificare: (1) căutare PTR pe IP → hostname. (2) Hostname-ul trebuie să corespundă cu modelul de domeniu al botului (ex.: *.googlebot.com). (3) DNS direct pe hostname trebuie să rezolve înapoi la IP-ul original. Rezultatele sunt stocate în cache timp de 24 de ore.
"threat": {
"is_vpn": false,
"is_proxy": false,
"is_tor": false,
"threat_score": 0,
"bot_type": "googlebot"
}
Adaugă un parametru ?date=YYYY-MM-DD la orice interogare de IP unic pentru a recupera instantaneul de la acea dată.
https://api.openipapi.com/v1/lookup/{ip}?date=2026-01-15
$ curl "https://api.openipapi.com/v1/lookup/185.220.101.45?date=2026-01-15" \
-H "X-API-Key: oip_your_api_key_here"
{
"ip": "185.220.101.45",
"snapshot_date": "2026-01-15",
"is_historical": true,
"data": {
/* standard lookup response */
}
}
{
"error": "No historical snapshot available for this IP on 2026-01-15",
"code": "no_snapshot"
}
| Cod | Status HTTP | Descriere |
|---|---|---|
| invalid_api_key | 401 | Cheia API lipsește, este malformată sau a fost revocată. |
| limit_exceeded | 429 | Ai utilizat toate interogările din perioada de facturare curentă. |
| plan_required | 403 | Funcționalitatea solicitată nu este disponibilă în planul tău actual. |
| invalid_ip | 400 | Adresa IP furnizată nu este o adresă IPv4 sau IPv6 validă. |
| not_found | 404 | Nu s-au găsit date pentru resursa solicitată (ex.: ASN necunoscut). |
| no_snapshot | 404 | Nu există un instantaneu istoric pentru acest IP la data solicitată. |
| date_out_of_range | 400 | Data interogării istorice este mai veche de 365 de zile. |
| invalid_date | 400 | Parametrul de dată lipsește, este malformat sau se află în viitor. |
| plan_upgrade_required | 403 | Funcționalitatea solicitată necesită un plan de nivel superior. |
| rate_limited | 429 | Prea multe cereri într-o fereastră scurtă. Așteaptă și încearcă din nou. |
| internal_error | 500 | A apărut o eroare neașteptată de server. Contactează asistența dacă problema persistă. |
Pe lângă cotele lunare de interogare, cererile sunt limitate ca rată per cheie API folosind o fereastră glisantă. Când este depășit, API-ul returnează HTTP 429 cu un antet Retry-After .
| Plan | Cereri / minut | Interogări / lună |
|---|---|---|
| Free | 30 | 10,000 |
| Starter | 120 | 100,000 |
| Pro | 300 | 500,000 |
| Business | 600 | 2,000,000 |
| Enterprise | Custom | Unlimited |
Limite suplimentare: /v1/validate (neautentificat) este limitat la 60 cereri/min per IP apelant; /v1/me la 30 cereri/min. Descărcările MMDB sunt limitate la 10/zi per sursă per cont. Răspunsurile cu limită de rată includ Retry-After.
Webhook-urile îți permit să primești notificări HTTP POST în timp real când starea unui IP pe care îl urmărești se schimbă. Configurează-le în consolă → Webhooks, sau prin interfața panoului — nu este necesară o apelare API.
| Eveniment | Se declanșează când |
|---|---|
| vpn_detected | Un IP urmărit este detectat recent ca endpoint VPN. |
| tor_detected | Un IP urmărit apare pe o listă de noduri de ieșire Tor sau este sondat ca relay Tor. |
| proxy_detected | Un IP urmărit este detectat ca proxy deschis sau SOCKS. |
| high_threat | Scorul de amenințare depășește pragul configurat (50–95). |
POST https://your-endpoint.example.com/webhook
Content-Type: application/json
User-Agent: OpenIPApi-Webhook/1.0
X-OpenIPApi-Event: high_threat
X-OpenIPApi-Signature: sha256=8c7f1a...b2e
{
"event": "high_threat",
"delivered_at": "2026-04-18T12:34:56Z",
"webhook_id": 142,
"data": {
"ip": "185.220.101.45",
"threat_score": 92,
"previous_score": 45,
"is_tor": true,
"is_vpn": true
}
}
Fiecare webhook este semnat folosind HMAC-SHA256 al corpului JSON brut cu secretul tău de webhook. Semnătura este trimisă în antetul X-OpenIPApi-Signature ca sha256=<hex>.
Verifică întotdeauna înainte de a acționa pe baza payload-ului:
PHP
$body = file_get_contents('php://input');
$hdr = $_SERVER['HTTP_X_OPENIPAPI_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac(
'sha256', $body, $webhookSecret
);
if (!hash_equals($expected, $hdr)) {
http_response_code(401);
exit;
}
// Safe to process $body now
Node.js (Express)
const crypto = require('crypto');
app.post('/webhook',
express.raw({ type: 'application/json' }),
(req, res) => {
const hdr = req.headers['x-openipapi-signature'];
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(req.body).digest('hex');
if (expected !== hdr) return res.status(401).end();
// Process JSON.parse(req.body)
});
Endpoint-ul tău trebuie să răspundă în 10 secunde cu HTTP 2xx pentru a confirma primirea. Orice alt status (sau timeout) declanșează reîncercări cu backoff exponențial: 1 min, 5 min, 30 min, 2 h, 12 h. După ultima tentativă, webhook-ul este marcat ca eșuat și o alertă în panou este ridicată.
consolă → Webhooks păstrează ultimele 100 de tentative de livrare per cont, afișând tipul de eveniment, codul de status HTTP și corpul de răspuns returnat de endpoint-ul tău. Poți retrimite orice livrare anterioară pentru a re-trimite payload-ul semnat original, și folosi Debuggerul de Semnătură integrat pentru a verifica semnăturile HMAC-SHA256 pe partea clientului fără a-ți împărtăși secretul cu niciun server.
Livrările retrimise includ un antet suplimentar X-OpenIPApi-Replay: 1 pentru ca endpoint-ul tău să le poată distinge de evenimentele live.
$ curl https://api.openipapi.com/v1/lookup/8.8.8.8 \
-H "X-API-Key: oip_your_api_key_here"
$ curl -X POST https://api.openipapi.com/v1/lookup/batch \
-H "X-API-Key: oip_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"ips": ["8.8.8.8", "1.1.1.1", "185.220.101.45"]}'
$ curl https://api.openipapi.com/v1/me \
-H "X-API-Key: oip_your_api_key_here"
const response = await fetch('https://api.openipapi.com/v1/lookup/8.8.8.8', {
headers: {
'X-API-Key': 'oip_your_api_key_here'
}
});
const data = await response.json();
console.log(data.geo.country); // "United States"
console.log(data.threat.is_vpn); // false
console.log(data.threat.threat_score); // 0
const response = await fetch('https://api.openipapi.com/v1/lookup/batch', {
method: 'POST',
headers: {
'X-API-Key': 'oip_your_api_key_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({
ips: ['8.8.8.8', '1.1.1.1', '185.220.101.45']
})
});
const { results } = await response.json();
for (const info of results) {
console.log(info.ip, info.geo.city, info.threat.threat_score);
}
import requests
API_KEY = "oip_your_api_key_here"
headers = {"X-API-Key": API_KEY}
r = requests.get(
"https://api.openipapi.com/v1/lookup/8.8.8.8",
headers=headers
)
r.raise_for_status()
data = r.json()
print(data["geo"]["country"]) # United States
print(data["threat"]["is_vpn"]) # False
print(data["threat"]["threat_score"]) # 0
import requests
API_KEY = "oip_your_api_key_here"
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
payload = {
"ips": ["8.8.8.8", "1.1.1.1", "185.220.101.45"]
}
r = requests.post(
"https://api.openipapi.com/v1/lookup/batch",
json=payload,
headers=headers
)
r.raise_for_status()
for info in r.json()["results"]:
print(info["ip"], info["geo"]["city"], info["threat"]["threat_score"])
10.000 de interogări gratuite pe lună. Fără card de credit.
Obține cheia API gratuită