무엇을 조회하나요
볼타에 쌓인 내 사업자의 매출과 매입을 대시보드의 매출/매입 목록과 같은 단위로 조회합니다. 조회 대상은 API 키가 속한 사업자 한 곳입니다. 필요하면 수집을 앞당겨 달라고 요청할 수 있습니다.
응답에는 세금계산서와 계산서가 실립니다(
type이 HOMETAX_TAX_INVOICE). 볼타에서 발행한 문서와 홈택스에서 수집한 문서가 모두 들어갑니다. 현금영수증은 볼타에서 발행한 것도 싣지 않습니다.
이용 조건
포인트를 차감하지 않습니다. 대신 스탠다드 플랜 이상을 구독해야 합니다. 무료체험 중이어도 체험 중인 플랜이 스탠다드 이상이면 이용할 수 있습니다. 플랜이 모자라면 네 경로 모두402와 PLAN_UPGRADE_REQUIRED를 반환합니다. 볼타 대시보드의 결제 메뉴에서 플랜을 업그레이드한 뒤 다시 호출하세요.
홈택스 매출/매입 연동은 볼타 대시보드에서 먼저 하세요. 연동 방법은 홈택스에 등록된 매출세금계산서 가져오기와 홈택스에 등록된 매입세금계산서 가져오기를 참고하세요.
Bolta-Client-Reference-Id)가 필요 없습니다. Authorization 헤더에 Basic {apiKey}만 넣으면 됩니다. 인증은 인증 가이드를 참고하세요.
주요 제한
매출/매입 목록
두 경로의 파라미터와 응답 모양은 같습니다. 매출인지 매입인지는 경로가 정합니다.
기간을 주지 않으면 쌓인 전체 내역을 조회합니다.
아래는 테스트 키로 cursor 없이 호출한 매출 응답에서
102와 103을 뺀 예시입니다.
status에 따라 모양이 다릅니다.
id는 세금계산서가 아니라 매출 또는 매입 한 건의 식별자입니다.
HOMETAX_TAX_INVOICE는 국세청에 등록된 세금계산서와 계산서를 뜻합니다. 볼타에서 발행한 문서도 같은 값을 씁니다.
세금계산서 원문
taxInvoice는 매출과 매입이 같은 모양입니다.
금액은 원 단위 정수이고, 수정세금계산서는 음수일 수 있습니다. 수량과 단가는 정수면 소수점 없이, 소수면 소수 자리까지 옵니다.
당사자
supplier, supplied, trustee는 같은 모양입니다.
공급자와 수탁자는 항상
BUSINESS입니다. 공급받는자만 RESIDENT나 FOREIGN일 수 있고, 이때 taxRegistrationId, businessType, businessItem은 null입니다. 공급받는자에게 담당자가 둘이면 첫 번째 담당자를 manager에 싣습니다.
문서 구분
위수탁 문서는 따로 구분하지 않습니다.
trustee가 채워져 있으면 위수탁 문서입니다.
수정 사유
기재사항 착오 정정과 내국신용장 사후 개설은 취소분과 수정분 두 장이 한 쌍으로 발급됩니다. API는 두 장을 같은 사유로 보냅니다.
응답에 싣는 문서
API는 상세를 채우는 중인 문서를 돌려주지 않습니다. 홈택스에서 수집한 문서는 승인번호, 당사자, 금액을 먼저 받고 발급 시각, 주소, 업태, 담당자, 품목을 나중에 채웁니다. 볼타에서 발행한 세금계산서는 바로 나옵니다. 홈택스에서 수집한 문서는 작성일자 최신순으로 상세를 채운 뒤 나오므로, 과거 문서가 많으면 오래된 작성일자 문서가 뒤늦게 이어서 나옵니다. 상세 조회가 끝내 실패한 문서는 목록 조회 값만 싣고items를 비웁니다. 주소, 업태, 종목, 담당자도 null일 수 있습니다. 나중에 상세가 채워지면 같은 id로 다시 옵니다. ntsTransactionId, issuedAt, invoiceType은 항상 채워져 있습니다.
입금이나 지급 완료 여부, 메모, 라벨, 담당자 배정처럼 볼타 안에서만 쓰는 관리 정보는 싣지 않습니다.
순서와 cursor
API는 볼타에서 매출/매입이 바뀐 순서로 돌려줍니다. 작성일자나 수집 순서가 아닙니다. 과거 작성일자 문서, 상세 반영, 보관과 보관 해제가 뒤늦게 일어나도 놓치지 않으려면 이 순서대로 받으세요. 화면에 작성일자순으로 보여 주려면 받은 뒤writtenDate로 정렬하세요.
같은 id가 여러 번 올 수 있습니다. 받은 순서대로 id 기준으로 반영하세요.
ACTIVE: 같은id가 있으면 덮어쓰고, 없으면 추가하세요.REMOVED: 같은id가 있으면 지우고, 없으면 무시하세요.
수집 절차
- cursor 없이 호출하고,
hasMore가false가 될 때까지nextCursor로 이어 호출하세요. - 마지막
nextCursor를 저장하세요.hasMore가false여도nextCursor는 항상 채워집니다. 매출과 매입, 조건마다 cursor를 따로 저장하세요. - 다음 수집 때 저장한 cursor로 호출하세요. 그 사이 바뀐 매출/매입만 받습니다.
400과 INVALID_CURSOR를 반환합니다. type을 넣고 받은 cursor와 빼고 받은 cursor도 서로 다른 조건입니다. 조건을 바꿨거나 테스트 키에서 라이브 키로 옮겼다면 cursor 없이 처음부터 받으세요. limit은 페이지마다 바꿔도 됩니다.
새 값 처리
볼타는 새type, 새 필드, invoiceType이나 amendReason의 새 값을 예고 없이 더할 수 있습니다. 현금영수증 같은 새 증빙은 같은 경로에 새 type과 그에 맞는 하위 객체로 싣습니다.
- 모르는
type의 항목은 건너뛰고 처리를 이어가세요. - 모르는 필드는 무시하세요.
- 모르는 열거 값을 받아도 실패하지 말고 처리를 이어가세요.
REMOVED는 type 없이 오므로 id 기준으로 그대로 반영하면 됩니다.
동기화 요청
볼타는 매출/매입을 주기적으로 수집합니다. 대시보드에서 처음 연동할 때도 첫 수집을 바로 시작합니다. 방금 국세청에 올라간 문서가 급할 때만 동기화를 요청하세요.
API가
202 Accepted로 접수만 하고 수집은 비동기로 진행합니다. 수집 상태를 조회하는 경로는 없습니다. 수집이 끝나기를 기다리지 말고 저장한 cursor로 목록을 이어 받으세요. 요청 한도는 주요 제한을 참고하세요. 409와 422로 거절한 요청은 한도를 차감하지 않습니다. nextAvailableAt은 30분 간격만 반영하고 24시간 횟수는 반영하지 않습니다.
테스트 키
테스트 키는 구독과 관계없이 고정 샘플을 5분 지연 없이 돌려줍니다. 동기화를 요청해도 수집하지 않고 접수 응답만 돌려주며, 한도를 차감하지 않습니다. 샘플의 내 사업자는주식회사 볼타테스트(1234567890)입니다.
매출 (GET /v1/revenues)
101: 볼타에서 발행한 세금계산서. 품목 2개102: 홈택스에서 수집한 영세율 세금계산서103: 공급가액 변동 수정세금계산서(amendReason이CHANGE_SUPPLY_COST). 금액이 음수이고 품목의quantity,unitPrice가 null104: 대시보드에서 보관한 매출.103과 같은 시각에 바뀌어id순서로 뒤에 옴
GET /v1/expenses)
201: 홈택스에서 수집한 세금계산서202: 면세 계산서.totalTax와 품목의tax가 null203: 상세를 채울 수 없는 세금계산서. 주소, 업태, 종목,manager가 null이고items가 빈 배열
limit=2로 호출하면 cursor 넘김을 두 페이지로 확인할 수 있습니다. 기간 조건과 cursor는 라이브 키와 같은 규칙으로 동작합니다.
오류
전체 에러 코드는 에러 코드에서 확인하세요.
