매출 내역 조회
볼타에 쌓인 매출을 볼타에서 바뀐 순서로 반환합니다. 작성일자 순서가 아닙니다. 대시보드에 보이는 매출은 ACTIVE로, 보관하거나 비활성이 되어 안 보이게 된 매출은 id만 담은 REMOVED로 옵니다. 같은 id가 여러 번 올 수 있으니 받은 순서대로 id 기준으로 덮어쓰거나 지우세요. 홈택스 상세를 채우는 중인 문서는 싣지 않습니다.
items가 비어 있어도 hasMore가 true일 수 있으니 hasMore를 보고 이어 호출하세요. nextCursor는 마지막 페이지에서도 채워집니다. 이 값을 저장해 두었다가 다음에 넘기면 그 사이 바뀐 매출만 받습니다. 최근 5분 안에 바뀐 매출은 다음 호출로 미룹니다. 스탠다드 플랜 이상을 구독해야 하며 포인트는 차감하지 않습니다. 매출/매입 내역 조회 가이드
curl --request GET \
--url https://xapi.bolta.io/v1/revenues \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://xapi.bolta.io/v1/revenues"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://xapi.bolta.io/v1/revenues', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://xapi.bolta.io/v1/revenues",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://xapi.bolta.io/v1/revenues"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://xapi.bolta.io/v1/revenues")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://xapi.bolta.io/v1/revenues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"items": [
{
"status": "ACTIVE",
"id": "101",
"type": "HOMETAX_TAX_INVOICE",
"taxInvoice": {
"ntsTransactionId": "20260901-10000000-00000101",
"invoiceType": "TAX_INVOICE",
"purpose": "CLAIM",
"writtenDate": "2026-09-01",
"issuedAt": "2026-09-01T05:12:00Z",
"supplier": {
"identificationNumberType": "BUSINESS",
"identificationNumber": "1234567890",
"taxRegistrationId": null,
"organizationName": "주식회사 볼타테스트",
"representativeName": "정대표",
"address": "서울특별시 테스트구 테스트로 1",
"businessType": "서비스",
"businessItem": "소프트웨어 개발",
"manager": {
"name": "홍길동",
"email": "tax@example.com",
"telephone": "02-0000-0000"
}
},
"supplied": {
"identificationNumberType": "BUSINESS",
"identificationNumber": "1111111111",
"taxRegistrationId": null,
"organizationName": "주식회사 테스트고객",
"representativeName": "테스트대표",
"address": "경기도 테스트시 샘플로 2",
"businessType": "도매",
"businessItem": "도소매",
"manager": {
"name": "김담당",
"email": "buyer@example.com",
"telephone": null
}
},
"trustee": null,
"totalSupplyCost": 1000000,
"totalTax": 100000,
"totalAmount": 1100000,
"paymentMeans": {
"cash": null,
"check": null,
"bankBill": null,
"accountReceivable": 1100000
},
"description": null,
"amendReason": null,
"importDeclaration": null,
"items": [
{
"date": "2026-09-01",
"name": "컨설팅",
"specification": null,
"quantity": 1,
"unitPrice": 600000,
"supplyCost": 600000,
"tax": 60000,
"description": null
},
{
"date": "2026-09-01",
"name": "교육",
"specification": null,
"quantity": 2,
"unitPrice": 200000,
"supplyCost": 400000,
"tax": 40000,
"description": null
}
]
}
},
{
"status": "REMOVED",
"id": "104"
}
],
"nextCursor": "djI6MTc4ODU3MzYwMDAwMDAwMDoxMDQ6MXVpMmNn",
"hasMore": false
}인증
API 키 뒤에 콜론을 붙여 Base64로 인코딩해 헤더에 넣으세요. Username에 API 키를 입력하고 Password는 비워두세요.
쿼리 매개변수
거래일 시작. YYYY-MM-DD 형식의 KST 날짜이며 이 날을 포함합니다. 세금계산서는 작성일자로 거릅니다.
거래일 끝. YYYY-MM-DD 형식의 KST 날짜이며 이 날을 포함합니다.
증빙 종류
증빙 종류. HOMETAX_TAX_INVOICE: 국세청에 등록된 세금계산서와 계산서. 볼타에서 발행한 문서와 홈택스에서 수집한 문서가 같은 값을 씁니다. 새 값이 더해질 수 있으니 모르는 값의 항목은 건너뛰세요.
HOMETAX_TAX_INVOICE 이전 응답의 nextCursor. 받은 값을 그대로 보내세요. cursor는 받을 때의 경로, 조건(from, to, type), 키 모드(테스트, 라이브)에 묶입니다. 조건이나 키 모드를 바꿨다면 cursor 없이 처음부터 다시 조회하세요.
한 번에 받을 최대 건수
1 <= x <= 200응답
조회 성공
매출 또는 매입 변경 내역 조회 결과
볼타에서 매출이나 매입이 바뀐 순서대로 담은 항목. 작성일자 순서가 아닙니다.
status에 따라 모양이 다른 매출이나 매입 항목. ACTIVE는 type과 그에 맞는 하위 객체를, REMOVED는 status와 id만 담습니다.
- Option 1
- Option 2
Show child attributes
Show child attributes
다음 호출에 넘길 cursor. 마지막 페이지에서도 채워지니 저장해 두었다가 다음 수집 때 넘기세요.
지금 바로 이어 받을 내역이 더 있는지 여부. items가 비어 있어도 true일 수 있습니다.
curl --request GET \
--url https://xapi.bolta.io/v1/revenues \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://xapi.bolta.io/v1/revenues"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://xapi.bolta.io/v1/revenues', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://xapi.bolta.io/v1/revenues",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://xapi.bolta.io/v1/revenues"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://xapi.bolta.io/v1/revenues")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://xapi.bolta.io/v1/revenues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"items": [
{
"status": "ACTIVE",
"id": "101",
"type": "HOMETAX_TAX_INVOICE",
"taxInvoice": {
"ntsTransactionId": "20260901-10000000-00000101",
"invoiceType": "TAX_INVOICE",
"purpose": "CLAIM",
"writtenDate": "2026-09-01",
"issuedAt": "2026-09-01T05:12:00Z",
"supplier": {
"identificationNumberType": "BUSINESS",
"identificationNumber": "1234567890",
"taxRegistrationId": null,
"organizationName": "주식회사 볼타테스트",
"representativeName": "정대표",
"address": "서울특별시 테스트구 테스트로 1",
"businessType": "서비스",
"businessItem": "소프트웨어 개발",
"manager": {
"name": "홍길동",
"email": "tax@example.com",
"telephone": "02-0000-0000"
}
},
"supplied": {
"identificationNumberType": "BUSINESS",
"identificationNumber": "1111111111",
"taxRegistrationId": null,
"organizationName": "주식회사 테스트고객",
"representativeName": "테스트대표",
"address": "경기도 테스트시 샘플로 2",
"businessType": "도매",
"businessItem": "도소매",
"manager": {
"name": "김담당",
"email": "buyer@example.com",
"telephone": null
}
},
"trustee": null,
"totalSupplyCost": 1000000,
"totalTax": 100000,
"totalAmount": 1100000,
"paymentMeans": {
"cash": null,
"check": null,
"bankBill": null,
"accountReceivable": 1100000
},
"description": null,
"amendReason": null,
"importDeclaration": null,
"items": [
{
"date": "2026-09-01",
"name": "컨설팅",
"specification": null,
"quantity": 1,
"unitPrice": 600000,
"supplyCost": 600000,
"tax": 60000,
"description": null
},
{
"date": "2026-09-01",
"name": "교육",
"specification": null,
"quantity": 2,
"unitPrice": 200000,
"supplyCost": 400000,
"tax": 40000,
"description": null
}
]
}
},
{
"status": "REMOVED",
"id": "104"
}
],
"nextCursor": "djI6MTc4ODU3MzYwMDAwMDAwMDoxMDQ6MXVpMmNn",
"hasMore": false
}