OpenIPApi

API ドキュメント

OpenIPApi をアプリケーションに統合するために必要なすべての情報。ベース URL:https://api.openipapi.com(/v1 でバージョン管理)。

シグナルであり、判定ではありません。 IP インテリジェンスは確率的です。threat_score と VPN/プロキシ/Tor フラグは、お客様の判断ロジックへの入力です。アカウント、決済、デバイス、行動シグナルと組み合わせてください — ブロックの唯一の根拠として使用しないでください。詳細はデータ手法をご覧ください。

認証

すべての API リクエストには、 X-API-Key リクエストヘッダーに API キーを含める必要があります。API キーは コンソール.

X-API-Key: oip_your_api_key_here
API キーは秘密にしてください。クライアントサイドの JavaScript やパブリックリポジトリには公開しないでください。

ベース URL

すべての API リクエストは HTTPS で以下のベース URL に送信されます:

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

1 回のリクエストで複数の 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 パラメータは 13335AS13335 形式の両方を受け付けます。

$ 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–85highchallengeCAPTCHA/2FA/ステップアップ認証を要求する
86–100criticalblock拒否してアラートを送信する

GET /v1/probe/{ip}

60 以上のアクティブプローブノードからのリアルタイムネットワークプローブデータ:開放 TCP ポート、サービスバナー、リバース DNS、TLS 証明書の完全な詳細(サブジェクト、発行者、SAN、有効期限)、検出されたサービスカテゴリ。 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/バグバウンティ — 任意のパブリック IP のサービスを素早く列挙
  • · ホスティング/ISP オペレーション — ネットワーク内のオープンプロキシ/Tor 出口を検出

GET /v1/proxy-attribution/{ip}

IP が既知のレジデンシャルプロキシプール、商用 VPN、またはデータセンターレンジに属しているかどうかを識別します。一般的な is_proxy フラグとは異なり、このエンドポイントは IP を特定のプロバイダー(Bright Data、Oxylabs、NordVPN など)に帰属させます。特定のプロバイダーを許可・ブロックする必要がある不正対策チームにとって重要です。 プロキシインテルアドオン

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

レスポンス例(VPN レンジの 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 — レジデンシャルプロキシプール(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_detected既知のプールに一致しない IP — 通常のトラフィックとして扱ってください。
treat_as_commercial_proxyレジデンシャルプロキシプール内の IP — スクレイピング以外のサイトでは悪意がある可能性があります。
treat_as_vpn商用 VPN レンジの IP — VPN ポリシーを適用してください。
treat_as_datacenterデータセンターレンジの IP — 実際の住宅用ユーザーではありません。
block_or_challengeTor 出口 — ブロックするか強力な認証を要求してください。

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)をサポートします。レート制限:1 ソースあたり 1 日 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 ブロック内に 2 つのフィールドが含まれており、IP の国が国際制裁の対象かどうかを示します。

フィールド 説明
geo.is_sanctioned true 国が監視対象の制裁リストに掲載されている場合; false それ以外の場合。
geo.sanction_lists 適用される制裁プログラム識別子の配列: OFAC, EU, UN, UK. 空の配列 [] 制裁対象でない場合。

対象制裁リスト:OFAC(米国)、EU、国連安全保障理事会、英国 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) IP の PTR ルックアップ → ホスト名。(2) ホスト名はボットのドメインパターンと一致する必要があります(例: *.googlebot.com). (3) ホスト名の正引き DNS が元の IP に解決される必要があります。結果は 24 時間キャッシュされます。

検証済み Googlebot の例

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

履歴ルックアップ

任意の単一 IP ルックアップに ?date=YYYY-MM-DD パラメータを追加して、その日付のスナップショットを取得します。

履歴ルックアップには 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 429Retry-After ヘッダーを返します。

プラン リクエスト/分 ルックアップ/月
Free 30 10,000
Starter 120 100,000
Pro 300 500,000
Business 600 2,000,000
Enterprise Custom Unlimited

追加制限: /v1/validate (未認証)は呼び出し元 IP ごとに 60 req/分に制限; /v1/me 30 req/分に制限。MMDB ダウンロードはアカウントごとにソースあたり 1 日 10 件に制限。レート制限レスポンスには Retry-After.

Webhook

Webhook を使用すると、監視している IP のステータスが変化したときにリアルタイムの HTTP POST 通知を受け取ることができます。 の コンソール → Webhook, またはダッシュボード UI で設定できます。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 は、Webhook シークレットを使用した生の JSON ボディの HMAC-SHA256 で署名されています。署名は 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 は失敗としてマークされ、ダッシュボードアラートが発生します。

配信履歴とリプレイ

コンソール → Webhook はアカウントごとに最新 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 キーを取得する