먼저 정할 것 — 간편인증인가, 공동인증서인가
전자세금계산서는 발행 사업자 명의로 나갑니다. 인증 방식은 사업자 구분으로 정해집니다.
법인
공동인증서만 됩니다. 간편인증으로는 발급되지 않습니다.
business_type=corporate + certificate_id
개인사업자
간편인증 또는 공동인증서 중 편한 쪽
간편인증: name·birthday·phone·provider
공동인증서: business_type=personal + certificate_id
법인이 auth_type=simple 로 요청하면 발송 전에 SIMPLE_AUTH_CERT_REQUIRED(400, 무과금)로 끝납니다. 인증 요청이 나가지 않으므로 비용이 발생하지 않습니다.
법인 준비 순서 — 인증서 등록부터 첫 발급까지
아래 순서를 그대로 따라가면 됩니다. 1~4단계는 한 번만 하면 되고, 5단계부터가 실제 발급 호출입니다.
1
회원가입 후 API 인증키를 확인합니다. 모든 호출은 이 키로 인증합니다.
Authorization: Bearer <API_KEY>
2
법인 공동인증서를 인증서 파일과 개인키 파일로 준비합니다. 인증서 비밀번호도 필요합니다.
인증서 관리 화면 /etax/certificates
3
인증서를 등록합니다. 등록 응답의 certificate_id 를 다음 호출에 계속 씁니다. 첫 등록은 자동으로 기본 인증서가 됩니다.
POST /main/rest/etax_certificates/upload
multipart: cert_file·key_file·password·label
4
등록한 인증서로 로그인이 되는지 먼저 확인합니다. 여기서 실패하면 발급도 실패하므로 반드시 먼저 확인하세요.
POST /main/rest/etax_certificates/verify
{"certificate_id": 123}
5
발급을 접수합니다. 이 응답의 transactionId 를 6단계에 그대로 씁니다.
POST /rest/req_etax_issue
6
결과를 조회해 승인번호를 받습니다. 이 승인번호가 발급 사실의 근거입니다.
POST /rest/get_etax_issue
{"transactionId": "..."}
3단계 · 인증서 등록 요청
cert_file 은 인증서 파일, key_file 은 개인키 파일입니다. 두 파일과 비밀번호는 등록 직후 복호화해 보관하며 응답에 다시 나오지 않습니다.
form-data 전체 예제 보기
응답의 data.certificate.certificate_id 를 기록해 둡니다. 이 값이 이후 모든 호출의 연결고리입니다. 등록 목록은 GET /main/rest/etax_certificates/list 로 언제든 확인할 수 있습니다.
등록 목록·기본 인증서 확인
GET /main/rest/etax_certificates/list
없음
기본 인증서 바꾸기
POST /main/rest/etax_certificates/default
{"certificate_id": 123}
등록한 인증서 삭제
POST /main/rest/etax_certificates/delete
{"certificate_id": 123}
certificate_id 는 세션 로그인 계정에 귀속됩니다. API 인증키가 같은 계정의 키여야 그 인증서를 쓸 수 있습니다. 발급 요청에서 certificate_id 를 빼면 그 계정의 기본 인증서를 씁니다.
4단계 · 로그인 확인
form-data 전체 예제 보기
성공하면 확인된 사업자 정보가 가린 형태로 돌아옵니다. 실패하면 CERT_LOGIN_FAILED(424)이며, 인증서·비밀번호·발행 사업자를 확인해 다시 등록합니다. 이 단계가 통과해야 발급을 호출하세요.
발급 호출 — 두 번 부르면 끝
법인 공동인증서는 휴대폰 승인이 없습니다. 접수 응답을 받은 뒤 곧바로 결과조회를 부르면 됩니다. 개인 간편인증은 그 사이에 사용자가 휴대폰에서 승인합니다.
접수
/rest/req_etax_issue
business_type=corporate·certificate_id·businessNo·idempotency_key·buyerNo·buyerName·items
transactionId
결과
/rest/get_etax_issue
transactionId
승인번호·합계금액·전송상태
접수 예시 — 품목 1건
form-data 전체 예제 보기
supplyAmount·taxAmount 는 품목별로 넣고, 합계는 서버가 계산합니다. 합계를 따로 보낼 때는 품목 합계와 같아야 하며 다르면 ETAX_ISSUE_SUPPLY_MISMATCH(400, 무과금)로 거절됩니다.
idempotency_key 는 발급 1건당 하나입니다. 같은 키로 다시 부르면 새로 발급하지 않고 이미 발급된 결과를 돌려줍니다. 재시도할 때도 키를 바꾸지 마세요. 응답이 유실돼 결과를 확정할 수 없으면 ETAX_ISSUE_UNKNOWN_PENDING 이 오며, 이때는 새 키로 다시 발급하지 말고 장부에서 발급 여부를 확인합니다.
발급 전 무과금 초안 검증(선택)
실제 발급 전에 같은 본문을 POST /rest/req_etax_issue_preview 로 보내면 발급 요청을 보내지 않고 세액·합계 계산과 입력 검증만 합니다. 응답의 draft 에서 공급가액·세액·합계금액 을 확인한 뒤 실제 발급을 호출하세요. 수정발급 초안은 같은 엔드포인트에 kind=AMEND 또는 originApprovalNo 를 넣습니다. 이 호출은 과금되지 않습니다.
결과 예시
form-data 전체 예제 보기
조회 7종도 같은 인증서로 호출합니다
매출·매입 내역, 합계표, 통계, 거래처, 품목 조회도 발급과 같은 인증서를 씁니다. 인증서를 다시 등록할 필요 없이, 발급 요청에 넣던 business_type=corporate·certificate_id 를 조회 요청에도 그대로 넣으면 됩니다.
접수
POST /rest/req_etax_sales_list
POST /rest/req_etax_purchase_list
POST /rest/req_etax_sales_summary
POST /rest/req_etax_purchase_summary
POST /rest/req_etax_stats
POST /rest/req_etax_client_list
POST /rest/req_etax_item_list
business_type=corporate·certificate_id·businessNo·from·to
결과
POST /rest/get_etax_sales_list 등 접수와 같은 이름의 get_
transactionId
from·to 는 YYYYMMDD 이고, 생략하면 각각 최근 90일과 오늘입니다. 결과는 최초 1회만 과금되고 유효기간 안의 재조회는 무과금입니다.
매출내역 조회 예시
form-data 전체 예제 보기
법인은 간편인증 입력(name·birthday·phone·provider)을 넣지 않습니다. 넣어도 인증서 모드가 우선하며, business_type=corporate 에 auth_type=simple 을 함께 보내면 SIMPLE_AUTH_CERT_REQUIRED 로 거절됩니다.
인증요청 → 사용자 승인 → 정보조회 → 정보제공 4단계이며, 과금은 인증요청 발송 성공과 결과 최초 제공 두 번만 발생합니다. 그 사이 반복 조회는 무과금입니다.
/rest/req_etax_issue
20P · 인증요청 5분 유효
/rest/get_etax_issue
100P · 결과 24시간 보관
이용 전 확인
인증 요청이 사용자에게 발송되면 20P, 결과가 처음 반환될 때 결과 단가 100P가 차감됩니다. 입력 오류로 거절된 요청, 인증 거부·만료, 조회 실패는 결과 단가가 차감되지 않고, 결과를 받은 뒤 24시간 안의 재조회는 무료입니다.
사용자는 인증 요청 후 5분 안에 휴대폰에서 승인해야 합니다. 같은 계정·같은 상품으로 진행 중이거나 30초 안에 접수한 요청이 있으면 인증을 다시 보내지 않고 기존 transactionId를 돌려주며 과금하지 않습니다.
문서는 승인한 본인 명의로만 발급됩니다. name·birthDate·phone 은 휴대폰에서 승인할 본인의 정보여야 합니다.
사업자 상품이라 접수 전에 대표자 본인 확인을 합니다. 처음에는 business_no(10자리)와 agreed=true 를 함께 보내세요. 승인할 사람은 그 사업자의 대표자 본인이어야 합니다.
승인 뒤 결과가 준비되는 동안 COLLECTING 이 이어집니다. 발급 상품은 문서를 준비하는 데 1분 넘게 걸릴 수 있습니다. 결과조회는 5초 → 10초 → 20초 → 30초 간격으로 반복하고 resultAvailable=true 를 받으면 멈추세요.
인증키는 서버 환경변수에 보관하고 브라우저·앱에 넣지 마세요. 공통 규칙은 연동 전에 확인하세요를 참고하세요.
전자세금계산서 자료를 조회하기 위한 인증 요청입니다. 사용자에게 간편인증을 요청하고, 결과 조회에 쓸 transactionId 를 바로 돌려줍니다.
인증요청과 결과조회는 완전히 분리되어 있습니다. 이 호출은 인증요청만 보내고 transactionId 를 즉시 반환합니다. 결과는 사용자가 승인한 뒤 /rest/get_etax_issue 에 transactionId 를 넣어 확인합니다.
조회 항목은 엔드포인트로 정해지므로 별도로 지정하는 파라미터가 없습니다.
이 응답의 expiresAt 까지만 승인할 수 있습니다. 남은 시간을 화면에 표시하고, 만료되면 사용자가 다시 요청할 수 있게 해 주세요.
2단계 · 결과조회 엔드포인트
이 API 는 polling 용도입니다. 호출 자체는 언제든 무료이며, 실제 결과가 최초로 반환되는 1회에만 과금됩니다. 같은 transactionId 로 다시 조회하면 charged=false 로 추가 과금이 없습니다.
인증 대기(AUTH_WAITING)·조회 중(COLLECTING)·실패(FAILED)·만료(AUTH_EXPIRED) 응답은 과금되지 않습니다. 결과를 받을 때까지 안심하고 반복 조회하세요.
결과가 준비된 뒤에는 조회 시각 기준 24시간 동안 재조회할 수 있습니다. 이 기간의 재조회는 무과금입니다.
응답에는 실제 정보를 확인한 시각이 checkedAt 으로 포함됩니다. 저장해 둔 값을 돌려주는 것이 아니라 그 시점에 확인한 값입니다.
폴링은 resultAvailable=true 를 받는 순간 멈추세요. 최대 시간은 expiresAt(인증 대기)까지이고, 그 뒤로는 결과가 나올 때까지입니다. 자세한 값은 호출 제한과 재시도를 참고하세요.
조회 항목이 여러 개인 상품은 일부만 성공하면 PARTIAL_SUCCESS 로 반환하며, 이때도 실제 조회된 데이터가 있으면 최초 1회 과금됩니다. 기본은 결과 단가 전액이지만, 선택형 묶음은 요청에서 고른 조회 중 실제 받은 항목의 단가만 합산하고, 발급형 증명은 문서를 받은 항목만 청구합니다. 문서 미수신·기관 거절·PDF 파싱 실패는 무과금이며, 받은 항목이 하나도 없으면 charged=false·cost 0 으로 응답합니다. 어느 항목이 성공·실패했는지는 sources 에 표시됩니다.
결과조회를 호출할 때마다 보유 포인트가 이 상품의 결과 단가 이상인지 먼저 확인합니다. 모자라면 인증 대기 중이어도 HTTP 200 과 result.error(사용 가능한 포인트이 부족합니다.)로 거절되고 과금되지 않으므로, 충전한 뒤 같은 transactionId 로 다시 조회하세요.
결과 단가는 건당 100P입니다. 이 상품은 조회 기간 입력이 없어 기간 배수가 적용되지 않습니다.