身份认证
在服务端请求的 Authorization 头中发送 Bearer 密钥。
Authorization: Bearer 17nas_live_xxxxxxxxx
不要把密钥放进浏览器脚本、APP 或小程序安装包——这些都能被反编译出来。前端需要用时,让前端请求你自己的服务器,由服务器代为调用。可以在控制台配置 IP/CIDR 白名单进一步限制来源。
GET/v1/ip
ipapi.17nas.com
返回本次 HTTP 连接实际使用的 IP 和协议。请求走 IPv4 就返回 IPv4,走 IPv6 就返回 IPv6,不需要额外指定。
| 参数 | 位置 | 说明 |
Authorization | Header | 必填。Bearer <你的 API Key> |
format | Query | 可选。json(默认)或 text;text 只返回纯 IP,适合 shell 直接取值 |
# JSON(默认)
curl https://ipapi.17nas.com/v1/ip \
-H "Authorization: Bearer 17nas_live_xxx"
# 只要 IP 纯文本,适合 shell 脚本直接取值
curl "https://ipapi.17nas.com/v1/ip?format=text" \
-H "Authorization: Bearer 17nas_live_xxx"
# 强制走 IPv4 / IPv6 查询,用 curl 自己的参数控制
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 两位国家代码,取不到为 null |
region / city | string | 省/州与城市,英文;精度取决于边缘库,可能为 null |
timezone | string | IANA 时区名,如 Asia/Shanghai |
asn.number | number | 自治域号;取不到为 0 |
asn.organization | string | 运营商名称,可能为 null |
edge.colo | string | 处理本次请求的边缘节点三字码 |
request_id | string | 本次请求的唯一 ID,反馈问题时带上它 |
地理位置字段依赖边缘节点的 GeoIP 数据,移动网络、卫星链路、企业 NAT 出口和部分代理下可能不准或为空。请把这些字段当参考而不是事实,不要用它做强制性的地域拦截。
额度响应头
每次成功响应都会带上当前额度状态,不需要额外调接口去查。
| 响应头 | 说明 |
X-RateLimit-Limit | 每秒允许的请求数(QPS) |
X-RateLimit-Remaining | 当前这一秒还剩多少次 |
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 有两种成因,靠响应头区分:X-RateLimit-Remaining 为 0 是瞬时限速,等一秒就能继续;X-Quota-Remaining 为 0 是本期额度用尽,要等到 reset_at 或者加量/升级。
重试与降级
这是一个网络请求,它一定会有失败的时候。几条实践建议:
- 设置 5 秒以内的超时,不要让它拖垮你的主流程
- 遇到
503 或超时可以重试,用指数退避(1s、2s、4s),最多 3 次
- 遇到
401 / 403 不要重试,那是配置问题,重试只会浪费额度
- 遇到
429 且是额度耗尽,重试没有意义,直接走降级逻辑
- 非关键路径(比如日志记录)失败就跳过,别因为拿不到 IP 归属地把用户的正常操作挡下来
- 可以在本地缓存几分钟——同一台服务器的出口 IP 通常不会秒级变化