먼저 정할 것 — 간편인증인가, 공동인증서인가
전자세금계산서는 발행 사업자 명의로 나갑니다. 인증 방식은 사업자 구분으로 정해집니다.
법인
공동인증서만 됩니다. 간편인증으로는 발급되지 않습니다.
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_status
20P · 인증요청 5분 유효
/rest/get_etax_status
60P · 결과 24시간 보관
이용 전 확인
인증 요청이 사용자에게 발송되면 20P, 결과가 처음 반환될 때 결과 단가 60P가 차감됩니다. 입력 오류로 거절된 요청, 인증 거부·만료, 조회 실패는 결과 단가가 차감되지 않고, 결과를 받은 뒤 24시간 안의 재조회는 무료입니다.
사용자는 인증 요청 후 5분 안에 휴대폰에서 승인해야 합니다. 같은 계정·같은 상품으로 진행 중이거나 30초 안에 접수한 요청이 있으면 인증을 다시 보내지 않고 기존 transactionId를 돌려주며 과금하지 않습니다.
사업자 상품이라 접수 전에 대표자 본인 확인을 합니다. 처음에는 business_no(10자리)와 agreed=true 를 함께 보내세요. 승인할 사람은 그 사업자의 대표자 본인이어야 합니다.
승인 뒤 결과가 준비되는 동안 COLLECTING 이 이어집니다. 결과조회는 5초 → 10초 → 20초 → 30초 간격으로 반복하고 resultAvailable=true 를 받으면 멈추세요.
인증키는 서버 환경변수에 보관하고 브라우저·앱에 넣지 마세요. 공통 규칙은 연동 전에 확인하세요를 참고하세요.
전자세금계산서 전송 상태 자료를 조회하기 위한 인증 요청입니다. 사용자에게 간편인증을 요청하고, 결과 조회에 쓸 transactionId 를 바로 돌려줍니다.
인증요청과 결과조회는 완전히 분리되어 있습니다. 이 호출은 인증요청만 보내고 transactionId 를 즉시 반환합니다. 결과는 사용자가 승인한 뒤 /rest/get_etax_status 에 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 로 다시 조회하세요.
결과 단가는 건당 60P입니다. 이 상품은 조회 기간 입력이 없어 기간 배수가 적용되지 않습니다.