기업 종합 프로필 (MCP 도구)
사업자등록번호 하나로 상태, 위험, 고용, 재무, 사업장 다섯 축의 공공데이터 열한 조회를 한 번의 MCP 호출로 묶어 받는 도구의 준비, 요청, 응답, 오류 안내입니다.
이 도구가 하는 일
사업자등록번호 하나로 공공데이터 열한 조회를 한 번의 호출로 실행해, 상태, 위험, 고용, 재무, 사업장 다섯 축으로 모아 돌려주는 MCP 도구입니다.
- 상태 축은 사업자 상태와 진위확인, 위험 축은 공공조달 제재, 건설업 행정처분, 환경 제재입니다.
- 고용 축은 고용보험과 산재보험 가입, 국민연금 가입이고, 재무 축은 기업개요와 재무 요약, 사업장 축은 사업장 건물과 건물 실거래입니다.
- 사업자 상태 조회가 먼저 끝나기를 기다린 뒤 나머지 조회를 함께 실행합니다.걸리는 시간은 사업자 상태 조회의 시간에 나머지 중 가장 오래 걸리는 조회의 시간을 더한 만큼이고, 호출 전체는 최대 90초 안에 끝납니다.
- 모두 XBOSS 의 플랫폼 키로 돌아 고객의 기관 계정을 연동할 필요가 없습니다.
기업 리스크 브리프와 다른 점은, 조회가 더 많고 축으로 묶여 돌아온다는 것과, 기본 호출에서 사업자 상태 조회만 필수라는 것입니다.이 문서에서는 열한 조회 하나하나를 leg 이라고 부릅니다. 응답의 legs 에는 leg 마다 원래 조회의 결과가 그대로 담기고, computed 에는 그 결과를 사업자 하나 기준으로 간추린 값이 담깁니다.
| 도구 이름 | company_info_pack__profile_v1__generate |
|---|---|
| 호출 방식 | tools/call (JSON-RPC 2.0) |
| 엔드포인트 | POST https://api.xdata.kr/mcp |
| 인증 | Authorization: Basic |
| 환경 헤더 | X-MCP-Env-Scope (선택) |
| 최대 대기 | 조회 하나 60초, 호출 전체 90초 |
이 도구는 MCP 로 부를 수 있고, 주소, 인증, 환경 헤더는 MCP 연동 개요와 같습니다.REST 로 부르는 법은 묶음 상품을 REST 로 부르기에 있습니다.
열한 조회(leg)
| 축 | leg | 원자 액션 | 따로 부르는 MCP 도구 | 개발자 문서 |
|---|---|---|---|---|
| 상태 | 사업자 상태 | opendata.nts.status | opendata__nts__status | 조회 문서 |
| 상태 | 사업자 진위확인 | opendata.nts.validate | opendata__nts__validate | 조회 문서 |
| 위험 | 공공조달 제재 | opendata.g2b.sanction | opendata__g2b__sanction | 조회 문서 |
| 위험 | 건설업 행정처분 | opendata.kiscon.sanction | opendata__kiscon__sanction | 조회 문서 |
| 위험 | 환경 제재 | opendata.env.waste_sanction | opendata__env__waste_sanction | 조회 문서 |
| 재무 | 기업개요 | opendata.fsc.corp_outline | opendata__fsc__corp_outline | 조회 문서 |
| 고용 | 고용보험 산재보험 가입 | opendata.comwel.workplace | opendata__comwel__workplace | 조회 문서 |
| 고용 | 국민연금 가입 | opendata.nps.workplace | opendata__nps__workplace | 조회 문서 |
| 재무 | 재무 요약 | opendata.fsc.financials | opendata__fsc__financials | 조회 문서 |
| 사업장 | 사업장 건물 | opendata.bld.register | opendata__bld__register | 조회 문서 |
| 사업장 | 사업장 건물 실거래 | opendata.nrg.trades | opendata__nrg__trades | 조회 문서 |
「따로 부르는 MCP 도구」는 같은 조회를 이 팩 없이 단독으로 부르고 싶을 때 쓰는 이름이고, 인자와 응답 모양은 이 팩과 다를 수 있습니다.표에 - 로 보이는 칸은 지금 따로 부를 수 있는 MCP 도구나 개발자 문서 페이지가 없다는 뜻입니다. 그런 조회도 이 도구 안에서는 그대로 돌아갑니다.
필수 조회와 선택 조회
기본 호출에서 필수인 조회는 사업자 상태 하나이고, 나머지 열 조회는 선택입니다. 선택 조회는 조회된 만큼 응답에 담기고, 빠진 조회는 이유와 함께 알려 줍니다.
- 필수 조회가 하나라도 성공하지 못하면 partial 이 true 입니다.
- 선택 조회가 빠지거나 실패해도 partial 은 false 로 오고, 대신 warnings 에 한국어 안내가 실리고 coverage.legs[] 에 그 조회의 결과가 분류됩니다.
- 열한 조회 가운데 원천 자료가 아직 준비되지 않은 것이 있으면 그 조회는 실패로 오고, 선택 조회라 위와 같이 warnings 로 알려 줍니다.그 조회가 속한 축은 일부 조회됨 이나 지금 못 봄 으로 옵니다. 모든 조회가 늘 성공한다고 가정하지 말고 legs[].status 와 축의 state_ko 를 확인하세요.
- axes 에 축 이름을 넣으면 그 축의 조회가 필수가 됩니다.예를 들어 ["risk", "premises"] 를 보내면 위험 축과 사업장 축의 조회는 하나라도 성공하지 못했을 때 partial 이 true 가 됩니다.
- 사업자 진위확인은 start_dt 와 p_nm 을 함께 보낼 때만 포함됩니다.보내지 않으면 그 조회만 건너뛰고(legs[].status 가 SKIPPED) 나머지는 그대로 진행됩니다.
부르기 전에 준비할 것
- MCP 서버를 연결합니다
MCP 연동 개요의 순서대로 AI 앱이나 MCP 클라이언트에 XBOSS MCP 서버를 연결합니다.기관 연동이나 자산 선택 같은 사전 준비는 없습니다.
요청
도구 이름과 arguments 를 담아 tools/call 을 보냅니다. 필수 칸은 bizno 하나뿐입니다.
- bizno 는 열한 조회 모두의 기준이니 10자리 숫자인지 먼저 확인하고 보내세요.
- axes 는 필수로 받을 축을 고릅니다.
- start_dt, p_nm 은 사업자 진위확인이 씁니다.
- sDate, eDate, corp_name 은 건설업 행정처분 조회가 씁니다.
- address, endYm 은 사업장 건물과 건물 실거래 조회가 씁니다.
| 필드 | 타입 | 필수 | 설명 | 예시 |
|---|---|---|---|---|
| bizno | string | 필수 | 조회할 사업자등록번호입니다(10자리, 하이픈 없이). 열한 조회 모두 이 번호를 기준으로 합니다. | 1248100998 |
| axes | array | 선택 | 필수로 받을 축의 목록입니다. 값은 status(상태), risk(위험), employment(고용), finance(재무), premises(사업장)입니다. 고른 축의 조회는 필수가 되어, 하나라도 성공하지 못하면 partial 이 true 입니다. 비우면 사업자 상태 조회만 필수이고 나머지는 조회된 만큼 담깁니다. | — |
| start_dt | string | 선택 | 사업자 진위확인에 쓰는 개업일입니다(YYYYMMDD). p_nm 과 함께 보낼 때만 진위확인이 포함됩니다. | 20200101 |
| p_nm | string | 선택 | 사업자 진위확인에 쓰는 대표자 이름입니다. 사업자등록증의 대표자명과 같아야 하고, start_dt 와 함께 보낼 때만 진위확인이 포함됩니다. | 홍길동 |
| sDate | string | 선택 | 건설업 행정처분 조회 기간의 시작일입니다(YYYYMMDD). 종료일과 함께 비우면 종료일 기준 1년 전부터 봅니다. | — |
| eDate | string | 선택 | 건설업 행정처분 조회 기간의 종료일입니다(YYYYMMDD). 시작일과 함께 비우면 오늘(한국 시각)까지 봅니다. | — |
| corp_name | string | 선택 | 건설업 행정처분 조회에서 이름을 맞춰 보는 선택 항목입니다(상호명). 생략할 수 있습니다. | — |
| address | string | 선택 | 사업장 주소입니다(선택, 한글). 비우면 공개 자료의 소재지로 찾습니다. 찾지 못해 사업장 축이 비면 이 칸에 주소를 적어 다시 보내세요. | — |
| endYm | string | 선택 | 사업장 건물 실거래 조회의 마지막 달입니다(YYYYMM, 선택). 비우면 이번 달(한국 시각)부터 거슬러 올라간 최근 12개월을 봅니다. | — |
| output_formats | array | 선택 | 이 결과를 PDF 파일로도 받으려면 적습니다. 예: ["pdf"]. 파일은 artifacts 에 함께 오고, 빼면 데이터만 옵니다. | — |
| API_KEY | - | 받지 않음 | account_link_id 의 다른 철자입니다. 서버가 같은 칸으로 보고 똑같이 처리합니다. | — |
| accountLinkId | - | 받지 않음 | account_link_id 의 다른 철자입니다. 서버가 같은 칸으로 보고 똑같이 처리합니다. | — |
| account_link_id | - | 받지 않음 | 받지 않는 칸입니다. 보내도 무시됩니다. 조각 열하나가 모두 플랫폼 키로 도는 공공 조회라 고객의 기관 연동이 필요 없습니다. | — |
| api_key | - | 받지 않음 | account_link_id 의 다른 철자입니다. 서버가 같은 칸으로 보고 똑같이 처리합니다. | — |
| idempotency_key | string | 선택 | 이 실행의 멱등 키입니다(비어 있지 않은 문자열, 앞뒤 공백은 지우고 128자까지 씁니다). 같은 키와 같은 조회 조건으로 다시 부르면 새 작업을 만들지 않고 이전 작업을 그대로 돌려받아 같은 결과가 옵니다. 같은 키로 조회 조건을 바꾸면 조회를 하나도 시작하지 않고 호출이 오류 번호 -32602(error_code IDEMPOTENCY_KEY_CONFLICT)로 끝나니, 같은 요청을 다시 보내는 것이면 처음 보낸 인자 그대로 보내고 새 요청이면 새 키를 쓰세요. 넣지 않으면 서버가 호출마다 새 키를 만들어 매번 새 작업으로 처리합니다. | profile-2026-11 |
# 기업 종합 프로필 호출
# echo -n "<client_id>:<client_secret>" | base64
export MCP_URL="https://api.xdata.kr/mcp"
export MCP_AUTH_B64="<base64_결과_붙여넣기>"
curl -sS -X POST "$MCP_URL" \
-H "Authorization: Basic $MCP_AUTH_B64" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "company_info_pack__profile_v1__generate",
"arguments": {
"bizno": "1248100998",
"start_dt": "20200101",
"p_nm": "홍길동",
"idempotency_key": "profile-2026-11"
}
}
}'응답 읽기
호출이 성공하면 응답 본문이 result.content[0].text 에 JSON 문자열로 담겨 옵니다. JSON.parse 같은 함수로 풀어 씁니다.
사용 토큰을 세는 환경(데모, 그리고 하루 한도가 정해진 요금제의 정식 환경)에서는 남은 사용 토큰이 두 번째 content 블록과 _meta 에 함께 실립니다(MCP 연동 개요의 「응답에 실리는 _meta」).
| 필드 | 타입 | 있음 | 설명 |
|---|---|---|---|
| pack_run_id | string | 항상 | 이 실행의 팩 실행 아이디입니다. 링크가 만료되면 MCP 도구 xdata__job__result 에 이 값을 pack_run_id 로 보내 같은 결과를 다시 읽습니다(새 조회를 만들지 않고 사용 토큰도 쓰지 않습니다). |
| composite | boolean | 항상 | 항상 true 입니다. 일반 도구 결과와 이 칸으로 구분합니다. |
| tool_name | string | 항상 | 호출한 MCP 도구 이름입니다. |
| provider | string | 항상 | 팩의 provider 이름입니다. |
| action | string | 항상 | 팩의 action 이름입니다. |
| idempotency_key | string | 항상 | 이 실행의 멱등 키입니다. arguments 에 idempotency_key 를 넣었으면 그 값(앞뒤 공백을 지우고 128자까지), 넣지 않았으면 서버가 만든 값입니다. |
| partial | boolean | 항상 | 보고가 완전하지 않으면 true 입니다. 필수 조회 중 하나라도 성공으로 끝나지 않았거나(일부만 모은 경우 포함) 계산을 하지 못했을 때입니다. 필수가 아닌 조회의 문제는 partial 이 아니라 warnings 로 알립니다. true 여도 받은 자료는 그대로 쓸 수 있습니다 - 무엇이 비었는지는 legs 와 coverage 와 computed 가 알려 줍니다. |
| legs | array | 항상 | 조각 열하나(사업자 상태, 사업자 진위확인, 공공조달 제재, 건설업 행정처분, 환경 제재, 기업개요, 고용보험 산재보험 가입, 국민연금 가입, 재무 요약, 사업장 건물, 사업장 건물 실거래)의 원본 결과입니다. 정의 순서로 옵니다. |
| legs[].leg_index | number | 항상 | leg 의 순번입니다(0 부터, 정의 순서). |
| legs[].provider | string | 항상 | 이 leg 이 부른 기관입니다. |
| legs[].action | string | 항상 | 이 leg 이 실행한 원자 액션입니다. |
| legs[].label_ko | string | 항상 | 이 leg 을 화면에 보일 한국어 이름입니다. |
| legs[].status | string | 항상 | 조각의 결과 상태입니다. SUCCEEDED, FAILED, SKIPPED 중 하나입니다. SKIPPED 는 사업자 진위확인 조각이 필수 바깥 인자(start_dt, p_nm)를 못 받았을 때 나옵니다. |
| legs[].job_id | string | null | 항상 | 이 leg 이 실행한 개별 작업의 아이디입니다. 제출하지 못한 leg 은 null 입니다. |
| legs[].result | object | null | 항상 | 성공한 조각의 결과 본문입니다 - 그 원자 액션(opendata)이 돌려주는 값만 담고, 파일은 legs[].artifacts 에 따로 옵니다. 실패했거나 건너뛰었으면 null 입니다. |
| legs[].artifacts | array | null | 항상 | 성공한 leg 의 작업이 낸 파일 목록입니다. 파일을 내지 않았으면 빈 목록이고, 실패했거나 건너뛴 leg 은 null 입니다. 파일은 legs[].result 와 섞이지 않고 이 칸에만 있습니다. |
| legs[].error | object | null | 항상 | 실패한 leg 의 오류입니다. 성공했으면 null 입니다. |
| legs[].error.code | number | 조건부 | 오류 번호입니다(JSON-RPC 코드). |
| legs[].error.message | string | 조건부 | 이 leg 의 오류 문장입니다. 프로그램의 분기에는 code 와 data.error_code 를 쓰고, 문장은 사람이 읽는 용도로만 쓰세요. |
| legs[].error.data | object | null | 조건부 | 오류 종류별 부가 정보입니다. 보통 error_code 가 들어 있고 종류에 따라 다른 칸이 더해집니다. 부가 정보가 없는 오류는 이 칸이 없거나 null 입니다. 시간 초과일 때의 칸은 이 페이지의 시간 초과 절 표에 있습니다. |
| succeeded_count | number | 항상 | 성공한 leg 수입니다. |
| failed_count | number | 항상 | 성공하지 못한 leg 수입니다. |
| warnings | array | 항상 | 필수가 아닌 조회가 빠졌거나 불완전해서 알려야 할 것이 있을 때 그 사실을 알리는 한국어 안내 문장의 목록입니다. 알릴 것이 없으면 빈 목록입니다. 사람이 읽는 문장이니 프로그램의 분기에는 coverage 를 쓰세요. |
| coverage | object | 항상 | 이 보고가 어떤 조회를 필수로 보고 partial 을 가렸는지 알려 줍니다. 조회마다 역할(필수 또는 선택)과 결과 분류가 있습니다. |
| coverage.required_basis | string | 항상 | 필수 조회를 정한 기준입니다. declared(도구가 필수로 정해 둔 조회), requested(요청이 고른 조회), linked(연동이 확인된 조회 전부). |
| coverage.legs | array | 항상 | 조회마다 한 줄입니다. legs 와 같은 순서입니다. |
| coverage.legs[].leg_index | number | 항상 | legs[].leg_index 와 같은 조회의 순번입니다. |
| coverage.legs[].provider | string | 항상 | 그 조회가 부른 기관입니다. |
| coverage.legs[].action | string | 항상 | 그 조회가 실행한 원자 액션입니다. |
| coverage.legs[].label_ko | string | 항상 | 그 조회를 화면에 보일 한국어 이름입니다. |
| coverage.legs[].role | string | 항상 | 이 보고에서 그 조회가 필수(required)인지 선택(optional)인지입니다. 필수 조회가 하나라도 성공으로 끝나지 않으면 partial 이 true 입니다. |
| coverage.legs[].outcome | string | 항상 | 그 조회의 결과 분류입니다. succeeded(성공했고 완전한 것), partial_collection(성공했지만 일부만 모은 것), not_linked(연동이 되어 있지 않아 실패한 것), unavailable(서버 사정으로 제출하지 않고 내린 것), failed(그 밖의 이유로 성공하지 못한 것). |
| computed_error | object | null | 항상 | 계산을 하지 못했을 때만 값이 있고(computed 는 null), 그 밖에는 null 입니다. |
| computed_error.reason | string | 조건부 | 계산하지 못한 이유입니다. 값마다 뜻과 결과(보고가 partial 로 오는지, 오류로 끝나는지)는 「시간 초과와 계산 실패」 절의 표에 있습니다. |
| computed_error.message | string | 조건부 | 이유를 설명하는 한국어 안내 문장입니다. 사람이 읽는 문장이니 프로그램의 분기에는 reason 을 쓰세요. |
| artifacts | array | 항상 | 이 실행이 만든 파일 목록입니다. arguments 에 output_formats 로 형식을 청했을 때만 항목이 생기고, 청하지 않았으면 빈 목록입니다. 항목마다 download_url, name, size_bytes, sha256, expires_at 이 있습니다. 칸의 뜻과 내려받기 주소의 유효 시간은 작업 처리 흐름의 결과 조회(result.artifacts)와 같습니다. 링크가 만료되면 pack_run_id 로 xdata__job__result 를 다시 부릅니다. |
computed 읽기
computed 는 열한 조회의 결과를 사업자 하나 기준으로 간추린 칸입니다. 읽는 곳이 축마다 조금 다릅니다.
- 상태 축과 위험 축은 computed.flags 의 키로 읽습니다. 축의 flag_keys 가 어느 키를 보면 되는지 알려 줍니다.
- 고용, 재무, 사업장 축은 축의 rows 로 읽습니다. rows 는 [이름, 값] 쌍의 목록이고 이름은 고객이 읽는 한국어입니다.
- 축마다 state_ko 에 그 축의 판정 낱말이, notes_ko 에 읽을 때 알아야 할 안내 문장이 있습니다.
| 필드 | 타입 | 있음 | 설명 |
|---|---|---|---|
| computed | object | null | 항상 | 조각 열하나를 사업자 하나 기준으로 요약한 칸입니다 - 상태, 위험 두 축은 flags 로, 고용, 재무, 사업장 세 축은 axes 의 rows 로 읽습니다. 계산을 하지 못했으면 null 이고 이유는 computed_error 에 있습니다. |
| computed.bizno | string | 조건부 | 요청한 사업자등록번호를 그대로 돌려줍니다. |
| computed.as_of | string | 조건부 | 이 요약을 만든 시각입니다(UTC). |
| computed.sDate | string | 조건부 | 건설업 행정처분 조회 시작일입니다. 보내지 않았으면 실제로 본 기간(종료일 기준 1년 전)의 시작일입니다. |
| computed.eDate | string | 조건부 | 건설업 행정처분 조회 종료일입니다. 보내지 않았으면 실제로 본 기간의 종료일(오늘, 한국 시각)입니다. |
| computed.legs | array | 조건부 | 조각 열하나의 결과를 계산이 다시 간추린 칸입니다(leg_index, label_ko, provider, action, status, job_id, 기관 응답을 그대로 싣는 조회는 upstream_keys, 결과 맨 위에 matches 가 있는 조회는 match_count, 실패하거나 건너뛴 조각은 error). |
| computed.legs[].leg_index | number | 조건부 | 봉투의 legs 와 같은 순번입니다. |
| computed.legs[].provider | string | 조건부 | 이 leg 이 부른 기관입니다(opendata). |
| computed.legs[].action | string | 조건부 | 이 leg 이 실행한 원자 액션입니다. |
| computed.legs[].status | string | 조건부 | 이 leg 의 상태입니다. SUCCEEDED, FAILED, SKIPPED 중 하나입니다. |
| computed.legs[].job_id | string | null | 조건부 | 이 leg 이 실행한 개별 작업의 아이디입니다. 제출하지 못했으면(SKIPPED) null 입니다. |
| computed.legs[].upstream_keys | array | 조건부 | 성공한 leg 의 결과에 upstream 객체가 있으면 그 객체의 키 이름을 정렬한 목록입니다. 사업자상태, 진위확인, 나라장터제재, 건설행정처분 조회가 기관 응답을 result.upstream 에 그대로 싣습니다. |
| computed.legs[].label_ko | string | 조건부 | 조각의 고객 이름입니다(예: 사업자 상태, 재무 요약). 봉투 위쪽의 legs[].label_ko 와 같습니다. |
| computed.legs[].match_count | number | 조건부 | 성공한 leg 의 결과 맨 위에 matches 배열이 있을 때만 있고 그 길이입니다 - 폐기물행정처분 조회가 그렇습니다. 건설행정처분의 matches 는 result.upstream 안에 있어 여기에는 없고 computed.flags.kiscon_sanction.match_count 에서 읽습니다. |
| computed.legs[].error | object | 조건부 | 실패하거나 건너뛴 leg 의 오류입니다(code, message, data). |
| computed.legs[].error.code | number | 조건부 | 오류 번호입니다. |
| computed.legs[].error.message | string | 조건부 | 이 leg 의 오류 문장입니다. 프로그램의 분기에는 code 와 data 안의 error_code 를 쓰고, 문장은 사람이 읽는 용도로만 쓰세요. |
| computed.legs[].error.data | object | 조건부 | 오류 종류별 부가 정보입니다. 봉투 위쪽의 legs[].error.data 와 같은 값입니다(계산이 leg 오류를 그대로 옮깁니다) - 그 칸의 설명을 따릅니다. |
| computed.flags | object | 조건부 | 다섯 조회 각각을 한 낱말로 요약한 칸입니다 - 사업자상태, 진위확인, 나라장터제재, 건설행정처분, 폐기물행정처분 다섯 키가 늘 있습니다. |
| computed.flags.nts_status | object | 조건부 | 사업자상태 조회의 요약입니다(status, claim, 확인한 값이 있으면 observed_value_ko). |
| computed.flags.nts_status.status | string | 조건부 | 사업자상태 조회 leg 의 상태입니다 - SUCCEEDED 또는 FAILED 입니다. |
| computed.flags.nts_status.claim | string | 조건부 | 결과를 어떻게 읽었는지입니다. 이 조회는 기관 응답을 result.upstream 에 그대로 싣고 그 응답에 matches 목록이 없어서, 성공하면 늘 payload_without_matches_list 입니다(개수를 세지 못했다는 뜻이고 조회가 잘못됐다는 뜻이 아닙니다 - 기관 응답은 legs[].result.upstream 에서 읽습니다). 성공하지 못했으면 unavailable 입니다. |
| computed.flags.nts_status.observed_value_ko | string | 조건부 | 사업자상태 조회에서 확인한 사업자 상태를 한국어로 적은 칸입니다 - 계속사업자, 휴업자, 폐업자 중 하나입니다. 조회가 성공했고 기관 응답의 status_code 가 OK 이며, 기관 응답에서 요청한 사업자등록번호의 행이 정확히 하나이고, 그 행의 상태 코드와 상태 이름이 서로 맞을 때만 있습니다. 하나라도 맞지 않으면 이 칸이 없습니다 - 예를 들어 등록되지 않은 사업자등록번호는 기관이 상태 코드와 상태 이름을 비워 돌려주므로 이 칸이 없습니다. 이 칸이 없으면 값을 확인하지 못한 것이니 기관 응답을 legs[].result.upstream 에서 직접 읽습니다. |
| computed.flags.nts_validate | object | 조건부 | 진위확인 조회의 요약입니다(status, claim, 확인한 값이 있으면 observed_value_ko). 그 leg 이 SKIPPED 면 status 가 SKIPPED 이고 claim 은 unavailable 입니다. |
| computed.flags.nts_validate.status | string | 조건부 | 진위확인 조회 leg 의 상태입니다 - SUCCEEDED, FAILED, SKIPPED 중 하나입니다. 필수 바깥 인자(bizno, start_dt, p_nm)가 비면 SKIPPED 입니다. |
| computed.flags.nts_validate.claim | string | 조건부 | 결과를 어떻게 읽었는지입니다. 사업자상태 조회와 같이 성공하면 늘 payload_without_matches_list 이고 기관 응답은 legs[].result.upstream 에서 읽습니다. 성공하지 못했거나 건너뛰었으면 unavailable 입니다. |
| computed.flags.nts_validate.observed_value_ko | string | 조건부 | 진위확인 조회에서 확인한 결과를 한국어로 적은 칸입니다 - 「입력한 사업자등록번호, 개업일, 대표자명 기준으로 확인됨」 또는 「입력한 사업자등록번호, 개업일, 대표자명으로 진위를 확인할 수 없음」 둘 중 하나입니다. 조회가 성공했고 기관 응답의 status_code 가 OK 이며, 기관 응답에서 요청한 사업자등록번호의 행이 정확히 하나이고, 그 행의 진위 결과 코드(valid)가 01 이나 02 이며, 그 행이 되돌려 준 요청 값(사업자등록번호, 개업일, 대표자명)이 보낸 값과 같을 때만 있습니다. 보낸 값 기준의 결과이고 사업자를 허위로 판정하거나 문제가 없다고 보증하는 말이 아닙니다. |
| computed.flags.g2b_sanction | object | 조건부 | 나라장터제재 조회의 요약입니다(status, claim, 확인한 값이 있으면 observed_value_ko). |
| computed.flags.g2b_sanction.status | string | 조건부 | 나라장터제재 조회 leg 의 상태입니다 - SUCCEEDED 또는 FAILED 입니다(이 leg 은 SKIPPED 되지 않습니다 - 바깥 인자 리셰이프가 없습니다). |
| computed.flags.g2b_sanction.claim | string | 조건부 | 결과를 어떻게 읽었는지입니다. 이 조회도 기관 응답을 result.upstream 에 그대로 싣고 그 응답에 matches 목록이 없어서, 성공하면 늘 payload_without_matches_list 입니다. 기관 응답은 legs[].result.upstream 에서 읽습니다. 성공하지 못했으면 unavailable 입니다. |
| computed.flags.g2b_sanction.observed_value_ko | string | 조건부 | 나라장터제재 조회에서 확인한 기록 수를 한국어로 적은 칸입니다 - 「이번 사업자등록번호 조회에서 확인된 기록 0건」 하나뿐입니다. 기관 응답이 정상(resultCode 가 00)이고 전체 건수가 0이며 목록이 없거나 비어 있을 때만 있습니다. 기록이 있거나 응답이 정상이 아니거나 건수를 읽지 못했으면 이 칸이 없습니다. 제재 이력이 없다는 단정이 아니라 이번 조회에서 확인된 기록이 0건이라는 뜻입니다. |
| computed.flags.kiscon_sanction | object | 조건부 | 건설행정처분 조회의 요약입니다(status, claim, 성공했으면 match_count 도). |
| computed.flags.kiscon_sanction.status | string | 조건부 | 건설행정처분 조회 leg 의 상태입니다 - SUCCEEDED 또는 FAILED 입니다. |
| computed.flags.kiscon_sanction.match_count | number | 조건부 | claim 이 matches_reported 일 때만 있습니다 - 그 조회의 matches 배열 길이입니다. |
| computed.flags.kiscon_sanction.claim | string | 조건부 | 결과를 어떻게 읽었는지입니다. 성공하면 matches_reported 입니다 - result.upstream 안의 matches 목록을 읽었고 match_count 가 그 길이입니다. 성공하지 못했으면 unavailable 입니다. |
| computed.flags.waste_sanction | object | 조건부 | 폐기물행정처분 조회의 요약입니다(status, claim, 성공했으면 match_count 도). |
| computed.flags.waste_sanction.status | string | 조건부 | 폐기물행정처분 조회 leg 의 상태입니다 - SUCCEEDED 또는 FAILED 입니다. |
| computed.flags.waste_sanction.match_count | number | 조건부 | claim 이 matches_reported 일 때만 있습니다 - 그 조회의 matches 배열 길이입니다. |
| computed.flags.waste_sanction.claim | string | 조건부 | 결과를 어떻게 읽었는지입니다. 성공하면 matches_reported 입니다 - 결과 맨 위의 matches 목록을 읽었고 match_count 가 그 길이입니다. 성공하지 못했으면 unavailable 입니다. |
| computed.coverage_notes | array | 조건부 | 조회 결과를 읽을 때 반드시 알아야 하는 한국어 안내 문장의 목록입니다. 빈 결과로 제재 이력이 없다고 단정하면 안 된다는 안내를 포함하고, 요청에 따라 문장이 달라집니다 - 건설업 행정처분 기간을 보내지 않았으면 기본 기간(최근 365일) 안내가 오고, 개업일과 대표자명을 보내지 않았으면 진위확인 문장이 빠집니다. 조회된 기업개요, 고용보험 산재보험, 국민연금, 재무 요약, 사업장 건물, 실거래 조각은 그 자료의 범위를 알리는 문장을 하나씩 더합니다. |
| computed.axes | object | 조건부 | 축 다섯(status, risk, employment, finance, premises)의 요약 칸입니다. 계산을 하지 못했으면 computed 와 함께 없습니다. |
| computed.axes.status | object | 조건부 | 상태 축의 요약입니다. |
| computed.axes.status.label_ko | string | 조건부 | 축의 고객 이름입니다 - 「상태」 입니다. |
| computed.axes.status.state_ko | string | 조건부 | 축의 판정 낱말입니다 - 조회됨, 일부 조회됨, 해당 없음, 지금 못 봄, 준비 중 다섯 가운데 하나입니다. 조회됨은 이 축의 조각이 모두 조회됐다는 뜻이고, 일부 조회됨은 일부만 조회됐거나 실거래가 요청한 달 가운데 일부만 있다는 뜻입니다. 해당 없음은 조회는 됐으나 법인이 아니라서 보여 줄 자료가 없다는 뜻이고, 지금 못 봄은 조회된 조각이 하나도 없다는 뜻입니다. 준비 중은 조회된 조각이 없고 그 가운데 원천 자료의 연결이 아직 열리지 않은 조각이 있다는 뜻입니다. |
| computed.axes.status.flag_keys | array | 조건부 | 이 축을 요약하는 computed.flags 의 키 이름 목록입니다 - 값은 computed.flags 에서 읽습니다. 상태 축은 nts_status 와 nts_validate, 위험 축은 g2b_sanction, kiscon_sanction, waste_sanction 입니다. |
| computed.axes.status.notes_ko | array | 조건부 | 이 축을 읽을 때 알아야 할 한국어 안내 문장의 목록입니다. 조회하지 못한 조각의 사유와 다음에 할 일, 자료가 가리키는 범위의 한계를 담습니다. 안내할 것이 없으면 빈 목록입니다. |
| computed.axes.risk | object | 조건부 | 위험 축의 요약입니다. |
| computed.axes.risk.label_ko | string | 조건부 | 축의 고객 이름입니다 - 「위험」 입니다. |
| computed.axes.risk.state_ko | string | 조건부 | 축의 판정 낱말입니다 - 조회됨, 일부 조회됨, 해당 없음, 지금 못 봄, 준비 중 다섯 가운데 하나입니다. 조회됨은 이 축의 조각이 모두 조회됐다는 뜻이고, 일부 조회됨은 일부만 조회됐거나 실거래가 요청한 달 가운데 일부만 있다는 뜻입니다. 해당 없음은 조회는 됐으나 법인이 아니라서 보여 줄 자료가 없다는 뜻이고, 지금 못 봄은 조회된 조각이 하나도 없다는 뜻입니다. 준비 중은 조회된 조각이 없고 그 가운데 원천 자료의 연결이 아직 열리지 않은 조각이 있다는 뜻입니다. |
| computed.axes.risk.flag_keys | array | 조건부 | 이 축을 요약하는 computed.flags 의 키 이름 목록입니다 - 값은 computed.flags 에서 읽습니다. 상태 축은 nts_status 와 nts_validate, 위험 축은 g2b_sanction, kiscon_sanction, waste_sanction 입니다. |
| computed.axes.risk.notes_ko | array | 조건부 | 이 축을 읽을 때 알아야 할 한국어 안내 문장의 목록입니다. 조회하지 못한 조각의 사유와 다음에 할 일, 자료가 가리키는 범위의 한계를 담습니다. 안내할 것이 없으면 빈 목록입니다. |
| computed.axes.employment | object | 조건부 | 고용 축의 요약입니다. |
| computed.axes.employment.label_ko | string | 조건부 | 축의 고객 이름입니다 - 「고용」 입니다. |
| computed.axes.employment.state_ko | string | 조건부 | 축의 판정 낱말입니다 - 조회됨, 일부 조회됨, 해당 없음, 지금 못 봄, 준비 중 다섯 가운데 하나입니다. 조회됨은 이 축의 조각이 모두 조회됐다는 뜻이고, 일부 조회됨은 일부만 조회됐거나 실거래가 요청한 달 가운데 일부만 있다는 뜻입니다. 해당 없음은 조회는 됐으나 법인이 아니라서 보여 줄 자료가 없다는 뜻이고, 지금 못 봄은 조회된 조각이 하나도 없다는 뜻입니다. 준비 중은 조회된 조각이 없고 그 가운데 원천 자료의 연결이 아직 열리지 않은 조각이 있다는 뜻입니다. |
| computed.axes.employment.rows | array | 조건부 | 이 축의 값을 [이름, 값] 쌍으로 늘어놓은 목록입니다. 이름은 고객이 읽는 한국어이고, 조회된 조각이 없으면 빈 목록입니다. 값이 없는 칸은 null 로 옵니다. |
| computed.axes.employment.notes_ko | array | 조건부 | 이 축을 읽을 때 알아야 할 한국어 안내 문장의 목록입니다. 조회하지 못한 조각의 사유와 다음에 할 일, 자료가 가리키는 범위의 한계를 담습니다. 안내할 것이 없으면 빈 목록입니다. |
| computed.axes.finance | object | 조건부 | 재무 축의 요약입니다. |
| computed.axes.finance.label_ko | string | 조건부 | 축의 고객 이름입니다 - 「재무」 입니다. |
| computed.axes.finance.state_ko | string | 조건부 | 축의 판정 낱말입니다 - 조회됨, 일부 조회됨, 해당 없음, 지금 못 봄, 준비 중 다섯 가운데 하나입니다. 조회됨은 이 축의 조각이 모두 조회됐다는 뜻이고, 일부 조회됨은 일부만 조회됐거나 실거래가 요청한 달 가운데 일부만 있다는 뜻입니다. 해당 없음은 조회는 됐으나 법인이 아니라서 보여 줄 자료가 없다는 뜻이고, 지금 못 봄은 조회된 조각이 하나도 없다는 뜻입니다. 준비 중은 조회된 조각이 없고 그 가운데 원천 자료의 연결이 아직 열리지 않은 조각이 있다는 뜻입니다. |
| computed.axes.finance.rows | array | 조건부 | 이 축의 값을 [이름, 값] 쌍으로 늘어놓은 목록입니다. 이름은 고객이 읽는 한국어이고, 조회된 조각이 없으면 빈 목록입니다. 값이 없는 칸은 null 로 옵니다. |
| computed.axes.finance.notes_ko | array | 조건부 | 이 축을 읽을 때 알아야 할 한국어 안내 문장의 목록입니다. 조회하지 못한 조각의 사유와 다음에 할 일, 자료가 가리키는 범위의 한계를 담습니다. 안내할 것이 없으면 빈 목록입니다. |
| computed.axes.premises | object | 조건부 | 사업장 축의 요약입니다. |
| computed.axes.premises.label_ko | string | 조건부 | 축의 고객 이름입니다 - 「사업장」 입니다. |
| computed.axes.premises.state_ko | string | 조건부 | 축의 판정 낱말입니다 - 조회됨, 일부 조회됨, 해당 없음, 지금 못 봄, 준비 중 다섯 가운데 하나입니다. 조회됨은 이 축의 조각이 모두 조회됐다는 뜻이고, 일부 조회됨은 일부만 조회됐거나 실거래가 요청한 달 가운데 일부만 있다는 뜻입니다. 해당 없음은 조회는 됐으나 법인이 아니라서 보여 줄 자료가 없다는 뜻이고, 지금 못 봄은 조회된 조각이 하나도 없다는 뜻입니다. 준비 중은 조회된 조각이 없고 그 가운데 원천 자료의 연결이 아직 열리지 않은 조각이 있다는 뜻입니다. |
| computed.axes.premises.rows | array | 조건부 | 이 축의 값을 [이름, 값] 쌍으로 늘어놓은 목록입니다. 이름은 고객이 읽는 한국어이고, 조회된 조각이 없으면 빈 목록입니다. 값이 없는 칸은 null 로 옵니다. |
| computed.axes.premises.notes_ko | array | 조건부 | 이 축을 읽을 때 알아야 할 한국어 안내 문장의 목록입니다. 조회하지 못한 조각의 사유와 다음에 할 일, 자료가 가리키는 범위의 한계를 담습니다. 안내할 것이 없으면 빈 목록입니다. |
아래는 열한 조회가 모두 성공했을 때의 응답 본문입니다.legs[].result 에는 그 조회가 돌려주는 값만 담기고 파일은 legs[].artifacts 에 따로 옵니다. 예시에서는 legs[].result 의 속과 computed.coverage_notes 의 뒷부분을 줄여 적었습니다.
{
"pack_run_id": "prun_01JC8YH8R0E1ABCDEFGHJKMN0P",
"composite": true,
"tool_name": "company_info_pack__profile_v1__generate",
"provider": "company_info_pack",
"action": "company_info_pack.profile_v1.generate",
"idempotency_key": "profile-2026-11",
"partial": false,
"legs": [
{
"leg_index": 0,
"provider": "opendata",
"action": "opendata.nts.status",
"label_ko": "사업자 상태",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000",
"result": {
"...": "opendata.nts.status 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 1,
"provider": "opendata",
"action": "opendata.nts.validate",
"label_ko": "사업자 진위확인",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM001",
"result": {
"...": "opendata.nts.validate 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 2,
"provider": "opendata",
"action": "opendata.g2b.sanction",
"label_ko": "공공조달 제재",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM002",
"result": {
"...": "opendata.g2b.sanction 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 3,
"provider": "opendata",
"action": "opendata.kiscon.sanction",
"label_ko": "건설업 행정처분",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM003",
"result": {
"...": "opendata.kiscon.sanction 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 4,
"provider": "opendata",
"action": "opendata.env.waste_sanction",
"label_ko": "환경 제재",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM004",
"result": {
"...": "opendata.env.waste_sanction 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 5,
"provider": "opendata",
"action": "opendata.fsc.corp_outline",
"label_ko": "기업개요",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM005",
"result": {
"...": "opendata.fsc.corp_outline 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 6,
"provider": "opendata",
"action": "opendata.comwel.workplace",
"label_ko": "고용보험 산재보험 가입",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM006",
"result": {
"...": "opendata.comwel.workplace 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 7,
"provider": "opendata",
"action": "opendata.nps.workplace",
"label_ko": "국민연금 가입",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM007",
"result": {
"...": "opendata.nps.workplace 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 8,
"provider": "opendata",
"action": "opendata.fsc.financials",
"label_ko": "재무 요약",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM008",
"result": {
"...": "opendata.fsc.financials 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 9,
"provider": "opendata",
"action": "opendata.bld.register",
"label_ko": "사업장 건물",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM009",
"result": {
"...": "opendata.bld.register 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 10,
"provider": "opendata",
"action": "opendata.nrg.trades",
"label_ko": "사업장 건물 실거래",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM010",
"result": {
"...": "opendata.nrg.trades 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
}
],
"succeeded_count": 11,
"failed_count": 0,
"warnings": [],
"coverage": {
"required_basis": "declared",
"legs": [
{
"leg_index": 0,
"provider": "opendata",
"action": "opendata.nts.status",
"label_ko": "사업자 상태",
"role": "required",
"outcome": "succeeded"
},
{
"leg_index": 1,
"provider": "opendata",
"action": "opendata.nts.validate",
"label_ko": "사업자 진위확인",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 2,
"provider": "opendata",
"action": "opendata.g2b.sanction",
"label_ko": "공공조달 제재",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 3,
"provider": "opendata",
"action": "opendata.kiscon.sanction",
"label_ko": "건설업 행정처분",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 4,
"provider": "opendata",
"action": "opendata.env.waste_sanction",
"label_ko": "환경 제재",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 5,
"provider": "opendata",
"action": "opendata.fsc.corp_outline",
"label_ko": "기업개요",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 6,
"provider": "opendata",
"action": "opendata.comwel.workplace",
"label_ko": "고용보험 산재보험 가입",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 7,
"provider": "opendata",
"action": "opendata.nps.workplace",
"label_ko": "국민연금 가입",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 8,
"provider": "opendata",
"action": "opendata.fsc.financials",
"label_ko": "재무 요약",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 9,
"provider": "opendata",
"action": "opendata.bld.register",
"label_ko": "사업장 건물",
"role": "optional",
"outcome": "succeeded"
},
{
"leg_index": 10,
"provider": "opendata",
"action": "opendata.nrg.trades",
"label_ko": "사업장 건물 실거래",
"role": "optional",
"outcome": "succeeded"
}
]
},
"computed": {
"bizno": "1248100998",
"as_of": "2026-11-08T00:00:00Z",
"sDate": "20251108",
"eDate": "20261108",
"legs": [
{
"leg_index": 0,
"provider": "opendata",
"action": "opendata.nts.status",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000",
"upstream_keys": [
"data",
"match_cnt",
"request_cnt",
"status_code"
],
"label_ko": "사업자 상태"
},
{
"leg_index": 1,
"provider": "opendata",
"action": "opendata.nts.validate",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM001",
"upstream_keys": [
"data",
"request_cnt",
"status_code",
"valid_cnt"
],
"label_ko": "사업자 진위확인"
},
{
"leg_index": 2,
"provider": "opendata",
"action": "opendata.g2b.sanction",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM002",
"upstream_keys": [
"response"
],
"label_ko": "공공조달 제재"
},
{
"leg_index": 3,
"provider": "opendata",
"action": "opendata.kiscon.sanction",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM003",
"upstream_keys": [
"fallback_candidates",
"match_mode",
"matches",
"scan"
],
"label_ko": "건설업 행정처분"
},
{
"leg_index": 4,
"provider": "opendata",
"action": "opendata.env.waste_sanction",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM004",
"match_count": 0,
"label_ko": "환경 제재"
},
{
"leg_index": 5,
"provider": "opendata",
"action": "opendata.fsc.corp_outline",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM005",
"upstream_keys": [
"coverage_note",
"current",
"total_count"
],
"label_ko": "기업개요"
},
{
"leg_index": 6,
"provider": "opendata",
"action": "opendata.comwel.workplace",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM006",
"upstream_keys": [
"coverage_note",
"summary",
"total_count",
"workplaces"
],
"label_ko": "고용보험 산재보험 가입"
},
{
"leg_index": 7,
"provider": "opendata",
"action": "opendata.nps.workplace",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM007",
"upstream_keys": [
"candidate_count",
"coverage_note",
"current",
"exact_count",
"match_mode",
"match_note",
"matched_truncated"
],
"label_ko": "국민연금 가입"
},
{
"leg_index": 8,
"provider": "opendata",
"action": "opendata.fsc.financials",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM008",
"upstream_keys": [
"coverage_note",
"latest",
"latest_year",
"statements",
"years"
],
"label_ko": "재무 요약"
},
{
"leg_index": 9,
"provider": "opendata",
"action": "opendata.bld.register",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM009",
"upstream_keys": [
"coverage_note",
"lot",
"primary",
"summary"
],
"label_ko": "사업장 건물"
},
{
"leg_index": 10,
"provider": "opendata",
"action": "opendata.nrg.trades",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM010",
"upstream_keys": [
"coverage",
"coverage_note",
"lot",
"period",
"summary",
"trades"
],
"label_ko": "사업장 건물 실거래"
}
],
"flags": {
"nts_status": {
"status": "SUCCEEDED",
"claim": "payload_without_matches_list",
"observed_value_ko": "계속사업자"
},
"nts_validate": {
"status": "SUCCEEDED",
"claim": "payload_without_matches_list",
"observed_value_ko": "입력한 사업자등록번호, 개업일, 대표자명 기준으로 확인됨"
},
"g2b_sanction": {
"status": "SUCCEEDED",
"claim": "payload_without_matches_list",
"observed_value_ko": "이번 사업자등록번호 조회에서 확인된 기록 0건"
},
"kiscon_sanction": {
"status": "SUCCEEDED",
"match_count": 0,
"claim": "matches_reported"
},
"waste_sanction": {
"status": "SUCCEEDED",
"match_count": 0,
"claim": "matches_reported"
}
},
"coverage_notes": [
"조회 결과가 비어 있다고 해서 제재 이력이 없다고 단정하지 마세요. '확인된 제재 없음' 과 '제재가 없음' 은 다릅니다.",
"건설업 행정처분은 조회 기간을 받지 않아 최근 365일(결과의 sDate 부터 eDate 까지)만 봤습니다. 기간 밖의 이력은 이 결과에 들어 있지 않습니다. 다른 기간은 sDate 와 eDate 를 적어 다시 요청해 주세요.",
"(... 이하 조회된 자료마다 그 자료의 범위를 알리는 안내 9개가 이어집니다)"
],
"axes": {
"status": {
"label_ko": "상태",
"state_ko": "조회됨",
"flag_keys": [
"nts_status",
"nts_validate"
],
"notes_ko": []
},
"risk": {
"label_ko": "위험",
"state_ko": "조회됨",
"flag_keys": [
"g2b_sanction",
"kiscon_sanction",
"waste_sanction"
],
"notes_ko": []
},
"employment": {
"label_ko": "고용",
"state_ko": "조회됨",
"rows": [
[
"산재보험 가입 여부",
"가입"
],
[
"산재보험 가입 사업장 수",
"1"
],
[
"산재보험 상시 인원 합계",
"120"
],
[
"고용보험 가입 여부",
"가입"
],
[
"고용보험 가입 사업장 수",
"1"
],
[
"고용보험 상시 인원 합계",
"120"
],
[
"국민연금 가입자 수",
"110"
],
[
"국민연금 당월 고지금액",
"35,000,000"
],
[
"국민연금 적용일",
"19990401"
],
[
"국민연금 자료 기준월",
"202610"
]
],
"notes_ko": [
"상시 인원은 보험 적용 단위별 상시 인원의 합계입니다.",
"사업자등록번호 앞 여섯 자리와 상호가 일치하는 사업장으로 맞췄습니다."
]
},
"finance": {
"label_ko": "재무",
"state_ko": "조회됨",
"rows": [
[
"상호",
"예시기업 주식회사"
],
[
"법인 구분",
"주식회사"
],
[
"상장 시장",
"코스피"
],
[
"설립일",
"19690113"
],
[
"업종",
"전자부품 제조업"
],
[
"주요 사업",
"전자제품 제조"
],
[
"종업원 수",
"1,200"
],
[
"중소기업 여부",
"N"
],
[
"최근 사업연도",
"2025"
],
[
"연결 매출액",
"300,000,000,000"
],
[
"연결 영업이익",
"30,000,000,000"
],
[
"연결 당기순이익",
"25,000,000,000"
],
[
"연결 총자산",
"450,000,000,000"
],
[
"연결 총부채",
"120,000,000,000"
],
[
"연결 총자본",
"330,000,000,000"
],
[
"연결 통화",
"KRW"
]
],
"notes_ko": []
},
"premises": {
"label_ko": "사업장",
"state_ko": "조회됨",
"rows": [
[
"대표 건물명",
"예시타워"
],
[
"주용도",
"업무시설"
],
[
"구조",
"철근콘크리트구조"
],
[
"연면적",
12000.5
],
[
"대지면적",
3000
],
[
"지상 층수",
20
],
[
"지하 층수",
4
],
[
"사용승인일",
"20050101"
],
[
"같은 지번 건물 수",
"2"
],
[
"실거래 조회 기간",
"202511 ~ 202610"
],
[
"받아 둔 달 수",
"12 / 12"
],
[
"실거래 건수",
"2"
],
[
"해제 건수",
"0"
],
[
"최근 거래 연월",
"202602"
],
[
"거래금액 범위(만원)",
"50,000 ~ 120,000"
]
],
"notes_ko": [
"대표 건물 1동과 같은 지번의 다른 건물 1동입니다."
]
}
}
},
"computed_error": null,
"artifacts": []
}축의 판정 낱말(state_ko)
| state_ko | 뜻 |
|---|---|
| 조회됨 | 이 축의 조회가 모두 조회됐습니다. |
| 일부 조회됨 | 일부 조회만 조회됐거나, 사업장 건물 실거래가 요청한 달 가운데 일부 달만 있습니다. |
| 해당 없음 | 조회는 됐으나 법인이 아니라서 보여 줄 자료가 없습니다. |
| 지금 못 봄 | 이 축에서 조회된 조회가 하나도 없습니다. |
| 준비 중 | 이 축에서 조회된 조회가 없고, 그 가운데 원천 자료의 연결이 아직 열리지 않은 조회가 있습니다. |
조회 결과가 비어 있다고 해서 제재나 처분 이력이 없다고 단정하지 마세요.computed.coverage_notes 에 이 판단을 돕는 한국어 안내가 함께 옵니다 - 「확인된 제재 없음」과 「제재가 없음」은 다르고, 건설업 행정처분과 환경 제재는 조회 기간과 수집 범위 안에서만 보인다는 것을 포함합니다.computed.flags 가 matches_reported 와 match_count 로 개수를 세 주는 것은 건설업 행정처분과 환경 제재뿐입니다.사업자 상태, 사업자 진위확인, 공공조달 제재는 기관 응답을 legs[].result.upstream 에 그대로 싣기 때문에 그 응답은 legs[].result.upstream 에서 직접 읽습니다.「기록 0건」과 「진위를 확인할 수 없음」은 제재가 없다거나 사업자를 허위로 판정한다는 뜻이 아닙니다.
고용 축과 재무 축, 사업장 축도 같습니다.국민연금은 가입자 수 3인 이상 법인사업장과 10인 이상 개인사업장만 개방되어 결과가 비어 있어도 가입하지 않았다는 뜻이 아니고, 건물과 실거래가 비어 있는 것도 건물이나 거래가 없다는 확인이 아닙니다.자료마다 범위를 알리는 안내가 computed.coverage_notes 에 실립니다.
일부 조회가 빠졌을 때
선택 조회가 빠지면 partial 은 false 로 오고, 빠진 조회의 이유는 warnings 와 legs[] 에서 읽습니다.아래 예시는 개업일과 대표자명 없이 bizno 만 보낸 호출에서 사업자 진위확인이 건너뛰어지고 사업장 건물 실거래 조회가 실패한 응답입니다. 축 판정은 상태 일부 조회됨, 위험 조회됨, 고용 조회됨, 재무 조회됨, 사업장 일부 조회됨 로 옵니다.
- warnings 의 안내 문장은 건너뛴 조회도 「조회에 실패해」 라는 같은 문구로 실립니다.건너뛴 것인지 실패한 것인지는 문장이 아니라 legs[].status(SKIPPED 또는 FAILED)로 가리세요.
- 실패한 조회의 legs[].error 에 오류 번호와 안내가 있고, 안내 문장은 사람이 읽는 말이라 프로그램의 분기에는 쓰지 마세요.
- 선택 조회는 모두 읽기라 같은 요청을 다시 보내도 됩니다.
{
"...": "봉투의 공통 칸(pack_run_id, tool_name, idempotency_key 등)은 줄였습니다",
"partial": false,
"succeeded_count": 9,
"failed_count": 2,
"warnings": [
"사업자 진위확인 조회에 실패해 이번 보고에 포함되지 않았습니다. 잠시 뒤 다시 요청해 주세요.",
"사업장 건물 실거래 조회에 실패해 이번 보고에 포함되지 않았습니다. 잠시 뒤 다시 요청해 주세요."
],
"legs": [
{
"leg_index": 0,
"provider": "opendata",
"action": "opendata.nts.status",
"label_ko": "사업자 상태",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000",
"result": {
"...": "opendata.nts.status 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 1,
"provider": "opendata",
"action": "opendata.nts.validate",
"label_ko": "사업자 진위확인",
"status": "SKIPPED",
"job_id": null,
"result": null,
"artifacts": null,
"error": {
"code": -32004,
"message": "이 작업에 필요한 앞 단계 결과를 쓸 수 없습니다. 앞 단계 조회 결과를 확인한 뒤 다시 시도해 주세요.",
"data": {
"error_code": "COMPOSITE_DEPENDENCY_UNAVAILABLE",
"leg_index": 1,
"detail": "start_dt is required for nts.validate"
}
}
},
{
"leg_index": 2,
"provider": "opendata",
"action": "opendata.g2b.sanction",
"label_ko": "공공조달 제재",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM002",
"result": {
"...": "opendata.g2b.sanction 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 3,
"provider": "opendata",
"action": "opendata.kiscon.sanction",
"label_ko": "건설업 행정처분",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM003",
"result": {
"...": "opendata.kiscon.sanction 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 4,
"provider": "opendata",
"action": "opendata.env.waste_sanction",
"label_ko": "환경 제재",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM004",
"result": {
"...": "opendata.env.waste_sanction 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 5,
"provider": "opendata",
"action": "opendata.fsc.corp_outline",
"label_ko": "기업개요",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM005",
"result": {
"...": "opendata.fsc.corp_outline 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 6,
"provider": "opendata",
"action": "opendata.comwel.workplace",
"label_ko": "고용보험 산재보험 가입",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM006",
"result": {
"...": "opendata.comwel.workplace 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 7,
"provider": "opendata",
"action": "opendata.nps.workplace",
"label_ko": "국민연금 가입",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM007",
"result": {
"...": "opendata.nps.workplace 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 8,
"provider": "opendata",
"action": "opendata.fsc.financials",
"label_ko": "재무 요약",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM008",
"result": {
"...": "opendata.fsc.financials 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 9,
"provider": "opendata",
"action": "opendata.bld.register",
"label_ko": "사업장 건물",
"status": "SUCCEEDED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM009",
"result": {
"...": "opendata.bld.register 조회가 돌려주는 값입니다"
},
"artifacts": [],
"error": null
},
{
"leg_index": 10,
"provider": "opendata",
"action": "opendata.nrg.trades",
"label_ko": "사업장 건물 실거래",
"status": "FAILED",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM010",
"result": null,
"artifacts": null,
"error": {
"code": -32004,
"message": "작업이 실패했습니다(오류 PROVIDER_UNAVAILABLE). 조회에 쓰는 자료를 아직 준비하고 있어 지금은 결과를 드릴 수 없습니다. 조회 결과가 없다는 뜻이 아닙니다. 잠시 뒤 다시 시도해 주세요. 같은 안내가 이어지면 문의해 주세요.",
"data": {
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM010",
"error_code": "PROVIDER_UNAVAILABLE",
"safe_to_retry": true,
"provider_error_ref": "opendata.data_not_ready.opendata.nrg.trades"
}
}
}
],
"computed": {
"axes": {
"status": {
"label_ko": "상태",
"state_ko": "일부 조회됨",
"flag_keys": [
"nts_status",
"nts_validate"
],
"notes_ko": [
"개업일자(start_dt)와 대표자명(p_nm)을 함께 보내면 사업자 진위확인이 포함됩니다."
]
},
"premises": {
"label_ko": "사업장",
"state_ko": "일부 조회됨",
"rows": [
[
"대표 건물명",
"예시타워"
],
[
"주용도",
"업무시설"
],
[
"구조",
"철근콘크리트구조"
],
[
"연면적",
12000.5
],
[
"대지면적",
3000
],
[
"지상 층수",
20
],
[
"지하 층수",
4
],
[
"사용승인일",
"20050101"
],
[
"같은 지번 건물 수",
"2"
]
],
"notes_ko": [
"사업장 건물 실거래는 해당 시군구와 기간의 공개 자료를 아직 받아 두지 않아 이번 보고에 포함되지 않았습니다. 잠시 뒤 다시 요청해 주세요.",
"대표 건물 1동과 같은 지번의 다른 건물 1동입니다."
]
}
},
"...": "위험, 고용, 재무 축은 줄였습니다"
}
}자료가 아직 준비되지 않았을 때
사업장 건물 실거래 조회는 우리 쪽에서 미리 모아 둔 자료를 읽습니다.그 자료가 아직 준비되지 않았으면 빈 결과를 「없음」으로 돌려주지 않고 실패로 끝나며, 위 예시의 실거래 조회가 그 모양입니다.
- 실패한 조회의 legs[].error.data.provider_error_ref 가 opendata.data_not_ready. 뒤에 조회 이름이 붙은 값으로 옵니다.예시에서는 opendata.data_not_ready.opendata.nrg.trades 입니다.
- 안내 문장은 조회에 쓰는 자료를 아직 준비하고 있다는 것과, 조회 결과가 없다는 뜻이 아니라는 것을 알려 줍니다. 사업장에 건물이나 거래가 없다는 확인으로 읽지 마세요.
- 이 조회는 읽기라 잠시 뒤 같은 요청을 다시 보내도 됩니다. 같은 안내가 이어지면 문의해 주세요.
- 축 판정은 일부 조회됨 으로 오고 그 축의 notes_ko 에 같은 취지의 안내가 실립니다.
법인이 아닐 때
개인사업자는 기업개요와 재무 요약이 법인만 제공되는 공개 자료라 재무 축이 해당 없음 으로 옵니다.이것은 실패가 아니라 조회가 정상으로 끝난 결과이고 partial 도 false 입니다. 다른 축은 그대로 조회됩니다. 아래는 그때 재무 축의 모양입니다.
{
"computed": {
"axes": {
"finance": {
"label_ko": "재무",
"state_ko": "해당 없음",
"rows": [],
"notes_ko": [
"기업개요와 재무 요약은 법인만 제공되는 공개 자료라 개인사업자는 해당 없음으로 둡니다."
]
}
}
}
}시간 초과와 계산 실패
조회 하나는 제출한 뒤 최대 60초까지 기다리고, 호출 전체는 최대 90초 안에 끝납니다.
- 60초 안에 끝나지 않은 조회는 그 조회만 시간 초과로 실패하고, 나머지 결과는 그대로 옵니다.
- 그 조회의 error.code 는 -32003 이고 error.data 에 다음 칸이 옵니다.
- 열한 조회는 모두 읽기라 다시 불러도 됩니다.
| error.data 의 칸 | 뜻 |
|---|---|
| job_id | 시간 안에 끝나지 않은 작업의 아이디입니다. 작업은 서버에서 계속 돌 수 있습니다. |
| timeout_seconds | 이 조회를 기다린 한도(초)입니다. 조회 하나의 최대 대기 시간이고, 호출 전체 마감까지 남은 시간이 그보다 짧으면 남은 시간이라 더 작습니다(소수일 수 있습니다). |
| safe_to_retry | 다시 불러도 되는지 알려 줍니다. 열한 조회는 모두 읽기라 true 입니다. |
| status_url | 그 작업의 결과를 GET 으로 읽을 수 있는 주소입니다(REST 로 연동한 서비스에서 같은 API 키를 씁니다). |
| result_tool_call | 그 작업의 결과를 읽는 MCP 도구 호출입니다(name 과 arguments 를 그대로 부르면 됩니다). 작업을 다시 돌리지 않고 사용 토큰도 쓰지 않으며, 아직 돌고 있으면 잠시 기다렸다가 알려 줍니다. |
{
"code": -32003,
"message": "요청이 60초 안에 끝나지 않았습니다(작업 번호 job_01JC8YH8R0E1ABCDEFGHJKM000). 서버가 바쁠 수 있습니다. 결과는 xdata__job__result 도구에 이 job_id 를 넣어 읽을 수 있습니다(작업을 다시 돌리지 않고 사용 토큰도 쓰지 않습니다). 같은 API 키로 연동한 서비스는 GET https://api.xdata.kr/v1/jobs/job_01JC8YH8R0E1ABCDEFGHJKM000 로도 읽을 수 있습니다. 잠시 뒤 다시 시도하거나, 요청 범위를 줄일 수 있으면 줄이세요.",
"data": {
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000",
"timeout_seconds": 60,
"safe_to_retry": true,
"status_url": "https://api.xdata.kr/v1/jobs/job_01JC8YH8R0E1ABCDEFGHJKM000",
"result_tool_call": {
"name": "xdata__job__result",
"arguments": {
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000"
}
}
}
}호출 전체 마감(90초)에 조회를 제출하거나 기다리기 시작하기 전이었다면 그 조회의 error.data.error_code 가 COMPOSITE_TIMEOUT 이고 error.data 에 다음 칸이 옵니다.
error.message 는 사람이 읽는 한국어 문장이라 분기에는 error.data.error_code 를 쓰세요.
| error.data 의 칸 | 뜻 |
|---|---|
| error_code | 항상 COMPOSITE_TIMEOUT 입니다. 이 값으로 호출 전체 마감을 가려냅니다. |
| timeout_seconds | 호출 전체 대기 한도(초)입니다. |
| phase | 마감이 된 단계의 이름입니다(진단용 - 분기에 쓰지 않습니다). |
| job_id | 제출한 작업의 아이디입니다. 제출하지 못했으면 이 칸이 없습니다. |
| result_tool_call | 그 작업의 결과를 읽는 MCP 도구 호출입니다(name 과 arguments 를 그대로 부르면 됩니다). 작업을 다시 돌리지 않고 사용 토큰도 쓰지 않습니다. job_id 가 있을 때만 옵니다. |
| submitted | 그 조회의 작업을 이미 제출했는지 알려 줍니다. true 면 job_id 가 함께 옵니다. |
{
"code": -32003,
"message": "요청이 90초 안에 끝나지 않았습니다. 일부 조회의 종료가 아직 확인되지 않았습니다. 결과는 xdata__job__result 도구에 이 job_id 를 넣어 읽을 수 있습니다(작업을 다시 돌리지 않고 사용 토큰도 쓰지 않습니다). 같은 API 키로 연동한 서비스는 GET https://api.xdata.kr/v1/jobs/job_01JC8YH8R0E1ABCDEFGHJKM000 로도 읽을 수 있습니다. 잠시 뒤 다시 시도해 주세요. 조회 기간이나 범위를 줄일 수 있으면 줄이면 더 빨리 끝납니다.",
"data": {
"error_code": "COMPOSITE_TIMEOUT",
"timeout_seconds": 90,
"phase": "result polling",
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000",
"result_tool_call": {
"name": "xdata__job__result",
"arguments": {
"job_id": "job_01JC8YH8R0E1ABCDEFGHJKM000"
}
},
"submitted": true
}
}성공한 조회가 하나라도 있으면 결과를 합쳐 computed 를 만듭니다.이 계산이 실패하면 computed 는 null 이 되고 이유가 computed_error.reason 에 실립니다. 이유에 따라 보고가 그대로 오기도 하고 오류로 끝나기도 합니다.
| computed_error.reason | 결과 | 뜻 |
|---|---|---|
| deadline_exhausted | 보고가 오고 partial | 호출 전체 마감 시간이 다 돼 계산을 건너뛰었습니다. 받은 자료는 legs 에 있고 봉투는 partial 로 옵니다(computed 는 null). |
| validation_failed | 오류로 끝남 | 계산 중 값 검증에서 실패했습니다(우리 쪽 결함). 봉투를 주지 않고 오류로 끝나며 받은 leg 결과는 오류의 data 에 실립니다. |
| builder_raised | 오류로 끝남 | 계산 중 예외가 났습니다(우리 쪽 결함). 봉투를 주지 않고 오류로 끝나며 받은 leg 결과는 오류의 data 에 실립니다. |
같은 요청을 다시 보낼 때
arguments 에 idempotency_key 를 문자열로 넣으면 그 값이 이 실행의 멱등 키가 됩니다. 앞뒤 공백은 지우고 128자까지 씁니다.
같은 키와 같은 조회 조건으로 다시 부르면 새 작업을 만들지 않고 이전 작업을 그대로 돌려받아 같은 결과가 옵니다.
- 이전 작업이 실패했다면 실패한 결과가 그대로 옵니다.
- 아직 진행 중이면 그 작업을 이어서 기다립니다.
- 다시 시도하려면 새 키를 쓰세요.
같은 키로 조회 조건(인자)을 바꿔 부르면 조회를 하나도 시작하지 않고 호출이 JSON-RPC error(번호 -32602)로 끝납니다.
- 오류의 data.error_code 는 IDEMPOTENCY_KEY_CONFLICT 입니다. 조회별 결과(legs)는 없습니다 - 시작한 조회가 없기 때문입니다.
- 같은 요청을 다시 보내는 것이면 처음 보낸 인자 그대로 보내고, 새 요청이면 idempotency_key 를 새 값으로 바꾸거나 넣지 마세요(넣지 않으면 서버가 만듭니다).
- 오류의 safe_to_retry 는 false 입니다. 같은 인자로 다시 불러도 같은 오류가 납니다.
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "같은 idempotency_key 로 내용이 다른 요청이 이미 들어왔습니다. 같은 요청을 다시 보내는 것이면 처음 보낸 인자 그대로 보내고, 새 요청이면 idempotency_key 를 새 값으로 바꾸거나 아예 넣지 마세요(넣지 않으면 서버가 만듭니다).",
"data": {
"error_code": "IDEMPOTENCY_KEY_CONFLICT",
"safe_to_retry": false
}
}
}키를 넣지 않으면 서버가 호출마다 새 키를 만들어 매번 새 작업으로 처리합니다. 응답의 idempotency_key 에는 실제로 쓴 키가 실립니다.
사용 토큰
사용 토큰을 세는 환경(데모, 그리고 하루 한도가 정해진 요금제의 정식 환경)에서는 이 도구를 한 번 부를 때 새 작업이 만들어지면 사용 토큰을 씁니다.
- 새 작업이 만들어지지 않은 호출은 세지 않습니다(제출 전에 모두 막혔거나 같은 멱등 키로 이전 작업을 돌려받은 경우).
- 남은 사용 토큰은 응답의 remaining 으로 확인합니다.