OpenIPApi

Документация API

Всё необходимое для интеграции OpenIPApi в ваше приложение. Базовый URL: https://api.openipapi.com (версионируется как /v1).

Сигналы, а не вердикты. IP-аналитика носит вероятностный характер. threat_score и флаги VPN/прокси/Tor — это входные данные для вашей логики принятия решений. Сочетайте их с сигналами аккаунта, платежей, устройства и поведения — никогда не используйте их в качестве единственного основания для блокировки. Подробнее см. в разделе Методология данных.

Аутентификация

Все запросы к API должны включать ваш API-ключ в заголовок X-API-Key . Найти API-ключ можно в консоли.

X-API-Key: oip_your_api_key_here
Храните API-ключ в тайне. Никогда не раскрывайте его в клиентском JavaScript или публичных репозиториях.

Базовый URL

Все запросы к API выполняются по следующему базовому URL через HTTPS:

https://api.openipapi.com

Машиночитаемая спецификация (OpenAPI 3.1): /openapi.yaml.

Формат ответа

Все ответы в формате JSON. Успешные ответы возвращают HTTP 200. Ответы об ошибках возвращают подходящий код статуса 4xx или 5xx с полем error .

{
  "error": "invalid_api_key",
  "message": "The provided API key is invalid or has been revoked.",
  "status": 401
}

GET /v1/lookup/{ip}

Получите данные о геолокации, сети и угрозах для одного IP-адреса.

GET https://api.openipapi.com/v1/lookup/{ip}

Параметры

Параметр Тип Описание
ip path IPv4 или IPv6 адрес для поиска.
fields query (optional) Список полей верхнего уровня для возврата через запятую: geo,network,threat,abuse.
date query (optional) Исторический запрос — вернуть снимок состояния этого IP на указанную дату (YYYY-MM-DD). До 365 дней назад. Требуется Pro+. Возвращает no_snapshot ошибку, если данные за эту дату недоступны.

Поля ответа

Поле Описание Тариф
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"
  }
}

POST /v1/lookup/batch

Получите данные для нескольких IP-адресов за один запрос. Максимальный размер пакета зависит от вашего тарифа.

POST https://api.openipapi.com/v1/lookup/batch
Пакетные запросы требуют тарифа Starter или выше. Аккаунты на бесплатном тарифе получат plan_required ошибку.

Ограничения размера пакета

Тариф Макс. IP за запрос
Starter 100
Pro 500
Business 1,000
Enterprise 5,000

Тело запроса

{
  "ips": [
    "185.220.101.45",
    "8.8.8.8",
    "1.1.1.1"
  ]
}

Ответ

Возвращает обёрнутый массив полных объектов запросов в том же порядке, что и запрос.

{
  "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
}

GET /v1/me

Возвращает геолокацию и данные об угрозах для IP-адреса, выполняющего запрос. Полезно для функций «Что такое мой IP?».

GET https://api.openipapi.com/v1/me

Ответ идентичен GET /v1/lookup/{ip} с предзаполненным IP вызывающего.

$ curl https://api.openipapi.com/v1/me \
     -H "X-API-Key: oip_your_api_key_here"

GET /v1/asn/{asn}

Получите подробную информацию об автономной системе. Требуется тариф Starter или выше.

GET https://api.openipapi.com/v1/asn/{asn}

Параметр asn принимает как 13335 так и 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
}

GET /v1/validate/{ip}

Проверьте IP-адрес и определите его тип. Не расходует квоту запросов.

GET https://api.openipapi.com/v1/validate/{ip}

Example response

{
  "ip": "185.220.101.45",
  "valid": true,
  "type": "IPv4",
  "private": false,
  "bogon": false
}

GET /v1/fraud/{ip}

Составная оценка мошенничества (0–100) с уровнем риска и применимой рекомендацией. Объединяет сигналы VPN, прокси, Tor, дата-центра и исторических злоупотреблений. Тариф Starter и выше

GET https://api.openipapi.com/v1/fraud/{ip}

Example response

{
  "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"
}

Уровни риска и рекомендации

Оценка Уровень риска Рекомендация Типичное действие
0–30lowallowПропустить запрос
31–60mediumreviewЗаписать для ручной проверки
61–85highchallengeТребовать CAPTCHA / 2FA / усиленную аутентификацию
86–100criticalblockОтклонить и уведомить

GET /v1/probe/{ip}

Данные сетевого зондирования в реальном времени с 60+ активных зондирующих узлов: открытые TCP-порты, баннеры служб, обратный DNS, полные данные TLS-сертификата (субъект, издатель, SANs, срок действия) и категории обнаруженных служб. Тариф Pro и выше

GET https://api.openipapi.com/v1/probe/{ip}

Как это работает

  • · Свежие данные (≤ 7 дней): возвращаются немедленно из кэша.
  • · Устаревшие данные (> 7 дней): возвращаются немедленно, и в фоновом режиме ставится задание на повторное зондирование. Ответ включает "stale": true.
  • · Никогда не зондировалось: зондирование ставится в очередь для немедленного сканирования. Первые результаты обычно появляются в течение 1–5 минут.
  • · Квота зондирования составляет 10% от ежемесячной квоты запросов. Частные / зарезервированные IP не могут быть зондированы.

Example response

{
  "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).

Сценарии использования

  • · Антифрод — обнаружение ботоферм с идентичными версиями SSH / отпечатками TLS
  • · Аналитика угроз — мониторинг C2-серверов на предмет изменений баннеров / сертификатов
  • · OSINT / bug bounty — быстрое перечисление служб на любом публичном IP
  • · Хостинг / операции ISP — поиск открытых прокси / выходных узлов Tor в вашей сети

GET /v1/proxy-attribution/{ip}

Определяет, принадлежит ли IP известному пулу жилых прокси, коммерческому VPN или диапазону дата-центра. В отличие от общих is_proxy флагов, этот эндпоинт привязывает IP к конкретному провайдеру (Bright Data, Oxylabs, NordVPN и т.д.) — критически важно для команд по борьбе с мошенничеством, которым нужно разрешать одних провайдеров и блокировать других. Дополнение Proxy Intel

GET https://api.openipapi.com/v1/proxy-attribution/{ip}

Пример ответа (IP в диапазоне VPN)

{
  "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 — пулы жилых прокси (Bright Data, Oxylabs, Smartproxy, IPRoyal, Hola, Honeygain, EarnApp, Peer2Profit, SOAX)
  • · vpn — коммерческие VPN-провайдеры (NordVPN, ExpressVPN, Surfshark, Mullvad, ProtonVPN, PIA, IPVanish, CyberGhost)
  • · datacenter — хостинг-провайдеры, часто используемые для коммерческого выхода прокси (AWS, DigitalOcean, OVH, Hetzner и т.д.)
  • · tor — выходные / ретрансляционные узлы Tor
  • · mobile — пулы прокси мобильных операторов

Рекомендации

Рекомендация Значение
no_proxy_detectedIP не совпал ни с одним известным пулом — считайте трафик обычным.
treat_as_commercial_proxyIP находится в пуле жилых прокси — вероятно, вредоносный на non-scraping сайтах.
treat_as_vpnIP находится в диапазоне коммерческого VPN — применяйте VPN-политику.
treat_as_datacenterIP из диапазона дата-центра — не реальный домашний пользователь.
block_or_challengeВыходной узел Tor — заблокируйте или требуйте строгую аутентификацию.

GET /v1/account/usage

Возвращает статистику использования за текущий расчётный период для вашего аккаунта.

GET https://api.openipapi.com/v1/account/usage

Example response

{
  "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"
}

GET /v1/database/list

Перечисляет базы данных MMDB, доступные для вашего тарифа. Замена MaxMind .mmdb для офлайн / граничного использования — работает с любым ридером MaxMind DB (PHP, Go, Python, Node.js, Rust, Java).

GET https://api.openipapi.com/v1/database/list

Example response

{
  "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"
    }
  ]
}

GET /v1/database/download/{source}

Стримит необработанный MMDB-файл. Поддерживает ETag + If-None-Match для условных GET-запросов (304 Not Modified, если файл не изменился). Ограничение частоты: 10 скачиваний из одного источника в день.

GET https://api.openipapi.com/v1/database/download/{source}

Доступные источники

Источник Содержимое Лицензия Необходимый тариф
countryКод страны + ASNCC0Pro
asnASN + организацияCC0Business
city-geolite2Город, регион, широта/долгота, часовой пояс (GeoLite2)MaxMind GeoLite2 EULABusiness
city-dbipГород (альтернатива GeoLite2)DB-IP LiteEnterprise

Пример: скачать + использовать в PHP

# 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']

Флаг санкций

Каждый /v1/lookup ответ включает два поля в блоке geo , которые указывают, подпадает ли страна IP под международные санкции.

Поле Описание
geo.is_sanctioned true если страна присутствует в каком-либо отслеживаемом списке санкций; false в противном случае.
geo.sanction_lists Массив идентификаторов санкционных программ: OFAC, EU, UN, UK. Пустой массив [] если санкции не применяются.

Охваченные санкционные списки: OFAC (США), ЕС, Совет Безопасности ООН, UK OFSI. В настоящее время помечены Иран, Северная Корея, Россия, Беларусь, Сирия, Куба, Венесуэла, Судан и другие. Список поддерживается и обновляется по мере изменения программ.

Пример ответа для санкционированной страны

"geo": {
  "country_code": "IR",
  "country": "Iran",
  ...
  "is_sanctioned": true,
  "sanction_lists": ["OFAC", "EU", "UN"]
}

Обнаружение ботов

OpenIPApi выполняет двойную обратную проверку DNS для идентификации легитимных краулеров. Результат доступен в threat.bot_type при каждом запросе.

Поле Значения
threat.bot_type null (не верифицированный бот) или одно из: googlebot, google_special_crawl, bingbot, applebot, yandexbot, duckduckbot, facebookbot, semrushbot, ahrefsbot, mj12bot

Метод верификации: (1) PTR-запрос по IP → имя хоста. (2) Имя хоста должно соответствовать паттерну домена бота (например, *.googlebot.com). (3) Прямой DNS по имени хоста должен разрешаться обратно в исходный IP. Результаты кэшируются на 24 часа.

Пример верифицированного Googlebot

"threat": {
  "is_vpn": false,
  "is_proxy": false,
  "is_tor": false,
  "threat_score": 0,
  "bot_type": "googlebot"
}

Исторический запрос

Добавьте параметр ?date=YYYY-MM-DD к любому единичному запросу IP, чтобы получить снимок состояния на эту дату.

Исторический запрос требует тарифа Pro или выше. Снимки доступны за 365 дней. Ежедневные снимки автоматически создаются для наиболее запрашиваемых IP.
GET 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"
}

Коды ошибок

Код HTTP-статус Описание
invalid_api_key 401 API-ключ отсутствует, имеет неверный формат или был отозван.
limit_exceeded 429 Вы использовали все запросы в текущем расчётном периоде.
plan_required 403 Запрошенная функция недоступна на вашем текущем тарифе.
invalid_ip 400 Указанный IP-адрес не является допустимым IPv4 или IPv6 адресом.
not_found 404 Данные для запрошенного ресурса не найдены (например, неизвестный ASN).
no_snapshot 404 Для этого IP на запрошенную дату исторический снимок отсутствует.
date_out_of_range 400 Дата исторического запроса превышает 365 дней назад.
invalid_date 400 Параметр даты отсутствует, имеет неверный формат или относится к будущему.
plan_upgrade_required 403 Запрошенная функция требует более высокого тарифа.
rate_limited 429 Слишком много запросов за короткое время. Сделайте паузу и повторите попытку.
internal_error 500 Произошла непредвиденная ошибка сервера. Обратитесь в поддержку, если проблема повторяется.

Ограничения частоты

Помимо ежемесячных квот запросов, запросы ограничены по частоте для каждого API-ключа с использованием скользящего окна. При превышении API возвращает HTTP 429 с заголовком Retry-After .

Тариф Запросов / минуту Запросов / месяц
Free 30 10,000
Starter 120 100,000
Pro 300 500,000
Business 600 2,000,000
Enterprise Custom Unlimited

Дополнительные ограничения: /v1/validate (без аутентификации) ограничено 60 запросами/мин с IP вызывающего; /v1/me — 30 запросами/мин. Скачивания MMDB ограничены 10 в день из одного источника на аккаунт. Ответы при превышении лимита включают Retry-After.

Webhooks

Webhooks позволяют получать уведомления в реальном времени по HTTP POST при изменении статуса наблюдаемого IP. Настройте их в консоли → Webhooks, или через интерфейс панели управления — без API-вызовов.

События

Событие Срабатывает когда
vpn_detectedНаблюдаемый IP впервые обнаружен как VPN-эндпоинт.
tor_detectedНаблюдаемый IP появился в списке выходных узлов Tor или зондирован как ретранслятор Tor.
proxy_detectedНаблюдаемый IP обнаружен как открытый или SOCKS-прокси.
high_threatОценка угрозы пересекает настроенный порог (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
  }
}

Проверка подписи

Каждый webhook подписывается с помощью HMAC-SHA256 от необработанного JSON-тела с вашим секретом webhook. Подпись отправляется в заголовке X-OpenIPApi-Signature в виде sha256=<hex>. Всегда проверяйте перед обработкой полезной нагрузки:

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)
  });

Политика повторов

Ваш эндпоинт должен ответить в течение 10 секунд с HTTP 2xx для подтверждения получения. Любой другой статус (или таймаут) запускает повторы с экспоненциальной задержкой: 1 мин, 5 мин, 30 мин, 2 ч, 12 ч. После последней попытки webhook помечается как неудачный и в панели управления появляется предупреждение.

История доставки и повтор

консоли → Webhooks хранит последние 100 попыток доставки на аккаунт с указанием типа события, HTTP-кода состояния и тела ответа вашего эндпоинта. Вы можете повторить любую предыдущую доставку для повторной отправки исходной подписанной нагрузки, и воспользоваться встроенным отладчиком подписей для проверки HMAC-SHA256 подписей на стороне клиента без передачи секрета серверу.

Повторные доставки включают дополнительный заголовок X-OpenIPApi-Replay: 1 , чтобы эндпоинт мог отличить их от живых событий.

Примеры кода — curl

Единичный запрос

$ 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"]}'

Ваш IP

$ curl https://api.openipapi.com/v1/me \
     -H "X-API-Key: oip_your_api_key_here"

Примеры кода — JavaScript

Единичный запрос (fetch)

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);
}

Примеры кода — Python

Единичный запрос (requests)

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 бесплатных запросов в месяц. Кредитная карта не требуется.

Получить бесплатный API-ключ