<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Treasures API Changelog</title>
        <link>https://docs.treasures.io/changelog</link>
        <description>Treasures Finance Blog</description>
        <lastBuildDate>Tue, 29 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Cross-chain speed buys, and sells that pay out USDC on another chain]]></title>
            <link>https://docs.treasures.io/changelog/cross-chain-buys-and-payout-chain-sells</link>
            <guid>https://docs.treasures.io/changelog/cross-chain-buys-and-payout-chain-sells</guid>
            <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Under priority: "speed" a buy can now reach a stock on a chain you are not funded on, in one signature set. A sell can pay its USDC out on another chain with the new payout_chain field. Both are opt-in; a request that sends neither gets the same routing as before.]]></description>
            <content:encoded><![CDATA[<p>Under <code>priority: "speed"</code> a buy can now reach a stock on a chain you are not funded on, in one signature set. A sell can pay its USDC out on another chain with the new <code>payout_chain</code> field. Both are opt-in; a request that sends neither gets the same routing as before.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-changed">What changed<a href="https://docs.treasures.io/changelog/cross-chain-buys-and-payout-chain-sells#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<p><strong>Sells: <code>payout_chain</code></strong></p>
<ul>
<li class=""><a class="" href="https://docs.treasures.io/api/quote-sell"><code>POST /quote/sell</code></a> accepts <code>payout_chain</code> (<code>"sol"</code>, <code>"eth"</code> or <code>"base"</code>; absent or <code>null</code> keeps the old behaviour). The sale's USDC lands on that chain, in your own wallet there. A <code>sol/xstocks</code>, <code>base/coinbase</code> or <code>eth/ondo</code> position held on another chain sells cross-chain as one leg, marked by <code>payout_chain</code> on the leg, whatever the <code>priority</code>. A position that cannot pay out there is left out with a <code>cross_chain_route_unavailable</code> warning and is never sold on its own chain instead.</li>
<li class="">You fund the network gas for a cross-chain sell leg on the position's own chain (<code>gasless: false</code>), unless your paymaster sponsors it on the <code>execution: "user_operation"</code> lane. On Ethereum and Base it is two signed transactions, an exact-amount <code>approve</code> then a <code>deposit</code>, or one <code>evm_calls</code> payload under <code>execution: "user_operation"</code>. On Solana it is one versioned transaction.</li>
<li class=""><a class="" href="https://docs.treasures.io/api/get-quote-status"><code>GET /quote/{quote_id}/status</code></a> legs gain <code>payout_chain</code> and <code>payout_tx_hash</code>. On <code>completed</code>, <code>payout_chain</code> names where the USDC actually landed, which is the sale's own chain if the payout was returned there.</li>
<li class=""><a class="" href="https://docs.treasures.io/api/list-settlements"><code>GET /settlements</code></a> reports such a sale as two transactions: the sale (<code>sending</code>) and the payout (<code>receiving</code>).</li>
<li class="">New refusals: <code>400 invalid_request</code> with a <code>payout_chain: </code> message prefix, and <code>422 no_routes</code> with <code>reason: "payout_route_unavailable"</code>.</li>
</ul>
<p><strong>Buys: cross-chain speed legs</strong></p>
<ul>
<li class="">Under <code>priority: "speed"</code>, <a class="" href="https://docs.treasures.io/api/quote-buy"><code>POST /quote/buy</code></a> and <a class="" href="https://docs.treasures.io/api/quote-preview"><code>POST /quote/preview</code></a> may quote a stock you are not funded on as a cross-chain leg instead of dropping it. The leg carries <code>origin_chain</code> (where your stablecoin leaves from; <code>chain</code> stays the destination), <code>cross_chain_cost_bps</code> and <code>cross_chain_cost_usdc</code>, and <code>base_asset</code> names the origin's currency.</li>
<li class=""><code>chain: ["eth"]</code> with <code>"speed"</code> on a buy or preview now returns a cross-chain leg or <code>422 no_routes</code> instead of an unconditional <code>400</code>.</li>
<li class="">New <code>warnings[]</code> codes <code>cross_chain_route_unavailable</code> and <code>cross_chain_price_deviation</code>, a new <code>no_routes</code> reason <code>cross_chain_wallet_missing</code>, and new per-leg <code>error_code</code>s <code>refunded</code>, <code>deposit_reverted</code>, <code>delivered_other_currency</code>, <code>cross_chain_unsettled</code> and a per-leg <code>quote_stale</code>.</li>
</ul>
<p><strong>Also</strong></p>
<ul>
<li class=""><code>cost_breakdown_bps.dex_swap_fee_bps</code> is nullable: <code>null</code> only on a cross-chain leg.</li>
<li class=""><code>Chain</code> gains <code>arbitrum</code> and <code>Protocol</code> gains <code>reality</code>, for an upcoming venue; the <code>reality</code> listings block on <a class="" href="https://docs.treasures.io/api/list-stocks"><code>GET /stocks</code></a> and <a class="" href="https://docs.treasures.io/api/list-stock-tickers"><code>GET /stocks/tickers</code></a> is <code>null</code> until it opens.</li>
<li class=""><code>GET /quote/{quote_id}/status</code> asks for <code>poll_after_ms: 3250</code> (was <code>10250</code>) when only gasless or Solana legs remain.</li>
<li class="">An on-chain venue price more than 1.5x away from the reference market price reads <code>share_price_usd: null</code> on <a class="" href="https://docs.treasures.io/api/get-stock-detail"><code>GET /stocks/{ticker}</code></a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-to-do">What to do<a href="https://docs.treasures.io/changelog/cross-chain-buys-and-payout-chain-sells#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do" translate="no">​</a></h2>
<p><strong>Action (strict response parsers only):</strong> accept <code>null</code> for <code>cost_breakdown_bps.dex_swap_fee_bps</code>. A caller that sends neither <code>priority: "speed"</code> nor <code>payout_chain</code> never receives it.</p>
<p>Nothing else is required. <a class="" href="https://docs.treasures.io/overview/buying-and-selling">Buying and Selling</a> maps every combination of <code>priority</code>, <code>execution</code> and <code>payout_chain</code> to the legs it returns and how to sign each one. To use the new routes, update to skill <code>1.16.0</code> (<a class="" href="https://docs.treasures.io/agents/agent-skills">Agent Skills</a>) or read the <a class="" href="https://docs.treasures.io/api/quote-sell">API Reference</a>. Routing rules: <a class="" href="https://docs.treasures.io/overview/routing-and-priority-mode">Routing and Priority Mode</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Integrator fees and payouts]]></title>
            <link>https://docs.treasures.io/changelog/integrator-fees-and-payouts</link>
            <guid>https://docs.treasures.io/changelog/integrator-fees-and-payouts</guid>
            <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Integrators can now charge their own fee on the trades their users make through them, see it on every quote and settled trade, and claim it in USDC through four new routes under /payouts. All of it needs an integrator key.]]></description>
            <content:encoded><![CDATA[<p>Integrators can now charge their own fee on the trades their users make through them, see it on every quote and settled trade, and claim it in USDC through four new routes under <code>/payouts</code>. All of it needs an integrator key.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-changed">What changed<a href="https://docs.treasures.io/changelog/integrator-fees-and-payouts#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><strong>Your fee on every quote made with your key.</strong> Treasures configures a default fee and a ceiling for your key; send <code>integrator_fee_bps</code> on <a class="" href="https://docs.treasures.io/api/quote-buy"><code>POST /quote/buy</code></a>, <a class="" href="https://docs.treasures.io/api/quote-sell"><code>POST /quote/sell</code></a> or <a class="" href="https://docs.treasures.io/api/quote-preview"><code>POST /quote/preview</code></a> to use a different fee on one quote. Each leg reports it as <code>cost_breakdown_bps.integrator_fee_bps</code>, and <code>estimated_output_*</code> already allows for it.</li>
<li class=""><strong>Submit with the key that quoted.</strong> A quote that carries your fee is refused at <a class="" href="https://docs.treasures.io/api/submit-trade"><code>POST /trade/submit</code></a> with <code>403 quote_integrator_mismatch</code> if it arrives without that key.</li>
<li class=""><strong>New quote refusals:</strong> <code>400 invalid_integrator_fee</code>, <code>400 integrator_fee_requires_api_key</code> and <code>503 integrator_fee_misconfigured</code>.</li>
<li class=""><strong>Settlements:</strong> <a class="" href="https://docs.treasures.io/api/list-settlements"><code>GET /settlements</code></a> gains an <code>integrator_fee</code> entry in <code>fee_costs</code>, with the <code>payout_id</code> it went out in, and two filters, <code>payout_id</code> and <code>payout_status</code>.</li>
<li class=""><strong>Payouts</strong>, general <code>tik_</code> key only: <a class="" href="https://docs.treasures.io/api/get-accrued-integrator-fees"><code>GET /payouts/accrued</code></a> (what you are owed and whether you can claim it), <a class="" href="https://docs.treasures.io/api/request-payout"><code>POST /payouts</code></a> (claim all of it to your registered address; <code>Idempotency-Key</code> required), <a class="" href="https://docs.treasures.io/api/list-payouts"><code>GET /payouts</code></a> and <a class="" href="https://docs.treasures.io/api/get-payout"><code>GET /payouts/{payoutId}</code></a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-to-do">What to do<a href="https://docs.treasures.io/changelog/integrator-fees-and-payouts#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do" translate="no">​</a></h2>
<p>Nothing, if you do not charge a fee: a quote without your key is unchanged, and with it your configured default applies. To charge or claim fees, read <a class="" href="https://docs.treasures.io/enterprises/integrator-fees-and-payouts">Integrator Fees and Payouts</a>, and always submit fee-carrying quotes with the key that requested them.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Manager API: replan: and catchup: dedupe_key prefixes are reserved]]></title>
            <link>https://docs.treasures.io/changelog/manager-dedupe-key-reserved-prefixes</link>
            <guid>https://docs.treasures.io/changelog/manager-dedupe-key-reserved-prefixes</guid>
            <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[POST /strategies//signals now refuses a dedupe_key that starts with replan (any case). Those prefixes are reserved for signals the platform generates itself.]]></description>
            <content:encoded><![CDATA[<p><code>POST /strategies/{strategyId}/signals</code> now refuses a <code>dedupe_key</code> that starts with <code>replan:</code> or <code>catchup:</code> (any case). Those prefixes are reserved for signals the platform generates itself.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-changed">What changed<a href="https://docs.treasures.io/changelog/manager-dedupe-key-reserved-prefixes#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class="">A <code>dedupe_key</code> beginning with <code>replan:</code> or <code>catchup:</code>, in any letter case, is refused with <code>400 invalid_request</code> and the <code>message</code> names the field. Every other key up to 200 characters is accepted as before.</li>
<li class="">Documented on the <a class="" href="https://docs.treasures.io/manager-api/publish-signal"><code>dedupe_key</code></a> request field and in <a class="" href="https://docs.treasures.io/managers/managing-a-strategy#dedupe_key-your-idempotency-key">Managing a Strategy</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-to-do">What to do<a href="https://docs.treasures.io/changelog/manager-dedupe-key-reserved-prefixes#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do" translate="no">​</a></h2>
<p><strong>Action:</strong> if any key you publish starts with <code>replan:</code> or <code>catchup:</code>, rename it. Keys that never used those prefixes need no change.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Manager API: publish a strategy's target weights, read your fee ledger]]></title>
            <link>https://docs.treasures.io/changelog/manager-api</link>
            <guid>https://docs.treasures.io/changelog/manager-api</guid>
            <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A new API for fund managers who run a strategy on Treasures: publish the target weights of your book and read the ledger of your share of follower fees. Separate base URL, separate credential.]]></description>
            <content:encoded><![CDATA[<p>A new API for fund managers who run a strategy on Treasures: publish the target weights of your book and read the ledger of your share of follower fees. Separate base URL, separate credential.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-changed">What changed<a href="https://docs.treasures.io/changelog/manager-api#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><strong>New API surface at <code>https://api.treasures.io/manager/v1</code></strong>, documented in the <a class="" href="https://docs.treasures.io/manager-api/treasures-finance-manager-api">Manager API reference</a> with a guide at <a class="" href="https://docs.treasures.io/managers/managing-a-strategy">Managing a Strategy</a>.</li>
<li class=""><a class="" href="https://docs.treasures.io/manager-api/publish-signal"><code>POST /strategies/{strategyId}/signals</code></a> publishes the whole book you want followers to hold: 1 to 200 tickers with decimal-string weights summing to at most <code>1</code>, the remainder held as cash. A required, caller-chosen <code>dedupe_key</code> makes retries safe: a repeat returns <code>200</code> with the original signal and rebalances nothing. The response tells you which session the book executes in (<code>urgency</code>, <code>trading_day</code>, <code>ttl_at</code>).</li>
<li class=""><a class="" href="https://docs.treasures.io/manager-api/get-fees"><code>GET /fees</code></a> returns what you are owed, what is pending and what has been paid, your recent payouts and a paged list of the collections behind them.</li>
<li class=""><strong>Credential:</strong> a manager API key (<code>cmk_…</code>) in <code>X-API-Key</code>, mandatory on every route, issued once by Treasures and not retrievable afterwards. 60 requests per minute per manager.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-to-do">What to do<a href="https://docs.treasures.io/changelog/manager-api#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do" translate="no">​</a></h2>
<p>Nothing changes for callers of the B2B Public API or the delegated wallet API. If you manage a strategy on Treasures, ask your Treasures contact for a key and a strategy assignment, then start from <a class="" href="https://docs.treasures.io/managers/managing-a-strategy">Managing a Strategy</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Docs reorganised by audience]]></title>
            <link>https://docs.treasures.io/changelog/docs-reorganised-by-audience</link>
            <guid>https://docs.treasures.io/changelog/docs-reorganised-by-audience</guid>
            <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This site is now organised into Users, AI Agents and Enterprises tabs, with the API Reference and this changelog as tabs of their own.]]></description>
            <content:encoded><![CDATA[<p>This site is now organised into Users, AI Agents and Enterprises tabs, with the API Reference and this changelog as tabs of their own.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-changed">What changed<a href="https://docs.treasures.io/changelog/docs-reorganised-by-audience#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class="">Each audience has its own tab with a short sidebar: <a class="" href="https://docs.treasures.io/users/using-the-web-app">Users</a>, <a class="" href="https://docs.treasures.io/agents/agent-skills">AI Agents</a> and <a class="" href="https://docs.treasures.io/enterprises/enterprise-integration">Enterprises</a>.</li>
<li class="">New reference pages: <a class="" href="https://docs.treasures.io/overview/compare-access-paths">Compare Access Paths</a>, <a class="" href="https://docs.treasures.io/overview/routing-and-priority-mode">Routing and Priority Mode</a> and <a class="" href="https://docs.treasures.io/enterprises/integrator-api-keys">Integrator API Keys</a>.</li>
<li class="">The AI Agents tab points at the agent skills rather than mirroring them: <a class="" href="https://docs.treasures.io/agents/agent-skills">Agent Skills</a> covers what each skill does, how to install it and how versioning works. A machine-readable navigator is served at <code>/skill.md</code>.</li>
<li class="">Search is available from the header.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="urls">URLs<a href="https://docs.treasures.io/changelog/docs-reorganised-by-audience#urls" class="hash-link" aria-label="Direct link to URLs" title="Direct link to URLs" translate="no">​</a></h2>
<p>The agent guide moved from <code>/overview/integrating-your-agent</code> to <code>/agents/integrating-your-agent</code>. Every other page keeps its URL.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GET /portfolio: portfolio_busy and the rewritten rate limits]]></title>
            <link>https://docs.treasures.io/changelog/portfolio-busy-and-rate-limits</link>
            <guid>https://docs.treasures.io/changelog/portfolio-busy-and-rate-limits</guid>
            <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[GET /portfolio can now answer 503 portfolio_busy with a Retry-After header, and its rate limits changed for anonymous and keyed callers alike.]]></description>
            <content:encoded><![CDATA[<p><code>GET /portfolio</code> can now answer <code>503 portfolio_busy</code> with a <code>Retry-After</code> header, and its rate limits changed for anonymous and keyed callers alike.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-changed">What changed<a href="https://docs.treasures.io/changelog/portfolio-busy-and-rate-limits#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.treasures.io/api/get-portfolio"><code>GET /portfolio</code></a> can answer <strong><code>503 portfolio_busy</code></strong> with a <code>Retry-After</code> header (delta-seconds) when the server is already computing as many fresh snapshots as it safely can and yours was not cached. Sleep <code>Retry-After</code> and retry the same request. A cached snapshot is never refused.</li>
<li class=""><strong>Rate limits on <code>GET /portfolio</code>.</strong> Anonymous calls have their own per-IP row (600 per minute). With a general <code>tik_</code> key the route is not bucketed by IP at all; the per-organisation bucket is the bound, sized for one request every 5 seconds per active end user.</li>
<li class=""><strong>The blanket per-IP ceiling</strong> across all endpoints is now set per environment, always at or above the per-endpoint limits, and no longer covers <code>/portfolio</code>.</li>
<li class=""><strong>Portfolio snapshots refresh on a 30-second cadence</strong> (<code>as_of</code>, <code>is_cached</code>). Polling faster returns the same snapshot.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_UP09" id="what-to-do">What to do<a href="https://docs.treasures.io/changelog/portfolio-busy-and-rate-limits#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do" translate="no">​</a></h2>
<p>Nothing is required. If your client has a generic transient-error branch, add <code>503 portfolio_busy</code> to it and honour <code>Retry-After</code>. Keyed integrators polling many end-user wallets should pace to the organisation bucket rather than spreading across IPs.</p>
<p>Details: <a class="" href="https://docs.treasures.io/enterprises/integrator-api-keys">Integrator API Keys</a> and the <a class="" href="https://docs.treasures.io/api/get-portfolio">API Reference</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Before this changelog]]></title>
            <link>https://docs.treasures.io/changelog/before-this-changelog</link>
            <guid>https://docs.treasures.io/changelog/before-this-changelog</guid>
            <pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Changes to the API before this changelog existed are recorded from the agent skill's point of view in the skills repo CHANGELOG.]]></description>
            <content:encoded><![CDATA[<p>Changes to the API before this changelog existed are recorded from the agent skill's point of view in the skills repo <a href="https://github.com/treasures-io/treasures-finance-agent-skills/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">CHANGELOG</a>.</p>
<!-- -->
<p>That file covers every release from the API's launch, newest first: the Robinhood Chain and Base venues, tradability advisories, the <code>chain</code> set, foreign listings, quote warnings and the acknowledgement token, priority mode and the speed route, the wallet-less preview, ticker details, the sponsored user-operation lane, and the <code>/portfolio</code> identity gate. Entries that needed action from an integration are marked <strong>Action</strong> there, the same convention this changelog uses.</p>
<p>From 2026-09-19 onward, every change to the public API surface gets its own entry here.</p>]]></content:encoded>
        </item>
    </channel>
</rss>