Code that walks the object graph, reads the root object, or calls the objects endpoints stops
working on versions in the 2026.9 data format. Speckle 2026.9 introduced that format: a version is
a bundle of parquet files, with a columnar property store, typed relations, and no root object.
Versions in the earlier format keep their object graph. Each item links to the page that documents
it. For dates and who is affected, see Data model migration for
developers.
New
- Object model. Properties live in a columnar store, and relationships are typed relations
rather than a tree of Collections and DataObjects. See Object
model.
- Relations. Typed edges for containment, levels, rooms, hosts, systems, and materials replace
Proxies. The new format has no Proxy objects. See Relations.
- Geometry encoding. Geometry is stored as SGEO binary blobs in a geometry table, not as
displayValue JSON. See Geometry encoding.
- Version metadata. There is no root object. Source application and model-wide facts live on
the version record, the model ingestion, a provenance row in the bundle, and model-scoped
properties. Every object carries its own
units. See Version metadata.
- Bundles and model ingestion. Integrations publish by opening a model ingestion and uploading
a bundle, and load by downloading a version’s bundle files. See
Bundles,
Publish, and
Load.
- Bundle loading for Viewer apps. Sample code lets an app built on
@speckle/viewer render
bundle versions with the published packages. See Load bundles in your Viewer
app.
Changed
- .NET SDK.
Receive3 loads a version as a disposable Model with columnar properties and
typed relations, and Send3 publishes through a BundleBuilder. Receive2 is obsolete and reads
only object-graph versions, and Speckle.Objects is merged into Speckle.Sdk. See
Migrate a Speckle.Sdk script.
- Python SDK.
operations.receive3 loads a version as a Model with columnar properties and
typed relations, and operations.send3 publishes through a BundleBuilder. Both need the
bundle extra. See Migrate a specklepy script.
- GraphQL and REST. On a 2026.9 version,
referencedObject starts with bundle., the objects
endpoints return 404, and object.children filtering, totalChildrenCount, and JSON geometry
are not available. Read element properties from the version’s EAV query endpoint instead. See
Get element data from a version.
- Viewer package.
@speckle/viewer has no published loader for bundles, so an app that
constructs a Viewer and a loader renders nothing for 2026.9 versions. Embeds of the hosted
viewer and API-only apps are not affected. See Viewer.
- objectloader.
@speckle/objectloader and @speckle/objectloader2 cannot read 2026.9
versions. A data-only app reads the bundle directly. See Building
apps.
- Revit model placement. Revit publishes keep geometry in internal coordinates and store the
chosen datum as a separate model placement, instead of
referencePointTransform on the root
object. Read modelPlacement.* and apply it yourself unless the sender turned on Apply
Transform. See Model placement.
- Automate in the web app. Functions live on the workspace Functions page, and you create
automations from project Settings → Automations. See
Automate.
- Automate results. Runs on 2026.9 models complete and record their results, but the results
icon does not appear in the viewer or the project’s model list. Use the Dashboards Automate
results widget to see them. See Viewing results.
Action required
- Update .NET scripts. Update every Speckle NuGet package to the same 2026.9 build
(
dotnet add package Speckle.Sdk --version 2026.9.0-beta.7), remove the
Speckle.Objects reference, and replace Receive2 with Receive3. An older SDK gets a 404 on
versions published by a 2026.9 connector. See Migrate a Speckle.Sdk script.
- Update Python scripts. Install a 2026.9 specklepy with the
bundle extra
(pip install "specklepy[bundle]==2026.9.0b3") and use
operations.receive3. An older specklepy gets a 404 on versions published by a 2026.9 connector.
See Migrate a specklepy script.
- Replace
object.children queries. Move filters to the EAV query endpoint. When
compatibility mode ends on 1 November 2026, every cloud sync and file upload produces
versions that object.children cannot query. See Get element data from a version.
- Move Viewer and objectloader apps to bundles. Render bundles with the bundle-loading sample,
or read the bundle directly in a data-only app. See Load bundles in your Viewer
app.
- Bump Automate function SDKs. A function that processes 2026.9 versions needs
specklepy[bundle]==2026.9.0b3 or Speckle.Automate.Sdk 2026.9.0-beta.4 or later. The received
tree is Collection and DataObject objects with id equal to the applicationId, so code that
filters on speckle_type changes. See Automate.
- Test functions that attach results to objects. The attach methods work on 2026.9 versions, but
they rely on
id equalling applicationId, which is not a documented contract. Treat id as
opaque, and re-run automations after a model is migrated. See Attach results to 2026.9
models.
Last modified on October 19, 2026