KintsugiKintsugi
API reference / Changelog

API changelog

Every change to the Kintsugi API and every release, newest first. Breaking changes carry the Breaking change mark. Tenanted releases are dated, and you choose one with the Api-Version header.

Changes

2026-10-02

Breaking changes
Requires a non-empty userId for imports started with an API keyBreaking change
Breaking changeImports

On POST /imports/initiate and POST /imports/upload-urls, whether you send userId now depends on your credential. With an API key it is required and must not be blank: a missing userId answers 400 with code invalid_request instead of 422, and an empty or whitespace-only value, accepted before, is now refused the same way. With a signed-in user session, userId is optional and ignored, and the import is recorded under that user.

What to do
  • With an API key, always send a non-empty userId that names the person or process uploading.
  • Expect 400 with code invalid_request, not 422, when userId is missing.
Lists imports newest first
Behavior changeImports

GET /imports now lists imports by createdAt, newest first, so a new upload appears on the first page. Before, the order did not follow upload time. Paging stays stable while new imports arrive, and a cursor issued before this change answers 400 with code stale_cursor.

What to do
  • Expect the newest import first.
  • On stale_cursor, start again from the first page without a cursor.
Counts your imports
NewImports

GET /imports/summary returns total, the number of imports across every organization your credential can access, or one organization when you send a selector such as Organization-Id. Archived imports are counted, so total can be higher than the number GET /imports lists.

Releases

2026-07-21

LatestTenanted API

Introducing the Tenanted API

A fresh foundation for building on Kintsugi. The Tenanted API is versioned by date, and you choose the release you build against. It speaks one consistent dialect from end to end: clean paths, camelCase fields, exact decimal amounts, and a single error format. And it is built for scale, with one credential reaching every organization it owns.

Compared with v1

Topicv12026-07-21
VersioningThe /v1 path prefixThe Api-Version header, dated YYYY-MM-DD. Optional; without it, a request runs against the launch release
Paths/v1/transactions/transactions
Authenticationx-api-keyApi-Key. Endpoints that manage people accept a signed-in session token instead
Choosing an organizationx-organization-id, required on almost every requestOne credential reaches every organization it owns. Narrow a request with Organization-Id, Connection-Id, or Entity-Id
Field namessnake_casecamelCase
Money and ratesDecimal strings out, numbers or strings inDecimal strings at a fixed scale: amounts to 2 places, rates to 9
TimestampsNo single documented formatRFC 3339 in UTC, always ending in Z
ErrorsShapes vary by endpointOne envelope everywhere: code, message, requestId, and errors
PortfolioNot availablePortfolio and Portfolio Reseller endpoints, for partner accounts

Moving an integration from v1

  1. Send Api-Version: 2026-07-21 with every request, so your integration stays on this release until you decide to move.
  2. Drop /v1 from your paths.
  3. Send your key as Api-Key, and replace x-organization-id with Organization-Id wherever you target one organization.
  4. Rename fields to camelCase, and read every amount as a decimal string, never a float.
  5. Branch on the error code, not the message or the HTTP status, and quote requestId when you contact support.

Creating a transaction answers 202 Accepted straight away, and tax is calculated just after. Check processingStatus before you read the tax totals.

v1

Legacy

The original Kintsugi API, versioned in the path. It remains the default in these docs and is documented exactly as before, so existing integrations can keep running with confidence. New integrations should start on the Tenanted API.

Kintsugi API Changelog