SDK Changelog

Track all SDK changes, new methods, deprecations, and improvements across versions.

SDK Changelog

Track all changes, updates, and improvements

v3.7

minorLatest
August 19, 2026

✨ New Features

  • updateProject() accepts baseUpdatedAt — the updatedAt you read with the project. When sent, a write against a row another writer has touched is refused with HTTP 409 instead of overwriting it. A data payload is a full-scene overwrite, and the project row now has several writers (this SDK, the owner's editor, the AI Assistant, approved AI changes, agent workflows, MCP clients), so a write built from a stale read erases everything that landed in between.
  • New ConflictError (HTTP 409) with serverUpdatedAt, the version to re-read at. It extends Simplio3DError, so existing catch blocks that test for Simplio3DError keep matching — only code that wants to re-read and re-apply needs the narrower class.
  • FormFieldType gains add-to-cart and save-configuration, with their field options (addToCartLabel/addToCartStyle/addToCartProvider, saveConfigLabel/saveConfigStyle). Both were missing, so creating either button headlessly did not type-check against the real 12-type set.

⚡ Improvements

  • CalculatePriceResponse gains hiddenOptionBlockIds and engineApplied { numberInputPricing, conditionalGating }. The server engine now applies number-input per-unit pricing and conditional-visibility gating, so totals move for projects using either — engineApplied reports which ran rather than leaving you to assume it. Both optional; treat a missing engineApplied as both false.
  • Documented that addToCartProvider must be set explicitly: a missing value is read as woocommerce by every consumer, so on a Shopify-only workspace the button never resolves a checkout URL — and because an add-to-cart field replaces the Request-a-Quote button, the form is left with no working call to action.
  • Documented that a save-configuration field must stay required: false. It renders no input, so a required flag makes the quote form unsubmittable against a validation error attached to an element the shopper never sees.
  • updateProfile() — the server now writes through a strict field allowlist and pins email to the authenticated identity. Unknown keys are stripped rather than rejected, so reading a profile, editing one field and sending the whole object back still works; a field outside the allowlist is simply not persisted.

🐛 Bug Fixes

  • Fixed a hang on every method that reads a project whose scene is stored compressed (any scene at or above the 128 KB threshold — most real configurators): getOptionBlocks(), createOptionBlock(), updateOptionBlock(), evaluateConditions(), getPricingBlocks(), calculatePrice(), getFormFields(), getAnimationBlocks() and getProjectSettings(). The server decompressed the row with a stream write that was awaited before any reader was attached, so the promise never resolved and the request idled to the platform's 150s ceiling with no response. Small projects are stored uncompressed and answered normally, which is why it presented as intermittent. getProject() was NOT affected — it reads the row without decompressing.
  • getAssetDownloadUrl() now works. It requested /assets/:id/download without ?mode=signed-url, so the server streamed the raw file while the client parsed the response as JSON and threw. It now requests signed-url mode and returns the signed storage URL, which also avoids buffering a large model through the API.

⚠️ Deprecated

  • The AI Tool Layer, agent workflow and MCP surfaces are deliberately NOT wrapped by this SDK. They carry their own confirmation, approval and scope model, and a thin client wrapper would invite treating a high-risk proposal as an ordinary write. Call them over HTTP, or connect an MCP client — see /docs/mcp.

v3.6

minor
August 11, 2026

v3.5

minor
August 10, 2026

v3.4

patch
April 8, 2026

v3.2

minor
March 11, 2026

v3.1.0

minor
February 27, 2026

v3.0.0

major
January 15, 2026

Continue reading