# 주소록 중복·권역 정비



여러 표기로 흩어진 주소 목록을 같은 지점끼리 묶어 실제 지점 수·중복률·시군구·읍면동 분포를 계산하고, 찾지 못한 주소에는 대안을 붙입니다. 고객·매장 주소록을 지점 기준으로 정리할 때 씁니다.



인증: Authorization: Bearer $APICK_API_KEY

본문 있는 REST 요청: multipart/form-data. GET 본문 및 MCP JSON-RPC 규격은 해당 명세를 따릅니다.

인증키는 서버에 보관하세요. 모든 예제는 정적 자료입니다.



## POST /rest/geo_address_cleanup 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.summary` (object): 공고의 짧은 요약입니다. 본문 전체는 description_html에서 확인하세요.

- `data.summary.requested` (integer): 입력한 주소 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.unique` (integer): 같은 문자열을 합친 뒤 확인한 주소 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.matched` (integer): 찾은 고유 주소 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.unmatched` (integer): 찾지 못한 고유 주소 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.sites` (integer): 같은 지점끼리 묶은 실제 지점 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.duplicateGroups` (integer): 입력이 2건 이상인 지점 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.mergedInputs` (integer): 같은 지점으로 합쳐진 입력 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.duplicateRatePct` (integer): 찾은 입력 중 합쳐진 비율(%)입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.districts` (integer): 시군구·읍면동 묶음 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.summary.partial` (boolean): 시간 초과로 일부를 확인하지 못했으면 true입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `data.summary.elapsedMs` (integer): 'elapsedMs' 수치 값입니다. 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.districts` (array): 'districts' 목록입니다. 각 항목의 구성은 서비스에 따라 다르며, 값이 없으면 빈 배열입니다.

- `data.districts[].sigungu` (string): 시군구입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.districts[].eupmyeondong` (string): 읍면동입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.districts[].adminDong` (string): 'adminDong' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.districts[].sites` (integer): 이 권역의 지점 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.districts[].members` (integer): 이 권역의 입력 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.sites` (array): 'sites' 목록입니다. 각 항목의 구성은 서비스에 따라 다르며, 값이 없으면 빈 배열입니다.

- `data.sites[].siteId` (integer): 1부터 붙인 지점 번호입니다. 입력이 많은 지점부터 정렬됩니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.sites[].address` (string): 대표 주소입니다. 도로명 주소가 있는 입력을 우선합니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.sites[].roadAddress` (string): 대표 도로명 주소입니다. 없으면 빈 문자열입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.sites[].jibunAddress` (string): 대표 지번 주소입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.sites[].sigungu` (string): 'sigungu' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].eupmyeondong` (string): 'eupmyeondong' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].adminDong` (string): 'adminDong' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].codes` (object): 대표 주소의 코드입니다. 항목 구성은 주소 표준화 API의 codes와 같습니다.

- `data.sites[].codes.pnu` (string): 'pnu' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].codes.bjdongCode` (string): 'bjdongCode' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].codes.lawdCd` (string): 'lawdCd' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].codes.adminDongCode` (string): 'adminDongCode' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].codes.sidoCode` (string): 'sidoCode' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].codes.sigunguCode` (string): 'sigunguCode' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].point` (object): 대표 주소의 좌표입니다. 하위 필드에 코드·이름·상태 같은 세부 값이 들어 있으며, 자료가 없으면 빈 객체이거나 생략됩니다.

- `data.sites[].point.x` (number): 'x' 수치 값입니다. 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.sites[].point.y` (number): 'y' 수치 값입니다. 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.sites[].point.crs` (string): 'crs' 문자열 값입니다. 값이 없으면 빈 문자열이거나 필드가 생략됩니다.

- `data.sites[].memberCount` (integer): 이 지점으로 묶인 입력 수입니다. 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.sites[].variants` (array): 이 지점을 가리킨 서로 다른 표기입니다. 각 항목의 구성은 서비스에 따라 다르며, 값이 없으면 빈 배열입니다. 항목 수와 순서를 함께 확인하세요.

- `data.sites[].indexes` (array): 입력 목록에서의 위치(0부터)입니다. 각 항목의 구성은 서비스에 따라 다르며, 값이 없으면 빈 배열입니다. 항목 수와 순서를 함께 확인하세요.

- `data.unmatched` (array): 'unmatched' 목록입니다. 각 항목의 구성은 서비스에 따라 다르며, 값이 없으면 빈 배열입니다.

- `data.unmatched[].input` (string): 찾지 못한 입력입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.unmatched[].error` (string): 찾지 못한 이유입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.unmatched[].suggestions` (array): 대안 후보(최대 3건)입니다. 후보가 없으면 빈 배열입니다. 각 항목의 구성은 서비스에 따라 다르며, 값이 없으면 빈 배열입니다. 항목 수와 순서를 함께 확인하세요.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

## API 요청: POST /rest/geo_address_cleanup



### 입력

- `addresses` (array, 필수): 정리할 주소 목록 (최대 50건). 줄바꿈 문자열 또는 JSON 배열 배열로 보내며, 항목을 하나 이상 넣어야 합니다.

- `addrType` (string, 선택): 주소 유형. 기본 auto 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다. 가능한 값은 3가지입니다. auto = 서버·모델이 상황에 맞춰 자동으로 정하는 값입니다. 별도 지정이 필요 없습니다. parcel = 지번 주소를 기준으로 조회하는 값입니다. road = 도로명 주소를 기준으로 조회하는 값입니다. 허용값: auto, parcel, road

- `includeSuggestions` (boolean, 선택): 찾지 못한 주소의 대안 후보 포함 여부 (기본 true, 최대 10건 조회) true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "summary": {
          "type": "object",
          "properties": {
            "requested": {
              "type": "integer",
              "description": "입력한 주소 수입니다."
            },
            "unique": {
              "type": "integer",
              "description": "같은 문자열을 합친 뒤 확인한 주소 수입니다."
            },
            "matched": {
              "type": "integer",
              "description": "찾은 고유 주소 수입니다."
            },
            "unmatched": {
              "type": "integer",
              "description": "찾지 못한 고유 주소 수입니다."
            },
            "sites": {
              "type": "integer",
              "description": "같은 지점끼리 묶은 실제 지점 수입니다."
            },
            "duplicateGroups": {
              "type": "integer",
              "description": "입력이 2건 이상인 지점 수입니다."
            },
            "mergedInputs": {
              "type": "integer",
              "description": "같은 지점으로 합쳐진 입력 수입니다."
            },
            "duplicateRatePct": {
              "type": "integer",
              "description": "찾은 입력 중 합쳐진 비율(%)입니다."
            },
            "districts": {
              "type": "integer",
              "description": "시군구·읍면동 묶음 수입니다."
            },
            "partial": {
              "type": "boolean",
              "description": "시간 초과로 일부를 확인하지 못했으면 true입니다."
            },
            "elapsedMs": {
              "type": "integer"
            }
          }
        },
        "districts": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "sigungu": {
                "type": "string",
                "description": "시군구입니다."
              },
              "eupmyeondong": {
                "type": "string",
                "description": "읍면동입니다."
              },
              "adminDong": {
                "type": "string"
              },
              "sites": {
                "type": "integer",
                "description": "이 권역의 지점 수입니다."
              },
              "members": {
                "type": "integer",
                "description": "이 권역의 입력 수입니다."
              }
            }
          }
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "siteId": {
                "type": "integer",
                "description": "1부터 붙인 지점 번호입니다. 입력이 많은 지점부터 정렬됩니다."
              },
              "address": {
                "type": "string",
                "description": "대표 주소입니다. 도로명 주소가 있는 입력을 우선합니다."
              },
              "roadAddress": {
                "type": "string",
                "description": "대표 도로명 주소입니다. 없으면 빈 문자열입니다."
              },
              "jibunAddress": {
                "type": "string",
                "description": "대표 지번 주소입니다."
              },
              "sigungu": {
                "type": "string"
              },
              "eupmyeondong": {
                "type": "string"
              },
              "adminDong": {
                "type": "string"
              },
              "codes": {
                "type": "object",
                "properties": {
                  "pnu": {
                    "type": "string"
                  },
                  "bjdongCode": {
                    "type": "string"
                  },
                  "lawdCd": {
                    "type": "string"
                  },
                  "adminDongCode": {
                    "type": "string"
                  },
                  "sidoCode": {
                    "type": "string"
                  },
                  "sigunguCode": {
                    "type": "string"
                  }
                },
                "description": "대표 주소의 코드입니다. 항목 구성은 주소 표준화 API의 codes와 같습니다."
              },
              "point": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  },
                  "crs": {
                    "type": "string"
                  }
                },
                "description": "대표 주소의 좌표입니다."
              },
              "memberCount": {
                "type": "integer",
                "description": "이 지점으로 묶인 입력 수입니다."
              },
              "variants": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "이 지점을 가리킨 서로 다른 표기입니다."
              },
              "indexes": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "입력 목록에서의 위치(0부터)입니다."
              }
            }
          }
        },
        "unmatched": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "input": {
                "type": "string",
                "description": "찾지 못한 입력입니다."
              },
              "error": {
                "type": "string",
                "description": "찾지 못한 이유입니다."
              },
              "suggestions": {
                "type": "array",
                "items": {},
                "description": "대안 후보(최대 3건)입니다. 후보가 없으면 빈 배열입니다."
              }
            }
          }
        }
      }
    },
    "api": {
      "type": "object",
      "properties": {
        "cost": {
          "type": "integer",
          "description": "차감된 포인트입니다. 실패한 응답은 0입니다."
        },
        "success": {
          "type": "boolean"
        },
        "ms": {
          "type": "integer",
          "description": "처리 시간(밀리초)입니다."
        }
      }
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "summary": {
      "requested": 3,
      "unique": 3,
      "matched": 2,
      "unmatched": 1,
      "sites": 1,
      "duplicateGroups": 1,
      "mergedInputs": 1,
      "duplicateRatePct": 50,
      "districts": 1,
      "partial": false,
      "elapsedMs": 320
    },
    "districts": [
      {
        "sigungu": "서울특별시 강남구",
        "eupmyeondong": "역삼동",
        "adminDong": "역삼1동",
        "sites": 1,
        "members": 2
      }
    ],
    "sites": [
      {
        "siteId": 1,
        "address": "서울특별시 강남구 역삼동 808",
        "roadAddress": "",
        "jibunAddress": "서울특별시 강남구 역삼동 808",
        "sigungu": "서울특별시 강남구",
        "eupmyeondong": "역삼동",
        "adminDong": "역삼1동",
        "codes": {
          "pnu": "1168010100108080000",
          "bjdongCode": "1168010100",
          "lawdCd": "11680",
          "adminDongCode": "1168064000",
          "sidoCode": "11",
          "sigunguCode": "11680"
        },
        "point": {
          "x": 127.0250516,
          "y": 37.5043681,
          "crs": "EPSG:4326"
        },
        "memberCount": 2,
        "variants": [
          "서울특별시 강남구 역삼동 808",
          "서울 강남구 역삼동 808"
        ],
        "indexes": [
          0,
          1
        ]
      }
    ],
    "unmatched": [
      {
        "input": "서울 강남구 없는동 999",
        "error": "주소를 찾지 못했습니다.",
        "suggestions": []
      }
    ]
  },
  "api": {
    "cost": 40,
    "success": true,
    "ms": 330
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/geo_address_cleanup' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'addresses[0]=서울특별시 강남구 역삼동 808' \
  --form-string 'addresses[1]=서울 강남구 역삼동 808' \
  --form-string 'addresses[2]=서울 강남구 없는동 999'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("addresses[0]", "서울특별시 강남구 역삼동 808");
form.append("addresses[1]", "서울 강남구 역삼동 808");
form.append("addresses[2]", "서울 강남구 없는동 999");
const response = await fetch("https://apick.app/rest/geo_address_cleanup", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("addresses[0]", (None, "서울특별시 강남구 역삼동 808")),
    ("addresses[1]", (None, "서울 강남구 역삼동 808")),
    ("addresses[2]", (None, "서울 강남구 없는동 999")),
]
response = requests.request("POST", "https://apick.app/rest/geo_address_cleanup",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'addresses[0]' => '서울특별시 강남구 역삼동 808',
    'addresses[1]' => '서울 강남구 역삼동 808',
    'addresses[2]' => '서울 강남구 없는동 999',
];
$curl = curl_init('https://apick.app/rest/geo_address_cleanup');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## 사용 예시 1. 주소록 중복 정리

같은 지점을 다르게 적은 주소 목록을 묶어 실제 지점 수를 셉니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/geo_address_cleanup' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'addresses[0]=서울특별시 강남구 역삼동 808' \
  --form-string 'addresses[1]=서울 강남구 역삼동 808' \
  --form-string 'addresses[2]=서울특별시 강남구 테헤란로 152'

```

- `data.summary.sites`가 실제 지점 수, `duplicateRatePct`가 합쳐진 비율입니다.

- `data.sites[].variants`로 같은 지점의 서로 다른 표기를 확인합니다.

## 사용 예시 2. 권역 분포와 미확인 주소 정리

주소록이 어느 시군구·읍면동에 몰려 있는지 보고, 찾지 못한 주소의 대안을 받습니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/geo_address_cleanup' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'addresses[2]=서울 강남구 없는동 999' \
  --form-string 'addresses[0]=서울특별시 강남구 역삼동 808' \
  --form-string 'addresses[1]=부산광역시 해운대구 우동 1401'

```

- `data.districts[]`로 권역별 지점 수를 집계합니다.

- `data.unmatched[].suggestions`로 고칠 후보를 안내합니다.

## 코드·오류

### 업무 실패 응답

입력 오류·대상 없음·일시 실패는 data.error(사유)와 data.success=0으로 오며 api.cost는 0(과금 없음)입니다. HTTP 상태는 400·404·408·424 중 하나입니다. 입력 오류는 값을 고쳐 다시 요청하고, 408·424는 잠시 후 한 번 다시 시도하세요.

```json

{
  "data": {
    "error": "입력값을 확인해 주세요.",
    "success": 0
  },
  "api": {
    "success": true,
    "cost": 0,
    "ms": 5
  }
}

```

## 상세 기능·요금

이용 전 확인 성공한 요청 한 건당 40P가 차감됩니다. 입력이 잘못됐거나 결과를 찾지 못하면 data.error로 응답하며 api.cost는 0입니다. 같은 지점 판정은 필지번호 → 법정동+번지 → 좌표(소수 4자리, 약 10m) 순서로 합니다. 필지번호까지 확인되는 주소는 정확히 묶입니다.완전히 같은 문자열은 조회 전에 한 번만 확인합니다. 표기가 다르지만 같은 지점인 주소는 variants로 함께 돌려줍니다.찾지 못한 주소의 대안 후보는 최대 10건까지만 조회하며 includeSuggestions=false로 생략할 수 있습니다.성공한 주소가 하나도 없으면 실패로 끝나며 과금되지 않습니다. 좌표는 WGS84 경위도(EPSG:4326)이며 x가 경도, y가 위도입니다. 거리·면적은 지구를 구로 본 근사값이며 필지·행정구역 규모에서는 오차가 작습니다. 응답 시간은 보통 12초 이내이고 최대 25초입니다. 요청 시간 제한을 30초 이상으로 잡으세요. 인증키는 서버 환경변수에 보관하고 공개 저장소·웹페이지에 넣지 마세요.

## 상세 요청

항목설정 메서드·주소POST https://apick.app/rest/geo_address_cleanup 인증 헤더Authorization: Bearer — 내 계정의 API 인증키 본문 형식multipart/form-data addrType 허용값 값의미 auto지번·도로명을 알아서 판단합니다 (기본값).parcel (또는 jibun·지번)지번 주소로만 찾습니다.road (또는 도로명)도로명 주소로만 찾습니다. 숫자(number·integer)·참거짓(boolean) 항목에 형식이 맞지 않는 값을 보내면 처리 전에 HTTP 400으로 거절되며 과금되지 않습니다. 참거짓 값은 true·false(또는 1·0)로 보냅니다. 요청 예시 성공 시 과금되는 실제 요청입니다. form-data 전체 예제 보기

## 상세 응답

필드타입설명 data.summary.requestedinteger입력한 주소 수입니다.data.summary.uniqueinteger같은 문자열을 합친 뒤 확인한 주소 수입니다.data.summary.matchedinteger찾은 고유 주소 수입니다.data.summary.unmatchedinteger찾지 못한 고유 주소 수입니다.data.summary.sitesinteger같은 지점끼리 묶은 실제 지점 수입니다.data.summary.duplicateGroupsinteger입력이 2건 이상인 지점 수입니다.data.summary.mergedInputsinteger같은 지점으로 합쳐진 입력 수입니다.data.summary.duplicateRatePctnumber찾은 입력 중 합쳐진 비율(%)입니다.data.summary.districtsinteger시군구·읍면동 묶음 수입니다.data.summary.partialboolean시간 초과로 일부를 확인하지 못했으면 true입니다.data.districts[].sigungustring시군구입니다.data.districts[].eupmyeondongstring읍면동입니다.data.districts[].sitesinteger이 권역의 지점 수입니다.data.districts[].membersinteger이 권역의 입력 수입니다.data.sites[].siteIdinteger1부터 붙인 지점 번호입니다. 입력이 많은 지점부터 정렬됩니다.data.sites[].addressstring대표 주소입니다. 도로명 주소가 있는 입력을 우선합니다.data.sites[].roadAddressstring대표 도로명 주소입니다. 없으면 빈 문자열입니다.data.sites[].jibunAddressstring대표 지번 주소입니다.data.sites[].codesobject대표 주소의 코드입니다. 항목 구성은 주소 표준화 API의 codes와 같습니다.data.sites[].pointobject대표 주소의 좌표입니다.data.sites[].memberCountinteger이 지점으로 묶인 입력 수입니다.data.sites[].variants[]array이 지점을 가리킨 서로 다른 표기입니다.data.sites[].indexes[]array입력 목록에서의 위치(0부터)입니다.data.unmatched[].inputstring찾지 못한 입력입니다.data.unmatched[].errorstring찾지 못한 이유입니다.data.unmatched[].suggestions[]array대안 후보(최대 3건)입니다. 후보가 없으면 빈 배열입니다. api.costinteger차감된 포인트입니다. 실패한 응답은 0입니다. api.msinteger처리 시간(밀리초)입니다. { "data": { "summary": { "requested": 3, "unique": 3, "matched": 2, "unmatched": 1, "sites": 1, "duplicateGroups": 1, "mergedInputs": 1, "duplicateRatePct": 50, "districts": 1, "partial": false, "elapsedMs": 320 }, "districts": [ { "sigungu": "서울특별시 강남구", "eupmyeondong": "역삼동", "adminDong": "역삼1동", "sites": 1, "members": 2 } ], "sites": [ { "siteId": 1, "address": "서울특별시 강남구 역삼동 808", "roadAddress": "", "jibunAddress": "서울특별시 강남구 역삼동 808", "sigungu": "서울특별시 강남구", "eupmyeondong": "역삼동", "adminDong": "역삼1동", "codes": { "pnu": "1168010100108080000", "bjdongCode": "1168010100", "lawdCd": "11680", "adminDongCode": "1168064000", "sidoCode": "11", "sigunguCode": "11680" }, "point": { "x": 127.0250516, "y": 37.5043681, "crs": "EPSG:4326" }, "memberCount": 2, "variants": [ "서울특별시 강남구 역삼동 808", "서울 강남구 역삼동 808" ], "indexes": [ 0, 1 ] } ], "unmatched": [ { "input": "서울 강남구 없는동 999", "error": "주소를 찾지 못했습니다.", "suggestions": [] } ] }, "api": { "cost": 40, "success": true, "ms": 330 } } 예시의 주소·좌표·코드와 장소 이름은 설명을 위한 값이며 실제 응답과 다를 수 있습니다.

## 상세 코드·정책

오류와 복구 아래 경우는 data.error로 응답하며 과금되지 않습니다(api.cost 0). 실패 응답은 표의 HTTP 상태 코드와 함께 옵니다. 화면에 보여 줄 안내는 본문의 data.error를 쓰고, 성공 여부는 data.error가 있는지로 판단하세요. 상황HTTPdata.error해결 주소 목록 누락400주소 목록이 필요합니다.addresses에 주소를 한 건 이상 넣습니다.주소 수 초과400한 요청에 주소를 50개까지 정리할 수 있습니다.50건씩 나눠 요청합니다.addrType 값 오류400주소 유형이 잘못됐습니다.auto·parcel·road 중 하나로 보내거나 생략합니다.모든 주소를 찾지 못함404입력한 위치를 찾지 못했습니다.주소 표기를 확인합니다. 한 건이라도 찾으면 성공 응답의 unmatched로 옵니다.모든 주소가 시간 초과424처리 시간이 초과됐습니다. 범위를 줄여 다시 시도해 주세요.건수를 줄여 다시 요청합니다.일시적 조회 실패424공간정보를 일시적으로 가져오지 못했습니다. 잠시 후 다시 시도해 주세요.잠시 후 같은 요청을 다시 보냅니다.

## 상세 예제

호출 예시 같은 요청을 JavaScript와 Python으로 옮긴 예시입니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다. JavaScript 예시 form-data 전체 예제 보기 Python 예시 form-data 전체 예제 보기
