API Changelog

Changes to the public /v1/ API and the official Python SDK. See the stability policy for breaking-change rules.

Version 1-beta — 2026-09-09

Added

  • started_at on simulation, sweep and dynamic-run resources: the instant the solver began, next to created_at, dispatched_at and completed_at. Queue wait is started_at - dispatched_at. See async resources.
  • progress on a dynamic run resource and on every dynamic.updated stream frame: {fraction, sim_time_s, sim_time_total_s, wall_s, updated_at}. See dynamic outputs.
  • cancel_requested_at on sweep and dynamic-run resources, set while a cancel is accepted but not yet landed.
  • credits_breakdown on a sweep resource: {points, rotors, cu_per_point_per_rotor, total}.
  • concurrency: {limit, active, queued} on GET /v1/users/me, so the account-wide execution queue shared by the dashboard and every API key is readable. See rate limits.
  • Motor phase resistance R in component list rows and on GET /v1/components/{id}, for every tier that sees specs.
  • filters on the component list response, echoing the bounds that were applied.
  • X-Spec-Budget-Remaining and X-Spec-Budget-Reset headers on GET /v1/components/{id}/specs.
  • A new guide, Using the API from an AI coding agent, with a paste-able instruction block and a worked component-axis sweep.
  • https://thrustlab.com/llms-full.txt, every documentation page as one plain-text file, and a rewritten https://thrustlab.com/llms.txt index.
  • Python SDK 0.6.0: client.simulations.run_queued() and client.simulations.run_selected(simulation_ids) dispatch runs parked with launch_intent="queue".
  • Additive snake_case result keys alongside the human-label spellings they mirror, on both steady-state and dynamic results. See steady-state outputs.

Changed

  • Cancelling a RUNNING dynamic run now behaves like cancelling a running sweep: the response keeps status: "running" and sets cancel_requested_at, the run stops at its next integration window, its partial result is kept (run_meta.partial, run_meta.canceled_at_t_s), compute units are refunded, and the execution slot frees. cancel-selected lists running dynamic runs under requested.
  • A sweep's input_snapshot now holds the request body as submitted when the caller omits it. It used to be null.
  • sweep_config.component_axes[] now reports {axis, slot, slots, components: [{id, name}]}. Component references are ids and names only.
  • An unknown bracket filter key on GET /v1/components now returns 400 unknown_filter naming the valid keys for that type, instead of being silently dropped.
  • Component filter and sort keys accept both spellings: resistance[lte] is R[lte], and sort_by=resistance is sort_by=R, and likewise for every filterable field.
  • ids_only=true returns up to 5000 ids, raised from 2000, and sets truncated when the cap bound the result.
  • Every 429 response carries a Retry-After header. Three rate-limit codes are newly documented: spec_rate_limited, filter_rate_limited and create_rate_limited. See rate limits.
  • Per-account submission limits: 30 per minute to POST /v1/sweeps, 30 per minute to POST /v1/dynamic-simulations, 120 per minute to POST /v1/simulations, each returning 429 create_rate_limited.
  • An error's doc_url now links to that code's own row, https://thrustlab.com/docs/guides/errors#<code>. The errors catalog is generated, so every code the API can return is on the page.

Notes

  • The human-label result keys are deprecated in favour of the snake_case spellings. Both are present; nothing has been removed.
  • The rate-limit change is additive. The flat 1000 requests per minute per credential, with a burst of 50, is unchanged.
  • Python SDK 0.6.0 is a minor bump in 0.x, so read the SDK changelog before upgrading.

Version 1-beta — 2026-04-27

Added

  • Public /v1/ API covering: users, projects, simulations, sweeps, dynamic-simulations, components, submissions, starred_components, compute-units, webhook_endpoints, and events.
  • Official Python SDK thrustlab v0.1.0 on PyPI.
  • Webhook deliveries with HMAC SHA256 signing and a 5-minute timestamp tolerance window. See the webhooks guide.
  • Stripe-style error envelopes with deterministic machine-readable codes. See the errors guide.
  • Cursor-based pagination on every list endpoint. See the pagination guide.
  • Async-as-resource pattern for simulations and sweeps — poll the resource or subscribe via webhook events. See the async resources guide.

Notes

  • Stripe billing (subscriptions, billing portal) is managed from the dashboard, not the public /v1/ API.
  • The Python SDK is in 0.x; minor-version bumps may include small breaking changes until 1.0. Patch bumps are always backward-compatible.