인증
서버 사이드 요청의 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 두 자리 국가 코드. 알 수 없으면 null |
region / city | string | 주·성과 도시(영문). 정확도는 엣지 DB에 따라 다르며 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 | 초당 허용 요청 수 (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는 원인이 두 가지이며 헤더로 구분합니다. X-RateLimit-Remaining이 0이면 순간적인 속도 제한이라 1초만 기다리면 됩니다. X-Quota-Remaining이 0이면 이번 기간 사용량 소진이므로 reset_at을 기다리거나 추가 구매·업그레이드가 필요합니다.
재시도와 폴백
네트워크 호출이므로 언젠가는 반드시 실패합니다. 실무적인 지침 몇 가지:
- 타임아웃을 5초 이내로 두어 주 흐름을 끌어내리지 않게 하세요
503이나 타임아웃은 지수 백오프(1s, 2s, 4s)로 최대 3회까지 재시도
401 / 403은 재시도하지 마세요. 설정 문제이며 재시도는 사용량만 낭비합니다
- 사용량 소진으로 인한
429는 재시도해도 소용없습니다. 바로 폴백 로직으로 가세요
- 비핵심 경로(예: 로그 기록)에서는 실패하면 그냥 건너뛰세요. 위치 조회가 안 됐다고 사용자의 정상 동작을 막지 마세요
- 결과를 몇 분간 로컬에 캐시해도 됩니다 — 같은 서버의 출구 IP가 초 단위로 바뀌지는 않습니다