Changelog
All notable changes to the Kryptos Connect API.
September 2026
Provider catalogue no longer exposes connector internals
GET /v1/providers and GET /v1/providers/{id} are a public, unauthenticated catalogue, but each
functions[] entry was carrying the connector's operating configuration with it. Those three fields
are gone:
endpoint— the upstream URL the function callsdetails— its rate-limit, window and batching parametersstatus— the raw result of the last health probe, including the upstream's error text
Function health is preserved as two derived booleans, enabled and operational — see
Providers. If you built an outage badge on
status.on / status.status / status.error, operational combined with is_base is the
replacement: any base function not operational is a full outage, a non-base one is partial.
name, public_name, is_base and categories are unchanged, as is every other provider field.
Integrations — a lighter list, and an opt-in tally
GET /v1/integrations was returning the entire provider catalogue row on every item, which a
workspace with ten Ethereum wallets received ten times over. On the list, the nested provider is now
just what a row renders:
{ "id": "binance", "name": "Binance", "publicName": "Binance", "logo": "https://...", "type": "exchange" }
GET /v1/integrations/{id} is unchanged and still returns the complete provider, including
importMethods, credentialFields, capabilities, walletLimitations, integrationInfo,
metadata and functions. If you need the full catalogue while paging the list, fetch it once from
GET /v1/providers and join on providerId.
providerCounts is now opt-in. It is a workspace-wide tally rather than a summary of the page you
asked for, and it cost a separate aggregate on every list call — pass ?includeProviderCounts=true
to get it back, or read GET /v1/integrations/counts-by-provider,
which answers the same question directly.
Three undocumented fields also stopped being returned: functionConfig, and the createdBy /
updatedBy identifiers. They were never part of this reference. deletedAt and metadataUpdatedAt
are documented and are unaffected.
User profile no longer returns the Stripe customer id
GET /v1/users/me was returning stripeCustomerId, the billing identity behind the account. It was
never documented and is no longer returned. Every documented profile field is unchanged.
Documentation corrections
These describe behaviour that was already the case — the docs were wrong, not the API.
- API keys reach
/v1/users/*only.GET /v1/holdingsand every other resource endpoint accept a bearer token and rejectx-api-keywith401. The overview and API-key pages both showed a holdings example that never worked. - API keys are bound to a workspace. A key carries its workspace from creation; you do not pass
?wid=, and passing a different workspace id returns403. The previous text said the opposite. - Contacts and counterparties nest their pagination under
metaas{ total, page, limit }. The overview described it as spread besidesuccess. credentialValidationStatusandimportMethodwere never returned byGET /v1/integrationsand have been removed from the field table.credentialsis returned by the list, not only the single-integration read.- Counterparties, spam and the
fields=summaryintegration projection now have response-field tables. - Transactions:
explorerLinkSrc,isMergedTrx,trxsMergedandisSplittedare now documented. - Workspace:
customAssetPricesEnabled,organizationId,lastSyncTimeandlastAccountingCalculationare now documented on the single-workspace read.
August 2026
Webhooks — deliveries are now attributable
- Every delivery carries
grant_idandworkspace_idas top-level envelope fields, next toid,eventandtimestamp. They are the same two ids returned by token exchange, so a partner can map a delivery to one of their own customers. They are body fields, not headers, and are not insidedata. - Breaking — fan-out is per grant, not per developer workspace. If two of your OAuth clients each
hold a live grant on the same end user, that user's events are now delivered twice, once per grant,
each with its own
grant_idand deliveryid. Previously the two collapsed into one delivery. Deduplicating onX-Webhook-Idstill works for retries and will not collapse these. datacontains nouid. It never did in v2 — the docs described a v1 field. Usegrant_id.walletIdis not a substitute:integration.createdarrives before you have stored a wallet id, and thetransfer_detection.*/costbasis.*payloads carry no wallet id at all.- Fixed:
integration.updatedandintegration.failedshippedpublicAddress: ""for every wallet. Address-based integrations now report their real address. Note the field is an empty string, nevernull, for exchanges, OAuth and CSV integrations. - Documented:
integration.deletedreportsstatus: "DELETED", andisContractis alwaysfalse(v2 does not perform contract detection).
Sync — telling a truncated sync from a failed one
- New
limitReached(boolean) onGET /v1/sync/{syncId}, on every entry ofGET /v1/sync, and onlatestSyncinGET /v1/integrations.truemeans the run stopped early because the workspace hit its transaction limit: rows fetched before the cut are saved, the rest were never read. A failed connector function produces the samepartially_syncedstatus, which is why this is a separate field rather than something to infer frommessage. Raising the cap does not backfill on its own — the integration has to be re-synced withsyncMode: resync_from_start. This is the v2 replacement for v1'slimitExceeded. - Fixed:
GET /v1/sync/{syncId}returnedsummary: undefinedfor every sync. It now returns the per-function report.
Transaction limits
PATCH /developer/grants/{grantId}/transaction-limitnow returnsprevious_transaction_limitandprevious_enable_limiter, so the response alone tells you what the cap was as well as what it became.- A limit change now re-syncs the user's wallets. When the call actually changes the cap, every
re-syncable integration in the workspace is queued for a full re-fetch from the start — you no longer
need to detect the change and request it yourself. The new
resyncfield reports{ triggered, failed, skipped }, or isnullwhen the request changed nothing. Custom wallets, sync-disabled accounts and CSV-fed integrations are counted inskipped, along with anything past the 100-per-call cap. - A workspace's cap can be read back from
GET /v1/workspaces/{workspace_id}, whoselimitsblock carrieseffectiveTransactionLimit,currentTransactionCountandremainingTransactions.
Breaking — new API base URL
The data API has moved to a new backend. The base URL is now https://api-v2.kryptos.io, and the
/api path prefix is gone: https://connect.kryptos.io/api/v1/holdings becomes
https://api-v2.kryptos.io/v1/holdings.
X-Client-IdandX-Client-Secretare no longer used on data calls.Authorization: Beareris the only header needed. Client credentials are still required on the Kryptos Connect link-token and token-exchange endpoints.user_idandtimestampremoved from response envelopes.- Endpoints renamed:
/v1/defi-holdings→/v1/defi,/v1/nft-holdings→/v1/nfts,/v1/userinfo→/v1/users/me,/v1/transactions/label-types→/v1/labels,/v1/integrations/providers→/v1/providers,/v1/counterparties→/v1/counter-parties. - Holdings fields renamed:
costbasis→costBasis,roi→roiPercentage(nownullrather than0when cost basis is unknown), and24hrChangesplit intochange24h(absolute) andchange24hPercentage. New:assetId,costPerUnit,transactionCount,isSpam. - The inline holdings
summaryblock is gone —GET /v1/holdingsreturns a top-leveltotalValue. - Ledger quantities are decimal strings, not numbers, to preserve 18-decimal precision.
- Removed: the entire
/v0/*surface,GET /v1/profilingandGET /v1/holdings/graph.
See Migrating from the previous API for the complete mapping and a migration checklist.
New
GET /v1/ledgersandGET /v1/ledgers/{id}— query transaction legs directly across transactions, with running balances and per-leg accounting figures.GET /v1/calculated-balances— ledger-derived balances withisMissingTransactionHistoryandlastLedgerTimestampreconciliation flags.GET /v1/spam— the assets being excluded from balances and totals.GET /v1/integrations/{id}/assets— per-asset breakdown for one connected account.GET /v1/portfolios— group accounts, and scope any portfolio query with/portfolio/{portfolioId}.- Richer transaction filtering: exclusion filters (
notLabels,notWalletIds, …) and data-quality flags (isMissingTransaction,hasMissingPrice,hasMissingAsset) that replace the previous reconciliation endpoints. x-api-keyis now accepted on the portfolio and transaction endpoints, not just the user profile.
Documentation
- Kryptos Connect — Guest and Linked users are now explained rather than assumed, including why
GET /v1/users/mereturns404for a Guest and which sessions accept developer transaction limits. - Sandbox mode has been removed from the product and from these docs.
- MCP Server documentation consolidated into a single install-and-go page.
July 2026
Enhancements
GET /v1/holdings— calculated balances (quantities derived from the transaction ledger, e.g. CSV uploads / custom wallets) are now excluded by default; the holdings list and itssummarynet-worth totals reflect live balances only. Pass?calculatedBalances=trueto instead return the ledger-computed balances (thecalculatedBalancesset, maintained for every user).
May 2026
New
- Web SDK & Mobile SDK — Integration form pre-fill via
extraConfig={{ prefill: { address, apiKey, secretKey, password, accountName } }}onKryptosConnectButton. For EVM wallets, supplying anaddressautomatically triggers chain detection and pre-selects all detected chains. - Demo Apps — Live interactive demos published at demo-connect.kryptos.io.
Enhancements
GET /v1/userinfo— theprofilescope response now includestransaction_limit(number | null). Reflects the effective limit applied to the user: per-user override if set, otherwise the workspace default, otherwise the platform default (100,000).nullmeans the limiter is disabled and no cap applies.GET /v1/integrations— each integration now includes a newlastSyncLogDetailsfield alongsidelastSyncLog. WherelastSyncLogis the flat{ stage: status }map (unchanged),lastSyncLogDetailscarries{ status, message?, limitExceeded? }per stage so clients can show stage-specific failure reasons (e.g. which sync step hit the transaction-import limit) without parsing the wallet-levelmessage. The existinglastSyncLog,message, andlimitExceededfields are unchanged.
Breaking
- Web SDK & Mobile SDK —
KryptosConnectProviderhas been removed. CallKryptosConnect.init({ clientId, appName, theme, language, authMethods })once at app startup instead. Apps still using the provider will not render correctly. - Mobile SDK —
react-native-svgand all WalletConnect dependencies (@reown/appkit-react-native,@walletconnect/react-native-compat, etc.) are no longer required and must be removed. The only peer dependency isreact-native-webview. - Web SDK & Mobile SDK — CSS theming is now done via the
cssVarsoption inKryptosConnect.init()using--kc-*CSS custom properties. Previous workarounds targeting internal class names will break.
April 2026
New
POST /v1/integrations/{integrationId}/resync— trigger a resync on a user's connected wallet, exchange, or CSV integration. Supportslatest(incremental refresh) andfrom_start(full re-ingestion) modes.- Developer Portal — optional per-client transaction limits for Guest users.
- Kryptos Connect SDKs — published documentation for Web SDK, Mobile SDK, and the Connect Overview.
- Web SDK —
authMethodsprop to restrict the auth options shown in the widget; email login and anonymous authentication.
Enhancements
GET /v1/holdings— each holding now includes a per-assetroifield (unrealizedPnL / costbasis * 100). Thesummary.roiPercentagefield is unchanged.GET /v1/transactions,GET /v1/nft-holdings,GET /v1/defi-holdings— thepaginationobject now includestotalCount,returned_count,hasNextPage, andhasPreviousPage. Existinglimitandoffsetfields are unchanged.GET /v1/holdings,GET /v1/transactions,GET /v1/nft-holdings— spam assets are now excluded by default. Pass?isSpam=trueto include them.- Web SDK — added
languageprop for UI localization.
Fixes
GET /v1/transactions— very small or very large amounts in thedescriptionstring (e.g."Received 1e-9 SOL from airdrops") are now rendered in fixed-decimal notation (e.g."Received 0.000000001 SOL from airdrops").
Removed
- Web SDK —
baseUrlprop is no longer applicable and has been removed from the documentation.
February 2026
New
- Webhooks — added a Webhooks category to the docs covering setup and the supported event types.
- Recipes — new "Recipes" category with a guide for posting transactions using API-key authentication.
- Public Endpoints — added a Public Endpoints category with integrations documentation.
- Kryptos Connect — sandbox mode section covering supported chains, test addresses, and error codes; user-flow variations and direct-integration examples.
Enhancements
GET /v1/transactions— addedtotalCostbasisandtotalGainsfields to transaction responses and type definitions.
Breaking
- Kryptos Connect callbacks renamed:
onSuccess→onConnectSuccess,onError→onConnectError.
v1.0.0 — January 2026
Initial Release
- OAuth 2.0 authentication with PKCE
- Developer Portal for client management
- V1 API endpoints (Holdings, Transactions, DeFi, NFT, Integrations, Profiling)
- Granular permission scopes
- API documentation