WPS (Wi-Fi Positioning System) API
loplat WPS API 는 기기가 스캔한 주변 Wi-Fi AP 정보를 받아 위치(위도·경도)와 정확도를 반환하는 와이파이 측위 API 입니다. GPS 가 잡히지 않는 실내에서도 휴대폰, 키즈폰, IoT 기기의 위치를 확인할 수 있습니다.
- 서비스 소개·무료 체험·요금 안내: https://api.loplat.com/wps
- API 키 발급·사용량 확인: loplat API 콘솔
시작하기
- loplat API 콘솔에 로그인합니다.
- WPS 를 시작하고 API 키를 발급받습니다. 무료 체험 조건은 WPS 소개 페이지를 참고하세요.
- 발급받은 키를
X-API-Key헤더에 넣어 아래 엔드포인트를 호출합니다.
주의
API 키는 발급 시 한 번만 표시됩니다. 서버 측에 안전하게 보관하고, 앱 소스나 공개 저장소에 넣지 마세요.
요청
POST https://api.loplat.com/v1/wps
Content-Type: application/json
X-API-Key: {발급받은 API 키}
헤더
| 헤더 | 필수 | 설명 |
|---|---|---|
X-API-Key | 필수 | 콘솔에서 발급받은 API 키 |
Content-Type | 필수 | application/json |
X-Request-Id | 선택 | 요청 식별자. 같은 값으로 재요청하면 처음 결과를 다시 돌려주며 사용량을 다시 차감하지 않습니다. 응답 헤더로 그대로 돌려줍니다. |
본문
wifiAPs: 스캔한 Wi-Fi AP 정보 배열 (1~50개) 필수
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
bssid | string | 필수 | AP 의 BSSID(MAC) 주소. 구분 기호는 :(콜론) |
rss | int | 필수 | AP 로부터 수신된 신호 세기(dBm) |
ssid | string | 선택 | AP 의 SSID |
frequency | int | 선택 | AP 의 주파수(MHz) |
{
"wifiAPs": [
{ "bssid": "00:11:22:33:44:55", "ssid": "starbucks", "rss": -65, "frequency": 2452 },
{ "bssid": "22:33:44:55:66:77", "ssid": "olleh", "rss": -75, "frequency": 5765 }
]
}
팁
측위 정확도를 높이려면 한 번의 스캔에서 수집된 AP 를 가능한 한 많이(최대 50개) 함께 보내세요.
응답
정상 (HTTP 200)
위치(위도·경도·층)와 정확도(오차 반경, m)를 반환합니다.
| 필드 | 설명 |
|---|---|
location.lat | 예상 위도 |
location.lng | 예상 경도 |
location.floor | 예상 층 |
accuracy | 예상 위치의 정확도(오차 반경, m) |
addr | 행정구역 주소(l1 시도, l2 시군구, l3 읍면동). 주소를 확인할 수 있을 때만 포함되므로 없을 수 있습니다. |
{
"location": {
"lat": 37.502341,
"lng": 127.055941,
"floor": 1
},
"accuracy": 80.0,
"addr": {
"l1": "서울특별시",
"l2": "강남구",
"l3": "대치동"
}
}
정상 응답에는 X-Quota-Remaining 헤더로 남은 요청량이 함께 전달됩니다.
오류
오류가 나면 HTTP 상태 코드와 함께 아래 형태의 JSON 을 반환합니다.
{
"error": {
"reason": "notFound",
"message": "location acquisition fails",
"code": 404
}
}
| HTTP | reason | 의미 |
|---|---|---|
| 401 | unauthorized | X-API-Key 가 없거나 유효하지 않음 |
| 403 | keyRevoked | 폐기된 API 키 |
| 404 | notFound | 보낸 Wi-Fi 정보로 위치를 확인하지 못함 |
| 422 | — | 요청 본문 형식 오류(필수 필드 누락, wifiAPs 가 비어 있거나 50개 초과 등). 본문은 detail 배열로 오류 위치를 알려줍니다. |
| 429 | rateLimited | 초당 요청 한도 초과. 잠시 후 다시 요청하세요. |
| 429 | quotaExhausted | 체험·요금제의 월 요청량 소진. 콘솔에서 요금제를 변경하세요. |
| 503 | unavailable | 일시적인 서버 장애 |
사용량 차감
- 정상 위치 반환(HTTP 200)만 사용량에서 차감합니다. 404·422·429 등 오류 응답은 차감하지 않습니다.
- 사용량·남은 요청량은 콘솔에서 확인할 수 있습니다.
- 요금제와 무료 체험 조건은 WPS 소개 페이지를 참고하세요.
예제
cURL
curl -X POST https://api.loplat.com/v1/wps \
-H "Content-Type: application/json" \
-H "X-API-Key: $LOPLAT_API_KEY" \
-d '{"wifiAPs": [{"bssid": "88:36:6c:13:21:10", "ssid": "loplat_5G", "rss": -61, "frequency": 5765}, {"bssid": "64:e5:99:42:b8:f8", "ssid": "loplat", "rss": -36, "frequency": 2452}]}'
Python
import os
import requests
response = requests.post(
"https://api.loplat.com/v1/wps",
headers={"X-API-Key": os.environ["LOPLAT_API_KEY"]},
json={
"wifiAPs": [
{"bssid": "88:36:6c:13:21:10", "ssid": "loplat_5G", "rss": -61, "frequency": 5765},
{"bssid": "64:e5:99:42:b8:f8", "ssid": "loplat", "rss": -36, "frequency": 2452},
]
},
timeout=10,
)
if response.status_code == 200:
print(response.json())
else:
print(response.status_code, response.text)
문의
기술 문의나 대량 사용(Enterprise) 계약은 dev@loplat.com 으로 연락해 주세요.