API changelog
Every change to the Kintsugi API and every release, newest first. Breaking changes carry the mark. Tenanted releases are dated, and you choose one with the Api-Version header.
Changes
2026-10-05
Requires a unique name when a portfolio creates an organizationOrganizations
When a portfolio credential creates an organization with POST /organizations, the name must now be unique, ignoring letter case. A name already in use answers 409 with code conflict and the message An organization with this name already exists. Before, the 2026-07-21 release accepted any name, including one already in use or one that differed only in letter case, such as acme beside Acme. Creating an organization from a user session without a portfolio is unchanged.
- Handle
409with codeconflictby asking for a different name. - Do not retry a refused name with different letter case: it is refused the same way.
Sets a billing mode and business websites when a portfolio creates an organizationOrganizations
With a portfolio credential, POST /organizations accepts two optional fields. billingMode, PARTNER_MANAGED or CLIENT_MANAGED, sets how the new organization is billed; a portfolio that already has a billing type passes it on and the field is ignored, as it is for a test portfolio. businessWebsites lists the organization's websites: an address without a scheme is saved as https, blank entries and duplicates are dropped, and only http and https addresses are accepted. An invalid address or more than 10 unique addresses answers 422. Sending either field from a user session that is not acting for a portfolio also answers 422.
Adds filing metrics to the organizations listOrganizations
GET /organizations accepts expand=filingMetrics, which adds a filingMetrics object to each organization: totalFilings, filed, pendingApproval (unfiled returns not yet past their due date), overdue (unfiled returns past their due date) and liabilityByCurrency, one { currency, amount } entry per currency. Returns marked do not file are left out of pendingApproval and overdue. Currencies are listed in code order, with returns that have no currency yet last as currency: null, and amounts are decimal strings that are never converted between currencies. An organization with no returns gets zero counts and an empty liabilityByCurrency. Without expand the response is unchanged, an unknown expand value answers 422, and a cursor stays valid with or without expand.
- Pass
expand=filingMetricsto get each organization's filing status in the same call as the list.
Releases
2026-07-21
LatestTenanted APIIntroducing 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
| Topic | v1 | 2026-07-21 |
|---|---|---|
| Versioning | The /v1 path prefix | The Api-Version header, dated YYYY-MM-DD. Optional; without it, a request runs against the launch release |
| Paths | /v1/transactions | /transactions |
| Authentication | x-api-key | Api-Key. Endpoints that manage people accept a signed-in session token instead |
| Choosing an organization | x-organization-id, required on almost every request | One credential reaches every organization it owns. Narrow a request with Organization-Id, Connection-Id, or Entity-Id |
| Field names | snake_case | camelCase |
| Money and rates | Decimal strings out, numbers or strings in | Decimal strings at a fixed scale: amounts to 2 places, rates to 9 |
| Timestamps | No single documented format | RFC 3339 in UTC, always ending in Z |
| Errors | Shapes vary by endpoint | One envelope everywhere: code, message, requestId, and errors |
| Portfolio | Not available | Portfolio and Portfolio Reseller endpoints, for partner accounts |
Moving an integration from v1
- Send
Api-Version: 2026-07-21with every request, so your integration stays on this release until you decide to move. - Drop
/v1from your paths. - Send your key as
Api-Key, and replacex-organization-idwithOrganization-Idwherever you target one organization. - Rename fields to camelCase, and read every amount as a decimal string, never a float.
- Branch on the error
code, not the message or the HTTP status, and quoterequestIdwhen 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
LegacyThe 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.