認証
サーバーサイドのリクエストの Authorization ヘッダーで Bearer キーを送ります。
Authorization: Bearer 17nas_live_xxxxxxxxx
キーをブラウザのスクリプト、アプリ、ミニプログラムのパッケージに入れないでください。いずれも逆コンパイルされます。フロントで必要な場合は、自分のサーバーにリクエストさせ、サーバーが代理で呼び出します。コンソールで IP/CIDR 許可リストを設定すれば、送信元をさらに絞れます。
GET/v1/ip
ipapi.17nas.com
この HTTP 接続で実際に使われた IP とプロトコルを返します。IPv4 で来れば IPv4、IPv6 で来れば IPv6 が返り、指定は不要です。
| パラメータ | 位置 | 説明 |
Authorization | Header | 必須。Bearer <あなたの API キー> |
format | Query | 任意。json(既定)または text。text は IP のみを返すため、シェルでそのまま使えます |
# JSON(既定)
curl https://ipapi.17nas.com/v1/ip \
-H "Authorization: Bearer 17nas_live_xxx"
# IP のみのプレーンテキスト。シェル変数にそのまま入れられる
curl "https://ipapi.17nas.com/v1/ip?format=text" \
-H "Authorization: Bearer 17nas_live_xxx"
# curl 自身のオプションで IPv4 / IPv6 を強制する
curl -4 https://ipapi.17nas.com/v1/ip -H "Authorization: Bearer 17nas_live_xxx"
curl -6 https://ipapi.17nas.com/v1/ip -H "Authorization: Bearer 17nas_live_xxx"
レスポンスフィールド
200 OK
{
"ip": "203.0.113.10",
"protocol": "IPv4",
"country": { "code": "CN" },
"region": "Guangdong",
"city": "Shenzhen",
"timezone": "Asia/Shanghai",
"asn": { "number": 4134, "organization": "CHINANET" },
"edge": { "colo": "HKG" },
"request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"generated_at": "2026-07-26T09:00:00.000Z"
}
| フィールド | 型 | 説明 |
ip | string | この接続のグローバル IP |
protocol | string | IPv4 または IPv6 |
country.code | string | ISO 3166-1 の 2 文字国コード。取得できない場合は null |
region / city | string | 州・省と都市(英語)。精度はエッジ側のデータ次第で、null になることもあります |
timezone | string | IANA タイムゾーン名(例:Asia/Shanghai) |
asn.number | number | 自律システム番号。取得できない場合は 0 |
asn.organization | string | 通信事業者名。null の場合があります |
edge.colo | string | このリクエストを処理したエッジノードの 3 文字コード |
request_id | string | このリクエストの一意な ID。問い合わせ時に添えてください |
位置情報フィールドはエッジノードの GeoIP データに依存しており、モバイル回線、衛星回線、企業 NAT の出口、一部のプロキシでは不正確または空になることがあります。事実ではなく参考値として扱ってください。地域ブロックの強制判定には使わないでください。
クォータ関連ヘッダー
成功レスポンスには必ず現在のクォータ状況が付くため、別途問い合わせる必要はありません。
| レスポンスヘッダー | 説明 |
X-RateLimit-Limit | 1 秒あたりの許可リクエスト数(QPS) |
X-RateLimit-Remaining | 現在の 1 秒間に残っている回数 |
X-RateLimit-Reset | レート制限ウィンドウがリセットされる Unix タイムスタンプ |
X-Quota-Limit | 当期の総クォータ |
X-Quota-Used | 当期の使用済み |
X-Quota-Remaining | 当期の残り |
X-Quota-Reset | 当期クォータのリセット時刻 |
X-Request-Id | このリクエストの ID。問い合わせ時に添えてください |
コード側で X-Quota-Remaining を監視し、10% を切ったら通知しましょう。呼び出しが失敗してから気づくのでは遅すぎます。
エラーステータス
401 キーが無効、失効済み、または形式が不正
403 送信元 IP が許可リストにない
429 QPS 制限を超過、または当期のクォータを使い切った
503 一時的に利用できません。時間をおいて再試行
{
"error": {
"code": "quota_exhausted",
"message": "Monthly quota exhausted",
"request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"docs_url": "https://17nas.com/ip-api.php#documentation",
"upgrade_url": "https://17nas.com/ip-api.php?source=api-error&placement=quota-exhausted#pricing",
"reset_at": "2026-08-01T00:00:00+08:00"
}
}
429 には 2 つの原因があり、ヘッダーで区別できます。X-RateLimit-Remaining が 0 なら瞬間的なレート制限で、1 秒待てば再開できます。X-Quota-Remaining が 0 なら当期のクォータ切れで、reset_at を待つか、追加購入かアップグレードが必要です。
リトライとフォールバック
これはネットワークリクエストなので、必ず失敗するときがあります。実務的な指針をいくつか:
- タイムアウトは 5 秒以内に。メイン処理を巻き込ませない
503 やタイムアウトは指数バックオフ(1s・2s・4s)で最大 3 回までリトライ
401 / 403 はリトライしない。設定の問題であり、再試行はクォータの無駄
- クォータ切れによる
429 はリトライしても無意味。そのままフォールバック処理へ
- 非クリティカルな処理(ログ記録など)は失敗したらスキップ。位置情報が取れないくらいでユーザーの正常な操作を止めない
- 結果は数分ローカルにキャッシュしてよい。同じサーバーの出口 IP が秒単位で変わることはまずない