Skip to main content

무엇을 조회하나요

볼타에 쌓인 내 사업자의 매출과 매입을 대시보드의 매출/매입 목록과 같은 단위로 조회합니다. 조회 대상은 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에 싣습니다.
RESIDENT의 identificationNumber는 주민등록번호 원문입니다. 받은 값은 암호화해 저장하고 로그에 남기지 마세요.

문서 구분

위수탁 문서는 따로 구분하지 않습니다. trustee가 채워져 있으면 위수탁 문서입니다.

수정 사유

기재사항 착오 정정과 내국신용장 사후 개설은 취소분과 수정분 두 장이 한 쌍으로 발급됩니다. API는 두 장을 같은 사유로 보냅니다.

응답에 싣는 문서

API는 상세를 채우는 중인 문서를 돌려주지 않습니다. 홈택스에서 수집한 문서는 승인번호, 당사자, 금액을 먼저 받고 발급 시각, 주소, 업태, 담당자, 품목을 나중에 채웁니다. 볼타에서 발행한 세금계산서는 바로 나옵니다. 홈택스에서 수집한 문서는 작성일자 최신순으로 상세를 채운 뒤 나오므로, 과거 문서가 많으면 오래된 작성일자 문서가 뒤늦게 이어서 나옵니다. 상세 조회가 끝내 실패한 문서는 목록 조회 값만 싣고 items를 비웁니다. 주소, 업태, 종목, 담당자도 null일 수 있습니다. 나중에 상세가 채워지면 같은 id로 다시 옵니다. ntsTransactionId, issuedAt, invoiceType은 항상 채워져 있습니다. 입금이나 지급 완료 여부, 메모, 라벨, 담당자 배정처럼 볼타 안에서만 쓰는 관리 정보는 싣지 않습니다.

순서와 cursor

API는 볼타에서 매출/매입이 바뀐 순서로 돌려줍니다. 작성일자나 수집 순서가 아닙니다. 과거 작성일자 문서, 상세 반영, 보관과 보관 해제가 뒤늦게 일어나도 놓치지 않으려면 이 순서대로 받으세요. 화면에 작성일자순으로 보여 주려면 받은 뒤 writtenDate로 정렬하세요. 같은 id가 여러 번 올 수 있습니다. 받은 순서대로 id 기준으로 반영하세요.
  • ACTIVE: 같은 id가 있으면 덮어쓰고, 없으면 추가하세요.
  • REMOVED: 같은 id가 있으면 지우고, 없으면 무시하세요.
매입은 볼타가 지급 완료 여부를 다시 판정할 때도 순서가 뒤로 옮겨집니다. 그래서 내용이 같은 매입이 한 번 더 올 수 있습니다. 덮어쓰면 됩니다.

수집 절차

  1. cursor 없이 호출하고, hasMore가 false가 될 때까지 nextCursor로 이어 호출하세요.
  2. 마지막 nextCursor를 저장하세요. hasMore가 false여도 nextCursor는 항상 채워집니다. 매출과 매입, 조건마다 cursor를 따로 저장하세요.
  3. 다음 수집 때 저장한 cursor로 호출하세요. 그 사이 바뀐 매출/매입만 받습니다.
items가 비어 있어도 hasMore가 true일 수 있습니다. items가 아니라 hasMore를 보고 이어 호출하세요.
cursor는 받은 값 그대로 보내세요. cursor를 받을 때와 경로, 조건, 키 모드가 다르면 API가 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가 null
  • 104: 대시보드에서 보관한 매출. 103과 같은 시각에 바뀌어 id 순서로 뒤에 옴
매입 (GET /v1/expenses)
  • 201: 홈택스에서 수집한 세금계산서
  • 202: 면세 계산서. totalTax와 품목의 tax가 null
  • 203: 상세를 채울 수 없는 세금계산서. 주소, 업태, 종목, manager가 null이고 items가 빈 배열
limit=2로 호출하면 cursor 넘김을 두 페이지로 확인할 수 있습니다. 기간 조건과 cursor는 라이브 키와 같은 규칙으로 동작합니다.

오류

전체 에러 코드는 에러 코드에서 확인하세요.

관련 문서