가이드
세금 계산기 →

국세청 사업자 조회 API, 30분 만에 연동하기

BTSDB 가이드 · 개발 — 상태조회·진위확인 API 실전

개발자의 하루 4컷
1 가입 폼에 검증 넣자
회원가입에서 사업자번호를 받는데 오타가 너무 많다.
2 체크섬은 프론트에서
검증번호 계산은 클라이언트에서 끝난다. 잘못된 번호를 미리 거른다.
3 호출 한도 초과!
실시간 조회는 일일 한도가 있다. 캐시 없이 매번 부르면 금방 소진된다.
4 캐시 넣으니 조용
결과를 저장해 재사용하면 한도도 응답 속도도 해결된다.
먼저 결론 — 번호만으로 계속·휴업·폐업을 확인하려면 상태조회, 번호의 주인이 맞는지까지 확인하려면 진위확인을 씁니다. 둘 다 무료이고 한 번에 100건까지 보낼 수 있습니다. 결과는 반드시 캐시하세요.

회원가입 때의 사업자 검증, 거래처 일괄 점검, ERP 연동은 국세청이 공공데이터포털에 개방한 「사업자등록정보 진위확인 및 상태조회 서비스」로 구현할 수 있습니다. BTSDB도 이 API를 씁니다. 신청부터 운영까지 실제로 부딪히는 지점을 정리했습니다.

준비 — 활용신청과 인증키
1
공공데이터포털(data.go.kr)에 가입하고 "국세청_사업자등록정보 진위확인 및 상태조회 서비스"를 검색해 활용신청을 합니다.
2
승인되면 마이페이지에서 인증키를 확인합니다. 키는 Encoding 키와 Decoding 키 두 가지로 제공됩니다.
3
URL에 직접 붙일 때는 Encoding 키를, HTTP 라이브러리가 파라미터를 인코딩해 줄 때는 Decoding 키를 씁니다. 둘을 바꿔 쓰면 인증 오류가 납니다.
두 기능의 차이
상태조회 (status)진위확인 (validate)
보내는 값사업자등록번호사업자등록번호 + 개업일자 + 대표자 성명 (상호 등은 선택)
돌려주는 값계속·휴업·폐업, 과세유형, 폐업일보낸 정보가 국세청 등록 내용과 일치하는지 여부
쓰임새거래처 모니터링, 일괄 점검회원가입 시 본인 사업자 확인
상태조회 요청
POST https://api.odcloud.kr/api/nts-businessman/v1/status?serviceKey={인코딩키}
Content-Type: application/json

{"b_no": ["1208800767", "1234567890"]}

번호는 하이픈 없이 10자리 문자열로 보냅니다. 응답의 data 배열에 번호별 결과가 들어 있습니다.

필드내용
b_stt / b_stt_cd계속사업자(01), 휴업자(02), 폐업자(03)
tax_type / tax_type_cd과세유형. 코드의 뜻은 과세유형 가이드 참고
end_dt폐업일 (YYYYMMDD). 폐업자가 아니면 빈 값
tax_type_change_dt최근 과세유형 전환일
invoice_apply_dt세금계산서 적용일
utcc_yn단위과세 전환 폐업 여부

등록되지 않은 번호는 오류가 아니라 정상 응답으로 옵니다. b_stt_cd가 비어 있고 tax_type에 "국세청에 등록되지 않은 사업자등록번호입니다"라는 문구가 들어 있습니다. 상태 코드가 비어 있는지로 판별하세요.

Python 예제
import requests

URL = "https://api.odcloud.kr/api/nts-businessman/v1/status"

def fetch_status(b_no, decoding_key):
    r = requests.post(URL, params={"serviceKey": decoding_key},
                      json={"b_no": [b_no]}, timeout=8)
    r.raise_for_status()
    items = r.json().get("data") or []
    if not items:
        return None                      # 응답 형식이 다르면 실패로 처리
    item = items[0]
    return {
        "registered": bool(item.get("b_stt_cd")),
        "status": item.get("b_stt"),
        "tax_type": item.get("tax_type"),
        "closed_on": item.get("end_dt") or None,
    }

requests가 params를 인코딩하므로 여기서는 Decoding 키를 넘깁니다.

진위확인 요청
POST https://api.odcloud.kr/api/nts-businessman/v1/validate?serviceKey={인코딩키}
Content-Type: application/json

{"businesses": [{"b_no": "1208800767", "start_dt": "20130801", "p_nm": "홍길동"}]}

응답의 valid가 01이면 일치, 02이면 불일치입니다. 개업일자와 대표자 성명은 사업자등록증에 적힌 그대로 보내야 합니다. 공동대표나 외국인 대표는 표기 방식 때문에 불일치가 나기 쉬우니 사용자에게 등록증 기준으로 입력하도록 안내하세요.

운영하면서 배운 것
자주 겪는 문제
직접 만들지 않아도 됩니다

한두 건 확인하는 정도라면 연동 없이 상단 검색창으로 충분합니다. 국세청 상태조회에 더해 고용·산재보험, 통신판매 등록, 국민연금 자료까지 한 페이지에서 볼 수 있습니다.

자주 묻는 질문
국세청 사업자 조회 API는 무료인가요?

무료입니다. 공공데이터포털에서 활용신청을 하고 인증키를 발급받아 사용합니다.

한 번에 몇 건까지 조회할 수 있나요?

상태조회와 진위확인 모두 한 번의 요청에 100건까지 배열로 보낼 수 있습니다.

상호나 대표자 이름도 받아 올 수 있나요?

받을 수 없습니다. 상태조회는 상태와 과세유형만 돌려주고, 진위확인은 보낸 정보가 맞는지만 알려줍니다. 상호는 다른 공공데이터에서 가져와야 합니다.

등록되지 않은 번호는 어떻게 응답하나요?

오류가 아니라 정상 응답으로 오며, 상태 코드가 비어 있고 과세유형 문구에 등록되지 않은 번호라는 안내가 들어 있습니다.

인증키 오류가 계속 납니다.

Encoding 키와 Decoding 키를 바꿔 쓴 경우가 가장 많습니다. HTTP 라이브러리가 파라미터를 인코딩한다면 Decoding 키를 넘겨야 합니다. 활용기간이 만료되지 않았는지도 확인하세요.

근거 자료

API 명세는 국세청과 공공데이터포털 사정에 따라 바뀔 수 있습니다. 연동할 때는 포털의 공식 문서를 기준으로 하세요.

FAMILY함께 운영하는 서비스