Skip to main content

What you can retrieve

Retrieve the revenue and expense records of your own business in Bolta, in the same units as the revenue and expense lists in the dashboard. Each API key covers the one business it belongs to. You can also ask Bolta to collect sooner. Responses carry tax invoices and invoices (type is HOMETAX_TAX_INVOICE). They include both documents issued through Bolta and documents collected from Hometax. Cash receipts are not included, even those issued through Bolta.

Requirements

These calls deduct no points. Instead, you need a Standard plan or higher. A free trial also qualifies when the trial plan is Standard or higher. When your plan does not qualify, all four paths return 402 with PLAN_UPGRADE_REQUIRED. Upgrade your plan from the billing menu in the Bolta dashboard, then call again.
Connect Hometax revenue and expense collection in the Bolta dashboard first.
A business that only issues through Bolta without connecting Hometax can still retrieve the tax invoices it issued as revenue. After you disconnect, the records already stored remain available. None of the four paths needs issuer registration, a certificate, or Bolta-Client-Reference-Id. Send Basic {apiKey} in the Authorization header. See the authentication guide.

Key limits

Revenue and expense lists

Both paths take the same parameters and return the same shape. The path decides whether an item is revenue or expense.
Without a date range, the API returns every stored record. The example below is the test key’s revenue response without a cursor, with 102 and 103 omitted.
The item shape depends on status. id identifies one revenue or expense record, not the tax invoice. HOMETAX_TAX_INVOICE means a tax invoice or invoice registered with the National Tax Service (NTS). Documents issued through Bolta use the same value.

Tax invoice

taxInvoice has the same shape for revenue and expense. Amounts are integers in KRW and can be negative on amended tax invoices. Quantity and unit price come without a decimal point when they are whole numbers, and with their decimal places otherwise.

Parties

supplier, supplied, and trustee share the same shape. The supplier and trustee are always BUSINESS. Only the recipient can be RESIDENT or FOREIGN, and then taxRegistrationId, businessType, and businessItem are null. When the recipient has two managers, manager holds the first.
For RESIDENT, identificationNumber is the raw resident registration number. Encrypt it at rest and keep it out of your logs.

Document types

Brokered documents have no separate type. A document is a brokered document when trustee is set.

Amendment reasons

Correction of Error in Entries and Local Letter of Credit Opened after Supply amendments are issued as a pair: a cancelling document and a corrected document. The API sends both with the same reason.

Documents in the response

The API does not return documents whose details are still being filled. For documents collected from Hometax, Bolta receives the approval number, parties, and amounts first, and fills the issuance time, addresses, business types, managers, and line items later. Tax invoices issued through Bolta appear right away. Documents collected from Hometax appear after their details are filled, newest write date first, so with many past documents the older ones keep arriving later. When the detail lookup fails for good, the API sends the document with list values only and an empty items. Addresses, business types, business items, and managers can also be null. If the details are filled later, the document arrives again with the same id. ntsTransactionId, issuedAt, and invoiceType are always set. Management data that exists only in Bolta, such as payment status, memos, labels, and assignees, is not included.

Order and cursor

The API returns records in the order they changed in Bolta, not by write date or collection order. Follow this order so you do not miss past-dated documents, detail updates, archiving, or unarchiving that happen later. To show records by write date, sort by writtenDate after you receive them. The same id can arrive more than once. Apply items by id in the order you receive them.
  • ACTIVE: Overwrite the item with the same id, or add it if none exists.
  • REMOVED: Delete the item with the same id, or ignore it if none exists.
An expense also moves back in the order when Bolta re-evaluates its payment status, so the same expense can arrive again with identical content. Overwrite it.

Collection steps

  1. Call without a cursor, then keep calling with nextCursor until hasMore is false.
  2. Save the last nextCursor. The API fills nextCursor even when hasMore is false. Save separate cursors for revenue, expense, and each set of filters.
  3. On your next collection, call with the saved cursor. You receive only the records that changed since then.
hasMore can be true even when items is empty. Decide whether to continue from hasMore, not from items.
Send the cursor exactly as received. When the path, filters, or key mode differ from when the cursor was issued, the API returns 400 with INVALID_CURSOR. A cursor issued with type and one issued without it count as different filters. After you change the filters or move from a test key to a live key, start over without a cursor. You can change limit on any page.

Handling new values

Bolta can add new type values, new fields, and new invoiceType or amendReason values without notice. New evidence types such as cash receipts arrive on the same paths with a new type and a matching object.
  • Skip items with an unknown type and keep processing.
  • Ignore unknown fields.
  • Keep processing when you receive an unknown enum value.
REMOVED arrives without type, so apply it by id as usual.

Sync request

Bolta collects revenue and expense records periodically, and starts the first collection as soon as you connect in the dashboard. Request a sync only when you need a document just registered with the NTS.
The API only accepts the request with 202 Accepted, and the collection runs asynchronously. There is no path to check collection status. Instead of waiting for it to finish, continue fetching the list with your saved cursor. See Key limits for the request limits. Requests rejected with 409 or 422 do not count toward the limit. nextAvailableAt reflects only the 30-minute interval, not the 24-hour count.

Test key

Test keys return fixed samples regardless of your subscription, without the 5-minute delay. Sync requests do not collect anything, only return an accepted response, and use no quota. The sample’s own business is 주식회사 볼타테스트 (1234567890). Revenue (GET /v1/revenues)
  • 101: Tax invoice issued through Bolta, with two line items
  • 102: Zero-rate tax invoice collected from Hometax
  • 103: Change in Supply Cost amendment (amendReason is CHANGE_SUPPLY_COST). Negative amounts, and quantity and unitPrice are null on the line item
  • 104: Revenue archived in the dashboard. It changed at the same time as 103 and comes after it by id
Expense (GET /v1/expenses)
  • 201: Tax invoice collected from Hometax
  • 202: Tax-exemption invoice. totalTax and the line item tax are null
  • 203: Tax invoice whose details cannot be filled. Address, business type, business item, and manager are null, and items is empty
Call with limit=2 to see cursor paging across two pages. Date filters and cursors follow the same rules as with a live key.

Errors

See Error codes for the full list.