OpenIPApi をアプリケーションに統合するために必要なすべての情報。ベース URL:https://api.openipapi.com(/v1 でバージョン管理)。
threat_score と VPN/プロキシ/Tor フラグは、お客様の判断ロジックへの入力です。アカウント、決済、デバイス、行動シグナルと組み合わせてください — ブロックの唯一の根拠として使用しないでください。詳細はデータ手法をご覧ください。
すべての API リクエストには、 X-API-Key リクエストヘッダーに API キーを含める必要があります。API キーは コンソール.
X-API-Key: oip_your_api_key_here
すべての 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
}
単一の IP アドレスのジオロケーション、ネットワーク、脅威データを検索します。
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"
}
}
1 回のリクエストで複数の IP アドレスを検索します。バッチサイズの制限はプランによって異なります。
https://api.openipapi.com/v1/lookup/batch
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
}
リクエストを行っている IP アドレスのジオロケーションと脅威データを返します。「自分の IP は何か」機能に便利です。
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"
自律システム番号の詳細情報を取得します。Starter プラン以上が必要です。
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
}
IP アドレスを検証してタイプを判定します。ルックアップクォータを消費しません。
https://api.openipapi.com/v1/validate/{ip}
{
"ip": "185.220.101.45",
"valid": true,
"type": "IPv4",
"private": false,
"bogon": false
}
リスクレベルと実用的な推奨アクションを含む複合不正スコア(0〜100)。VPN・プロキシ・Tor・データセンター・過去の不正利用シグナルを統合します。 Starter プラン以上
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"
}
| スコア | リスクレベル | 推奨アクション | 典型的なアクション |
|---|---|---|---|
| 0–30 | low | allow | リクエストを通過させる |
| 31–60 | medium | review | 手動レビューのためにログに記録する |
| 61–85 | high | challenge | CAPTCHA/2FA/ステップアップ認証を要求する |
| 86–100 | critical | block | 拒否してアラートを送信する |
60 以上のアクティブプローブノードからのリアルタイムネットワークプローブデータ:開放 TCP ポート、サービスバナー、リバース DNS、TLS 証明書の完全な詳細(サブジェクト、発行者、SAN、有効期限)、検出されたサービスカテゴリ。 Pro プラン以上
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).
IP が既知のレジデンシャルプロキシプール、商用 VPN、またはデータセンターレンジに属しているかどうかを識別します。一般的な is_proxy フラグとは異なり、このエンドポイントは IP を特定のプロバイダー(Bright Data、Oxylabs、NordVPN など)に帰属させます。特定のプロバイダーを許可・ブロックする必要がある不正対策チームにとって重要です。 プロキシインテルアドオン
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 — レジデンシャルプロキシプール(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_challenge | Tor 出口 — ブロックするか強力な認証を要求してください。 |
アカウントの現在の請求期間の使用統計を返します。
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"
}
プランで利用可能な MMDB データベースをリスト表示します。MaxMind .mmdb のオフライン/エッジ用ドロップイン代替品 — 任意の 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"
}
]
}
生の MMDB ファイルをストリーミングします。 ETag +
If-None-Match 条件付き GET(ファイルが変更されていない場合は 304 Not Modified)をサポートします。レート制限:1 ソースあたり 1 日 10 ダウンロード。
https://api.openipapi.com/v1/database/download/{source}
| ソース | 内容 | ライセンス | 必要なプラン |
|---|---|---|---|
| country | 国コード+ASN | CC0 | Pro |
| asn | ASN+組織 | CC0 | Business |
| city-geolite2 | 都市・地域・緯度/経度・タイムゾーン(GeoLite2) | MaxMind GeoLite2 EULA | Business |
| city-dbip | 都市(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']
すべての /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 時間キャッシュされます。
"threat": {
"is_vpn": false,
"is_proxy": false,
"is_tor": false,
"threat_score": 0,
"bot_type": "googlebot"
}
任意の単一 IP ルックアップに ?date=YYYY-MM-DD パラメータを追加して、その日付のスナップショットを取得します。
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 (未認証)は呼び出し元 IP ごとに 60 req/分に制限; /v1/me 30 req/分に制限。MMDB ダウンロードはアカウントごとにソースあたり 1 日 10 件に制限。レート制限レスポンスには Retry-After.
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 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"])