<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>STX changelog</title>
    <link>https://docs.stxapp.io/changelog/</link>
    <atom:link href="https://docs.stxapp.io/changelog/rss.xml" rel="self" type="application/rss+xml" />
    <description>Changes to the STX API, the SDKs, and these docs.</description>
    <language>en</language>
    <item>
      <title>docs-v1.5.1</title>
      <category>Docs</category>
      <link>https://docs.stxapp.io/changelog/#2026-10-03-docs-v151</link>
      <guid isPermaLink="false">stx-docs-v1.5.1</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<ul>
<li><strong>Combos (preview):</strong> any account can request or quote, but not both on one request. Requesting, quoting, accepting, cancelling and cashing out need a <code>read_write</code> API key; a <code>read_only</code> key is refused with <code>insufficient_scope</code>. See <a href="https://docs.stxapp.io/concepts/combos/">Combos</a>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>docs-v1.5.0</title>
      <category>Docs</category>
      <link>https://docs.stxapp.io/changelog/#2026-10-03-docs-v150</link>
      <guid isPermaLink="false">stx-docs-v1.5.0</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p><strong>A User-Agent requirement and an early look at combos.</strong></p>
<h3>REST API</h3>
<ul>
<li><strong>Send a <code>User-Agent</code>.</strong> REST requests and WebSocket handshakes without a <code>User-Agent</code> header are refused with <code>403</code>. Most HTTP libraries send one already; some WebSocket clients, such as Node's <code>ws</code>, do not unless you set it. See <a href="https://docs.stxapp.io/api/authentication/">Authentication</a>.</li>
</ul>
<h3>Combos (preview)</h3>
<p>Combos, one contract across several markets priced by request for quote, are documented as an early look so you can plan for them. They are <strong>not available to try yet</strong>, and the protocol may change before release. See <a href="https://docs.stxapp.io/concepts/combos/">Combos</a> and the <a href="https://docs.stxapp.io/websockets/channels/combo-negotiation/">combo negotiation channel</a>.</p>]]></description>
    </item>
    <item>
      <title>docs-v1.4.0: Python SDK 0.6.0</title>
      <category>Docs</category>
      <category>Python SDK</category>
      <link>https://docs.stxapp.io/changelog/#2026-10-03-docs-v140</link>
      <guid isPermaLink="false">stx-docs-v1.4.0</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p><strong>The Python SDK is on PyPI.</strong></p>
<h3>Python SDK 0.6.0</h3>
<p><strong>The Python SDK is on PyPI.</strong> Trade on STX from Python with typed methods instead of hand-built, hand-signed requests.</p>
<pre><code class="language-bash">pip install stx-python
</code></pre>
<ul>
<li>A blocking client, <code>STX</code>, and an asyncio client, <code>AsyncSTX</code>, with a method for every REST route.</li>
<li>Requests and the WebSocket handshake are signed with your API key. There is no login call and no session to refresh.</li>
<li>Stream order books, trades and your own orders, fills, positions and balance on one connection that keeps itself alive and reconnects for you.</li>
<li>Walk long lists without handling pages yourself, with <code>iter_markets()</code>, <code>iter_orders()</code> and the rest.</li>
<li>Every response is a typed model, and money and quantities arrive as strings exactly as the API sends them, never floats.</li>
<li>Retries are safe: an order is never sent twice after an uncertain failure.</li>
<li>Pick an exchange by name, such as <code>region="us", env="demo"</code>, or set your key once in a credentials profile.</li>
</ul>
<p>Start with the <a href="https://docs.stxapp.io/sdks/python/">Python SDK guide</a>. Runnable examples are in <a href="https://github.com/stxapp/stx-python-demo">stx-python-demo</a>.</p>]]></description>
    </item>
    <item>
      <title>docs-v1.3.0: TypeScript SDK 0.6.3</title>
      <category>Docs</category>
      <category>TypeScript SDK</category>
      <link>https://docs.stxapp.io/changelog/#2026-09-30-docs-v130</link>
      <guid isPermaLink="false">stx-docs-v1.3.0</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p><strong>The TypeScript SDK is on npm, two new WebSocket channels, and your positions over REST.</strong></p>
<h3>TypeScript SDK 0.6.3</h3>
<p><strong>The TypeScript SDK is on npm.</strong> Trade on STX from Node.js with typed methods instead of hand-built, hand-signed requests.</p>
<pre><code class="language-bash">npm install @stxapp/stx-typescript
</code></pre>
<ul>
<li>Read markets and your account, and place and cancel orders, with every response typed in your editor.</li>
<li>Stream order books, trades and your own orders, fills, balance and positions. The SDK signs the connection, keeps it alive and reconnects for you.</li>
<li>Keep one live, always current view of your account with <code>accountView()</code>.</li>
<li>Walk long lists without handling pages yourself, with <code>iterMarkets()</code>, <code>iterOrders()</code> and the rest.</li>
<li>Retries are safe: an order is never sent twice after an uncertain failure.</li>
<li>Set your key once, in environment variables or a credentials profile, and switch between the US and Ontario exchanges with one option.</li>
</ul>
<p>Start with the <a href="https://docs.stxapp.io/sdks/typescript/">TypeScript SDK guide</a>.</p>
<p>Since 0.6.0:</p>
<ul>
<li><code>balance()</code>, <code>positions()</code> and <code>placeOrders()</code> work on every STX exchange, with the same results everywhere.</li>
<li><code>placeOrders()</code> checks the whole list before placing any order: an over-long list or a malformed order is refused with nothing placed.</li>
</ul>
<h3>REST API</h3>
<ul>
<li><strong><code>GET /api/v1/positions</code></strong> returns your open positions, largest first. It is the same body the <code>positions:{user_id}</code> channel sends on join, so one REST read can seed the state that channel then keeps current. See <a href="https://docs.stxapp.io/api/rest/account/list-open-positions/">List open positions</a>.</li>
<li><strong><code>GET /api/v1/fills</code> takes <code>order_ids</code></strong> and returns only the fills those orders produced. It combines with <code>market_ids</code> and <code>status</code>. See <a href="https://docs.stxapp.io/api/rest/fills/list-fills/">List fills</a>.</li>
<li><strong>Name your client.</strong> Send a <code>User-Agent</code> such as <code>acme-mm/1.4 (python/3.13)</code> on REST calls and the WebSocket handshake. It is optional and never rejected, and it lets us find your calls when you report something. See <a href="https://docs.stxapp.io/api/authentication/#identify-your-client">Identify your client</a>.</li>
</ul>
<h3>WebSockets</h3>
<ul>
<li><strong><code>order_slip:{user_id}</code></strong> costs an order before you place it: risk, fee, and how much would fill at once and at which prices, pushed again whenever the book moves. Nothing is placed. It replaces <code>betslip:{user_id}</code>, which still works but sends money rounded to two decimals; moving is a topic change plus parsing money and quantities as decimal strings. See <a href="https://docs.stxapp.io/websockets/channels/order-slip/">Order slip</a>.</li>
<li><strong><code>events</code></strong> carries traded volume per event, one number across every market on it. No authentication. See <a href="https://docs.stxapp.io/websockets/channels/events/">Events</a>.</li>
</ul>
<h3>OAuth for apps</h3>
<p>Apps can act for STX members with their consent: the authorization code flow with PKCE, tokens limited to the scopes the member approved, and a member can disconnect at any time. See <a href="https://docs.stxapp.io/isv/">ISV</a>.</p>]]></description>
    </item>
    <item>
      <title>docs-v1.2.0: C# SDK 1.6.0, C# SDK 1.6.1</title>
      <category>Docs</category>
      <category>C# SDK</category>
      <link>https://docs.stxapp.io/changelog/#2026-09-19-docs-v120</link>
      <guid isPermaLink="false">stx-docs-v1.2.0</guid>
      <pubDate>Sat, 19 Sep 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p><strong>C# SDK 1.6.0 and 1.6.1</strong>, published to NuGet as
<a href="https://www.nuget.org/packages/STX.Sdk"><code>STX.Sdk</code></a>. Email and password authentication is
unchanged and everything new here is opt-in. Two types were removed, <code>STXProfileService</code> and
<code>STXUserProfile</code>; see Removed below if you use them.</p>
<pre><code>dotnet add package STX.Sdk
</code></pre>
<h3>C# SDK 1.6.0</h3>
<p><strong>API keys.</strong> Authenticate with an Ed25519 API key, signed per request. No login call, no
token expiry, no refresh cycle. Email and password authentication continues to work exactly
as it does today.</p>
<pre><code class="language-csharp">services.ConfigureSTXServices(
    STXEnvironment.OntarioDemo,
    STXApiKeyCredentials.FromPemFile(keyId, "~/.stx/ontario.pem"));
</code></pre>
<p>See <a href="https://docs.stxapp.io/api/authentication/">Request signing</a> for creating a key and choosing its scope.</p>
<p><strong>Named environments.</strong> Supply credentials, not URLs.</p>
<ul>
<li><code>STXEnvironment.OntarioDemo</code>, <code>USDemo</code>, <code>OntarioProduction</code></li>
<li><code>STXEnvironment.Custom(...)</code> for anything else; passing URLs directly still works</li>
<li>These resolve to <code>demo.stxapp.ca</code>, <code>demo.stxapp.io</code> and <code>stxapp.ca</code>, which may differ from
the host your integration uses today. Check firewall and allowlist rules before switching</li>
</ul>
<p><strong>Identity.</strong> <code>STXIdentityService.GetMeAsync()</code> returns your user id, account id and scope.
Call it once at startup before joining any user-scoped channel: channel topics are keyed on
the user id, and an API key has no login response to carry it.</p>
<p><strong>.NET 10.</strong> A <code>net10.0</code> build ships alongside <code>net8.0</code>. A .NET 8 or 9 app resolves the
<code>net8.0</code> build as before; nothing needs to change.</p>
<p><strong>Debug symbols</strong> are embedded, so SDK frames in stack traces carry file names and line
numbers.</p>
<p><strong>Reliability</strong></p>
<ul>
<li>A failed token refresh no longer stops the host process. It is reported through the session
message callback instead</li>
<li>Login and token refresh are retried; previously they were the only calls with no retry</li>
<li>Retries exclude credential errors, 401, 403 and 429. HTTP 404 is retried, since that is
what an ingress returns mid-deployment</li>
<li>Failures preserve the cause as <code>InnerException</code> instead of a bare "Request Failed"</li>
</ul>
<p><strong>Removed.</strong> <code>STXProfileService</code> and <code>STXUserProfile</code>. Use <code>STXIdentityService</code> and
<code>STXIdentity</code>.</p>
<h3>C# SDK 1.6.1</h3>
<ul>
<li><code>STXTrade.Action</code> no longer throws when serialised with <code>System.Text.Json</code>, which affected
ASP.NET endpoints returning trade history</li>
<li>If you installed 1.6.0 in the days before this announcement, the identity types were named
<code>STXViewerService</code> and <code>STXViewer</code> in that build. They are <code>STXIdentityService</code> and
<code>STXIdentity</code> from 1.6.1 onwards; <code>GetMeAsync()</code> is unchanged</li>
</ul>]]></description>
    </item>
    <item>
      <title>v1.1.0</title>
      <category>API</category>
      <link>https://docs.stxapp.io/changelog/#2026-09-10-v110</link>
      <guid isPermaLink="false">stx-docs-v1.1.0</guid>
      <pubDate>Thu, 10 Sep 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p><strong>Breaking changes to the REST API.</strong></p>
<p><strong>Money and quantities are now strings.</strong> Responses carry money as a dollar amount
and quantities as decimals, both as strings.</p>
<table>
<thead>
<tr>
<th></th>
<th>Before</th>
<th>Now</th>
</tr>
</thead>
<tbody>
<tr>
<td>Price</td>
<td><code>49</code></td>
<td><code>"0.4900"</code></td>
</tr>
<tr>
<td>Quantity</td>
<td><code>10</code></td>
<td><code>"10.00"</code></td>
</tr>
</tbody>
</table>
<p>To port, divide by 100 any money field you were reading or sending as a whole
number of cents. These fields on <code>GET /api/v1/markets</code> were already in dollars and
keep their value: <code>price</code>, <code>bids[].price</code>, <code>offers[].price</code> and
<code>recent_trades[].price</code>. Parse money with a decimal type rather than a float.</p>
<p><strong>Placing orders.</strong> Send <code>price</code> in quotes to <code>POST /api/v1/orders</code>, for example
<code>"price": "0.49"</code>. A price sent without quotes, such as <code>49</code> or <code>0.49</code>, is rejected
with a 400.</p>
<p><strong>Use <code>total_fee</code> for a trade's fee.</strong> It is the full fee for the trade.</p>
<p><strong>New WebSocket topics.</strong> The new account topics carry the same events as before,
with money and quantities as strings like REST:</p>
<table>
<thead>
<tr>
<th>Previous topic</th>
<th>New topic</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>active_orders:{user_id}</code></td>
<td><code>orders:{user_id}</code></td>
</tr>
<tr>
<td><code>active_trades:{user_id}</code></td>
<td><code>fills:{user_id}</code></td>
</tr>
<tr>
<td><code>active_positions:{user_id}</code></td>
<td><code>positions:{user_id}</code></td>
</tr>
<tr>
<td><code>active_settlements:{user_id}</code></td>
<td><code>settlements:{user_id}</code></td>
</tr>
<tr>
<td><code>portfolio:{user_id}</code></td>
<td><code>balances:{user_id}</code></td>
</tr>
</tbody>
</table>
<p>Also new:</p>
<ul>
<li><code>account:{user_id}</code> carries all of the above on one topic.</li>
<li><code>orderbook</code>, <code>ticker</code> and <code>trades</code> carry public market data for any set of
markets on a single join.</li>
</ul>
<p>See <a href="https://docs.stxapp.io/websockets/">WebSocket channels</a>.</p>
<h3>Effective 2026-09-16</h3>
<p><strong>Prices have at most two decimal places.</strong> <code>"0.49"</code> and <code>"0.4900"</code> are accepted;
<code>"0.495"</code> is rejected with a 400.</p>
<p><strong><code>quantity</code> must be in quotes too.</strong> Send <code>"quantity": "10"</code>; a quantity sent
without quotes, such as <code>10</code>, is rejected with a 400.</p>
<p><strong><code>GET /api/v1/trades</code> is now <code>GET /api/v1/fills</code>.</strong> Results are under <code>fills</code>
instead of <code>trades</code>, and the row fields keep their names (<code>trade_id</code>, <code>trade_fee</code>).
The old path returns 404.</p>
<p><strong>New REST endpoints:</strong> <code>GET /api/v1/portfolio/fees</code> and
<code>GET /api/v1/portfolio/adjustments</code>.</p>]]></description>
    </item>
    <item>
      <title>v1.0.0</title>
      <category>API</category>
      <link>https://docs.stxapp.io/changelog/#2026-08-25-v100</link>
      <guid isPermaLink="false">stx-docs-v1.0.0</guid>
      <pubDate>Tue, 25 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p>First release of the STX documentation.</p>]]></description>
    </item>
  </channel>
</rss>
