Developer Reference

API 가이드

등기고 API를 통해 등기부등본 조회를 자동화하고 결과를 수신할 수 있습니다.

개요

모든 API 엔드포인트의 Base URL은 다음과 같습니다.

Base URL
https://deunggigo.kr/api/v1

요청·응답 Body는 모두 application/json 형식입니다.

조회는 비동기로 처리됩니다. POST /api/v1/inquiries 요청 시 id가 반환되며, 이후 GET /api/v1/inquiries/{id}로 결과를 확인합니다. 처리 완료까지 수 분이 소요될 수 있습니다.

인증

API 요청은 API 키 또는 로그인 세션 쿠키 중 하나로 인증합니다. 외부 서버에서 호출할 때는 API 키를 사용하세요. API 키는 아래 API 키 관리 섹션 또는 설정 페이지에서 발급받습니다.

헤더 형식 (둘 중 하나 사용)

Request Header
# 방법 1 — Authorization Bearer
Authorization: Bearer dgg_xxxxxxxxxxxxxxxx

# 방법 2 — X-Api-Key
X-Api-Key: dgg_xxxxxxxxxxxxxxxx
infoAPI 키는 서버 측에서만 사용하고 외부에 노출하지 마세요. 키가 없거나 유효하지 않으면 401 Unauthorized가 반환됩니다.

API 키 관리

유저 계정당 API 키는 하나입니다. 재발급하면 기존 키는 즉시 무효화됩니다. API 키 관리 엔드포인트는 로그인 세션이 필요합니다.

GET/api/v1/api-keys현재 API 키 조회 (마스킹)
JSON — 키 있음
{
  "items": [
    {
      "id": "user_id_here",
      "name": "API 키",
      "keyPrefix": "dgg_a1b2c3d4****…",
      "createdAt": "2024-06-01T09:00:00.000Z"
    }
  ]
}
JSON — 키 없음
{ "items": [] }
POST/api/v1/api-keysAPI 키 발급 / 재발급

요청 Body 없음. 발급 직후 한 번만 전체 키가 반환됩니다.

JSON — 200 OK
{
  "message": "API 키가 발급되었습니다. 지금만 전체 키가 표시됩니다.",
  "key": "dgg_a1b2c3d4e5f6g7h8i9j0..."
}
DELETE/api/v1/api-keysAPI 키 삭제
JSON — 200 OK
{ "message": "API 키가 삭제되었습니다." }

조회 요청 — POST /api/v1/inquiries

POST/api/v1/inquiries

공통 파라미터

파라미터타입기본값설명
issueType*'0'|'1''1'열람(1) 또는 발급(0)
searchDiv*'1'|'2'|'3'|'4''1'검색 방식. 1=고유번호, 2=간편검색, 3=소재지번, 4=도로명주소
display'1'|'2''2'표시 구분. 1=현재유효사항, 2=말소사항 포함
cmortCheck'Y'|'N''N'공동담보/전세목록 포함 여부
tradeCheck'Y'|'N''N'매매목록 포함 여부
dupChk'Y'|'N''N'재열람 우선 시도 여부. Y이면 기존 결제 내역에서 무료 재열람을 먼저 시도하고, 없으면 일반 조회로 진행.
smryYn'Y'|'N''Y'등기사항요약 페이지 포함 여부. Y이면 PDF 말미에 '주요 등기사항 요약' 페이지가 추가됨 (열람 전용, 비용 변동 없음).
excRegYn'Y'|'N''N'과다등기 발생 시 계속 진행 여부. N이면 에러 반환.
closingYn'Y'|'N''N'폐쇄등기 발생 시 계속 진행 여부.

인증 계정 정보 (API 키 호출 시 선택)

파라미터타입기본값설명
irosIdstring인터넷등기소 아이디. 미전달 시 설정 페이지 저장값 사용.
irosPwstring인터넷등기소 비밀번호. 미전달 시 설정 페이지 저장값 사용.
ecashNostring전자민원캐시 번호. 미전달 시 설정 페이지 저장값 사용.
ecashPwstring전자민원캐시 비밀번호. 미전달 시 설정 페이지 저장값 사용.
info설정 페이지에 계정이 저장되어 있으면 body에 포함하지 않아도 됩니다. body 전달값이 저장값보다 우선 적용됩니다. 네 가지 모두 없으면 400이 반환됩니다.

searchDiv별 추가 파라미터

searchDiv = "1" — 고유번호
파라미터타입설명
uniqueNo*string14자리 고유번호. 하이픈 포함(1341-2004-008457) 또는 숫자만(13412004008457) 모두 허용.
searchDiv = "2" — 간편검색
파라미터타입기본값설명
address*string주소 키워드 (지번 또는 도로명)
addrSidostring전체시/도 필터 (예: 서울특별시)
kindCls'0'~'3''0'부동산구분. 0=전체, 1=집합건물, 2=토지, 3=건물
recordStatus'0'~'2''0'등기기록상태. 0=현행, 1=전산폐쇄, 2=현행+전산폐쇄
searchDiv = "3" — 소재지번
파라미터타입기본값설명
locAdminRegn1*string시/도 (예: 경기도)
locAdminRegn3*string읍/면/동 (예: 분당동)
locKindCls'0'~'3''0'부동산구분. 0=토지+건물, 1=집합건물, 2=토지, 3=건물
locInputSel'0'|'1''0'입력구분. 0=지번, 1=건물명칭 (집합건물 전용)
locNostring지번 (locInputSel=0일 때, 예: 123-45)
locBuldNamestring건물명칭 (locInputSel=1일 때)
locDongRoomSel'0'~'2''0'동/호선택. 0=동+호, 1=동, 2=호 (집합건물 전용)
locBuldNoBuldstring동 번호 (집합건물, 동 선택 시)
locBuldNoRoomstring호 번호 (집합건물, 호 선택 시)
recordStatus'0'~'2''0'등기기록상태. 0=현행, 1=전산폐쇄, 2=현행+전산폐쇄
searchDiv = "4" — 도로명주소
파라미터타입기본값설명
rdAdminRegn1*string시/도 (예: 서울특별시)
rdAdminRegn2*string시/군/구 (예: 강남구)
rdName*string도로명 (예: 테헤란로)
rdBuldNo*string건물번호 (예: 123)
rdKindCls'0'~'3''0'부동산구분. 0=토지+건물, 1=집합건물, 2=토지, 3=건물
rdInputSel'0'~'2''0'동/호선택. 0=동+호, 1=동, 2=호 (집합건물 전용)
rdBuldNoBuldstring동 번호 (집합건물, 동 선택 시)
rdBuldNoRoomstring호 번호 (집합건물, 호 선택 시)
recordStatus'0'~'2''0'등기기록상태. 0=현행, 1=전산폐쇄, 2=현행+전산폐쇄

요청 예시

HTTP — 설정 페이지에 계정 저장된 경우
POST /api/v1/inquiries
Authorization: Bearer dgg_xxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "issueType": "1",
  "searchDiv": "1",
  "uniqueNo": "1341-2004-008457",
  "display": "2"
}
HTTP — 계정 정보를 body에 직접 전달하는 경우
POST /api/v1/inquiries
Authorization: Bearer dgg_xxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "issueType": "1",
  "searchDiv": "1",
  "uniqueNo": "1341-2004-008457",
  "display": "2",
  "irosId": "my_iros_id",
  "irosPw": "my_iros_password",
  "ecashNo": "123456789",
  "ecashPw": "my_ecash_password"
}

응답 200 OK

JSON
{
  "message": "조회 요청이 접수되었습니다.",
  "inquiry": {
    "id": "clxyz1234abcd",
    "uniqueNumber": "1341-2004-008457",
    "issueType": "1",
    "status": "pending",
    "cost": 50
  }
}

실패 응답 예시

JSON — 크레딧 부족 (402)
{
  "error": "크레딧이 부족합니다. 필요: 50원, 현재: 0원"
}
JSON — 계정 미설정 (400)
{
  "error": "인터넷등기소 및 전자민원캐시 계정 정보가 필요합니다. 설정 페이지에서 등록하거나 요청 body에 irosId/irosPw/ecashNo/ecashPw를 포함해주세요."
}
JSON — 인증 실패 (401)
{ "error": "인증이 필요합니다." }
JSON — 중복 요청 (409)
{ "error": "동일한 등기부등본이 이미 처리 중입니다. 잠시 후 다시 시도해주세요." }

결과 조회 — GET /api/v1/inquiries/{id}

GET/api/v1/inquiries/{id}

조회 접수 후 statuscompleted 또는 failed로 바뀔 때까지 일정 간격으로 요청하여 결과를 확인합니다. 처리 완료까지 수 분이 소요될 수 있습니다.

status 값

pending

접수 완료, 대기 중

processing

처리 중

completed

성공

failed

실패

성공 응답 completed

JSON
{
  "inquiry": {
    "id": "clxyz1234abcd",
    "uniqueNumber": "1341-2004-008457",
    "propertyType": "building",
    "issueType": "1",
    "status": "completed",
    "cost": 50,
    "pdfPath": "/downloads/registry_clxyz1234abcd.pdf",
    "parsedData": {
      "titleSection": [...],
      "exclusiveSection": [...],
      "rightSection": [...]
    },
    "errorMessage": null,
    "createdAt": "2024-06-01T09:00:00.000Z",
    "completedAt": "2024-06-01T09:01:24.000Z"
  }
}

실패 응답 failed

JSON
{
  "inquiry": {
    "id": "clxyz1234abcd",
    "status": "failed",
    "pdfPath": null,
    "parsedData": null,
    "errorMessage": "전자민원캐시 비밀번호가 잘못되었습니다",
    "createdAt": "2024-06-01T09:00:00.000Z",
    "completedAt": null
  }
}

실패 시 차감된 크레딧·쿼터는 자동으로 복구됩니다.

목록 조회 — GET /api/v1/inquiries

GET/api/v1/inquiries?page=1&limit=20
JSON
{
  "items": [
    {
      "id": "clxyz1234abcd",
      "uniqueNumber": "1341-2004-008457",
      "propertyType": "building",
      "issueType": "1",
      "status": "completed",
      "cost": 50,
      "createdAt": "2024-06-01T09:00:00.000Z"
    }
  ],
  "total": 142,
  "page": 1,
  "totalPages": 8
}

대량 조회 — POST /api/v1/bulk-inquiries

여러 건의 등기부등본을 한 번에 요청합니다. 항목별 빌링은 단건 조회와 동일하게 구독 쿼터 → 구독 크레딧(쿼터 초과) → 구독 후불(active 한정) → 일반 크레딧 순으로 적용됩니다. 처리 자체는 비동기이며, 각 항목은 단건과 동일한 GET /api/v1/inquiries/{id}로 결과를 확인합니다.

info한 번의 요청에 포함 가능한 항목 수는 최대 10,000건입니다. 초과 시 400이 반환됩니다 (maxItems·received 필드 포함).
info미정산 초과 요금(unpaidOverageAmount > 0)이 있는 경우 402로 거절됩니다. 먼저 크레딧 페이지에서 정산해주세요.
POST/api/v1/bulk-inquiries

요청 Body — JSON

items 배열의 각 원소는 단건 조회 요청 body와 동일한 파라미터를 가집니다 (searchDiv, issueType, uniqueNo 또는 주소 필드 등). 인증 계정 정보(irosId·irosPw·ecashNo·ecashPw)는 요청 body의 최상위에 한 번만 전달하며 모든 항목에 공통 적용됩니다.

HTTP — JSON 요청 예시
POST /api/v1/bulk-inquiries
Authorization: Bearer dgg_xxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "projectId": "proj_clxyz1234",   // (선택) 프로젝트에 소속시킬 경우
  "items": [
    {
      "searchDiv": "1",
      "issueType": "1",
      "uniqueNo": "1341-2004-008457",
      "display": "2"
    },
    {
      "searchDiv": "4",
      "issueType": "0",
      "rdAdminRegn1": "서울특별시",
      "rdAdminRegn2": "강남구",
      "rdName": "테헤란로",
      "rdBuldNo": "123",
      "rdKindCls": "1"
    }
  ],
  "irosId": "my_iros_id",
  "irosPw": "my_iros_password",
  "ecashNo": "123456789",
  "ecashPw": "my_ecash_password"
}

요청 Body — 엑셀 업로드

세션 쿠키 인증 시에는 multipart/form-data로 엑셀 파일을 직접 업로드할 수도 있습니다. 엑셀 첫 시트의 한글 컬럼명(예: 검색구분, 발급구분, 고유번호)이 자동으로 영문 키로 매핑됩니다. 템플릿은 아래에서 받을 수 있습니다.

HTTP — 엑셀 업로드 예시
POST /api/v1/bulk-inquiries
Cookie: <session>
Content-Type: multipart/form-data; boundary=----...

------...
Content-Disposition: form-data; name="file"; filename="bulk.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

(엑셀 바이너리)
------...--

응답 200 OK

JSON
{
  "message": "대량 조회가 시작되었습니다.",
  "bulkInquiry": {
    "id": "bulk_clxyz1234",
    "totalCount": 2,
    "skippedCount": 0,
    "batchDuplicateCount": 0,
    "creditDeducted": 0,
    "quotaConsumed": { "view": 1, "print": 0 },
    "postpaidIncrement": { "view": 0, "print": 1 }
  },
  "items": [
    {
      "id": "clxyz1111",
      "uniqueNumber": "1341-2004-008457",
      "issueType": "1",
      "searchDiv": "1",
      "billingType": "subscription_quota",
      "cost": 0,
      "status": "pending"
    },
    {
      "id": "clxyz2222",
      "uniqueNumber": "서울특별시 강남구 테헤란로 123",
      "issueType": "0",
      "searchDiv": "4",
      "billingType": "subscription_postpaid",
      "cost": 200,
      "status": "pending"
    }
  ]
}

각 항목의 idGET /api/v1/inquiries/{id}로 폴링하여 결과를 확인합니다. billingTypesubscription_quota | subscription_credit | subscription_postpaid | credit 중 하나입니다.

실패 응답

JSON — items 누락 (400)
{ "error": "요청 body에 items 배열이 필요합니다 (각 항목은 단건 조회 파라미터와 동일)." }
JSON — 최대 항목 수 초과 (400)
{
  "error": "한 번에 요청 가능한 최대 항목 수는 10,000건입니다. 현재: 12,500건",
  "maxItems": 10000,
  "received": 12500
}
JSON — 유효 항목 없음 (400)
{ "error": "유효한 조회 항목이 없습니다. 필수 필드를 확인해주세요." }
JSON — 미정산 초과 요금 (402)
{
  "error": "미정산된 초과 요금이 있어 서비스를 이용할 수 없습니다. 결제 후 다시 이용해주세요. 미정산 금액: 5,000원",
  "unpaidOverageAmount": 5000
}
JSON — 해지된 구독에서 후불 시도 (402)
{ "error": "해지된 구독은 쿼터 초과 후불이 불가합니다. 크레딧을 충전해주세요. 필요: 100원, 잔액: 0원" }
JSON — 모든 항목이 dedup 차단 (409)
{ "error": "모든 항목이 이미 처리 중입니다. 잠시 후 다시 시도해주세요." }

목록 조회

GET/api/v1/bulk-inquiries?page=1&limit=10
JSON
{
  "items": [
    {
      "id": "bulk_clxyz1234",
      "fileName": "bulk.xlsx",
      "totalCount": 2,
      "completedCount": 1,
      "failedCount": 0,
      "status": "processing",
      "createdAt": "2024-06-01T09:00:00.000Z"
    }
  ],
  "total": 5,
  "page": 1,
  "totalPages": 1
}

엑셀 템플릿 다운로드

GET/api/v1/bulk-inquiries/template

모든 단건 조회 파라미터를 한글 컬럼명으로 포함하는 3-시트 워크북을 반환합니다.

  • 조회목록 — 실제 입력 시트 (헤더 + 예시 2건)
  • 작성안내 — 컬럼별 타입·필수여부·기본값·설명
  • 검색구분별예시 — searchDiv 1~4 각각의 샘플

빌링 동작

항목 단위로 단건 조회와 동일한 분기를 순차 적용합니다. 같은 요청 안에서 일부는 쿼터, 일부는 크레딧, 일부는 후불로 구분될 수 있습니다.
  1. 구독자 + 쿼터 잔여subscription_quota (cost 0, 쿼터 사용량 +1)
  2. 구독자 + 쿼터 소진 + 크레딧 충분subscription_credit (초과 단가 차감)
  3. active 구독 + 크레딧 부족subscription_postpaid (다음 청구에 합산)
  4. cancelled 구독 + 크레딧 부족402 즉시 반환 (후불 불가)
  5. 비구독자credit (단건 단가 차감, 부족 시 402)

실패한 항목의 차감분은 단건과 동일하게 자동 복구됩니다. 배치 내 동일 (uniqueNo+issueType+searchDiv) 항목과 이미 처리 중인 항목은 skippedCount·batchDuplicateCount로 집계되며 빌링되지 않습니다.

대량 조회 프로젝트

대량 조회를 카테고리(예: "안양시")로 묶어 관리할 수 있는 프로젝트 단위입니다. 프로젝트 안의 모든 조회 결과를 묶어서 ZIP으로 받거나, 개별 PDF만 받을 수 있습니다.

GET/api/v1/bulk-projects?page=1&limit=20
JSON
{
  "items": [
    {
      "id": "proj_clxyz1234",
      "name": "안양시 2026Q2",
      "description": "분기 단위 매물 조사",
      "createdAt": "2026-04-01T09:00:00.000Z",
      "updatedAt": "2026-04-15T12:30:00.000Z",
      "bulkCount": 3,
      "totalCount": 15000,
      "completedCount": 14987,
      "failedCount": 13,
      "totalCost": 1499350
    }
  ],
  "total": 5,
  "page": 1,
  "totalPages": 1
}
POST/api/v1/bulk-projects프로젝트 생성
JSON — 요청
{ "name": "안양시 2026Q2", "description": "분기 단위 매물 조사" }
JSON — 200 OK
{ "project": { "id": "proj_clxyz1234", "name": "안양시 2026Q2", "description": "...", "createdAt": "..." } }
GET/api/v1/bulk-projects/{id}프로젝트 상세 + 소속 대량조회 목록
JSON
{
  "project": { "id": "proj_clxyz1234", "name": "...", "description": "...", "createdAt": "..." },
  "bulkInquiries": [
    {
      "id": "bulk_clxyz",
      "fileName": "anyang_q2.xlsx",
      "totalCount": 5000,
      "completedCount": 4998,
      "failedCount": 2,
      "status": "completed",
      "createdAt": "...",
      "completedAt": "...",
      "totalCost": 499800
    }
  ]
}
PATCH/api/v1/bulk-projects/{id}이름·설명 수정
JSON — 요청
{ "name": "안양시 2026Q2 (수정)", "description": null }
DELETE/api/v1/bulk-projects/{id}프로젝트 + 소속 데이터 + PDF 일괄 삭제
프로젝트 안의 모든 BulkInquiry · Inquiry · MinIO PDF가 함께 삭제됩니다. 되돌릴 수 없습니다. 처리중(pending·processing)인 항목이 있으면 409로 거절됩니다.
JSON — 200 OK
{ "message": "프로젝트가 삭제되었습니다.", "deletedPdfs": 4998 }
JSON — 처리중 항목 존재 (409)
{ "error": "처리 중인 항목이 N건 있어 삭제할 수 없습니다. 완료 후 다시 시도해주세요." }
GET/api/v1/bulk-projects/{id}/download프로젝트 전체 ZIP

응답: application/zip 바이너리. 구조 — {프로젝트명}_요약.xlsx + 대량조회별 폴더 안에 PDF.

GET/api/v1/bulk-inquiries/{id}단일 BulkInquiry 상세 (소속 inquiry 전체)
JSON
{
  "bulkInquiry": {
    "id": "bulk_clxyz",
    "fileName": "anyang_q2.xlsx",
    "totalCount": 5000, "completedCount": 4998, "failedCount": 2,
    "status": "completed", "totalCost": 499800,
    "project": { "id": "proj_clxyz1234", "name": "안양시 2026Q2" }
  },
  "items": [
    {
      "id": "clxyz1111", "uniqueNumber": "1341-2004-008457",
      "address": null, "issueType": "1", "searchDiv": "1",
      "searchData": { /* 엑셀 원본 row */ },
      "status": "completed", "cost": 100,
      "hasPdf": true, "pdfPath": "pdfs/.../1341-.../clxyz1111.pdf",
      "errorMessage": null, "createdAt": "...", "completedAt": "..."
    }
  ]
}
GET/api/v1/inquiries/{id}/pdf개별 PDF 다운로드

응답: application/pdf 바이너리. 본인 소유 inquiry만 허용. PDF 미생성 상태 또는 실패한 inquiry는 404 반환.

에러 코드

HTTP 응답 코드

상태 코드원인조치
401 UnauthorizedAPI 키 없음 또는 유효하지 않음Authorization 헤더 또는 X-Api-Key 헤더에 올바른 API 키를 포함하세요.
400 Bad Request필수 파라미터 누락 (uniqueNo/address, IROS 계정 등)요청 body 또는 설정 페이지에서 필수 값을 확인하세요.
402 Payment Required크레딧 부족대시보드에서 크레딧을 충전하거나 구독을 활성화하세요.
409 Conflict동일 고유번호 + 구분이 처리 중이전 요청이 완료될 때까지 기다렸다가 재시도하세요.
500 Internal Server Error서버 내부 오류잠시 후 재시도하거나 support@deunggigo.kr로 문의하세요.

처리 실패 메시지 (inquiry.errorMessage)

HTTP 200으로 접수된 후 처리 중 실패한 경우 inquiry.statusfailed로 바뀌며 아래 메시지가 inquiry.errorMessage에 기록됩니다.

에러 메시지원인조치
아이디 또는 비밀번호가 올바르지 않습니다.인터넷등기소 계정 오류설정 페이지에서 IROS 계정 정보를 확인하세요.
전자민원캐시 번호가 잘못되었습니다전자민원캐시 번호 불일치설정 페이지에서 전자민원캐시 번호를 재확인하세요.
전자민원캐시 비밀번호가 잘못되었습니다전자민원캐시 비밀번호 불일치설정 페이지에서 전자민원캐시 비밀번호를 재입력하세요.
잔액이 부족합니다 (전자민원캐시)인터넷등기소 내 전자민원캐시 잔액 부족인터넷등기소(iros.go.kr)에서 전자민원캐시를 충전하세요.
과다등기부 … 열람 불가등기명의인 수 초과로 열람 제한100명 초과: excRegYn="Y" 설정. 500명 초과: 열람 불가.
폐쇄등기 진행 거부폐쇄등기 발생closingYn="Y" 설정하면 계속 진행됩니다.

사전 준비사항

account_circle

인터넷등기소 계정

인터넷등기소(iros.go.kr) ID·비밀번호. 설정 페이지에서 등록합니다.

payments

전자민원캐시 충전

인터넷등기소 내 전자민원캐시(선불전자지급수단)가 사전에 충전되어 있어야 합니다.

credit_card

서비스 크레딧 또는 구독

열람 50원·발급 100원의 서비스 이용 요금이 크레딧 또는 구독 쿼터에서 차감됩니다.

key

API 키

설정 → API 키 메뉴에서 발급받은 키가 필요합니다.