referencedObject from the objects endpoints gets a 404 on every 2026.9 version. This page
assumes the model from Building integrations in 2026.9.
Tell the two formats apart
Any version you are asked to load may still be an object graph from 2026.8 or earlier. Read the version record first.bundle. prefix. Keep your existing reader for the first shape, or refuse it with a
clear message the way the Archicad connector does. Never derive storage paths from the triple in the
reference; resolve the version through the project and version ids you already hold.
How a load fetches a version
Resolve the version
schemaVersion is 3.List the artifacts
.dat in the list.Download the files you need
.dat. The outcome is a bundle directory on local disk.Read the catalogs first
meta, rel_types, and node_kinds. The outcome is the vocabulary this bundle was
written with, including relation namespaces and any ids your reader does not know.Rebuild the model
Mark the version received
- GraphQL
- REST
- Python
- .NET
.dat in the listing is the viewer’s artifact, and a geometryStream field beside the file
list is the viewer’s streaming endpoint. Both are internal. Read the parquet files.Rules that decide whether your load is correct
The bundle tells you its own vocabulary. Read it, and apply these rules in order.Reading the files
- Read columns by name and tolerate columns you do not know. The spec adds columns without moving the version, so a bundle written before a column existed must still load.
- Read every geometry shard,
{id}.geometries.parquetand{id}.geometries.{n}.parquet. A reader that opens only shard zero silently drops geometry above the shard cap. - Treat a relation id or node kind missing from your vocabulary as skip-and-report, never as an error. A newer producer than your reader is normal.
- Do not gate on
meta.schema_version. It is provenance, not a compatibility switch.
Identity
- A bare integer is meaningless without its namespace. The relation type’s source and target
namespaces in
rel_typessay whether an end is an object, a node, or a geometry. - The object’s identity is
applicationId. If you project the bundle into a tree with ids on nodes, mint synthetic ids per bundle and expect them to differ across versions.
Properties
- Each row sets exactly one of the string, number, and boolean columns. Coalesce them.
- Rebuild nesting from the dotted path.
properties.Constraints.Base Offsetis a nested dictionary, not a flat key. - Merge type-level rows into each object through the object-to-type link. Without that merge, most type parameters are missing.
- The root scalars
speckle_type,name,units, andtypesit besideproperties.*, not under it.
Geometry
- Verify the CRC and decode by primitive type. See Geometry encoding in 2026.9.
DISPLAYis what to render. Prefer aSOLIDonly when your host can read its format, and fall back to the display mesh otherwise. Never drawCENTERLINEas a body.- Convert with the blob’s own unit, not a model-wide unit. Objects, instances, and geometry can disagree.
Instancing
- Expand a definition once through
DEFINES, then place it for everyDISPLAY_INSTANCEedge using the instance node’s transform, 16 row-major doubles in the instance’s units. Scale only the translation when you convert units.DEFINES_INSTANCEnests one definition in another. - An object with no render edge is a carrier for a definition member’s properties and grouping.
Skip it when you bake geometry, or the member draws twice, once untransformed at the origin.
DEFINES_MEMBERandPLACESjoin carriers to their definition and placement.
Grouping
- Build the tree from the default scene view. Each tier is either a relation such as
IN_MODELorIN_COLLECTION, or a property path such ascategory. With no scene view, group byIN_COLLECTION. - Nest containers through their parent reference column, not through a relation.
IN_COLLECTIONis single-valued.IN_GROUPandIN_SYSTEMare not.
Appearance
- Material fills from specific to general:
HAS_MATERIALon the geometry, thenOBJECT_HAS_MATERIALon the object, thenNODE_HAS_MATERIALon the object’s container. - Color is presentational:
OBJECT_HAS_COLORoverridesHAS_COLORon the geometry, andNODE_HAS_COLORis the container default. HAS_COLORstarts from a geometry or an object, andordsays which. Read it before you resolve the source key.- Appearance edges are single-valued per source. When a bundle repeats one, the last row wins.
Placement
- Read
modelPlacement.*andreferencePoint.*from the model-scoped properties. WhenappliedToGeometryis true, stored coordinates are already in that datum. When it is false, apply the transform yourself. No rows means the internal origin.
Suggested build order
List and download
Read properties only
applicationId, nested properties from paths, type-level rows merged in. The outcome
is a property table you can filter, before any geometry.Decode display meshes
DISPLAY with the right
units. The outcome is a model that renders untransformed geometry correctly.Expand instances
Apply grouping and appearance
Apply placement and mark received
FAQ
What happens if the artifacts listing returns 404?
What happens if the artifacts listing returns 404?
schemaVersion on the version record first,
then the ingestion status if the version is new.Can I read properties without downloading geometry?
Can I read properties without downloading geometry?
eav and
envelope files only. The SDKs expose the same choice as an include-geometry option.Can I edit a received bundle's values and publish it again?
Can I edit a received bundle's values and publish it again?
meta with your own
producer, renaming to the new id, and uploading is valid when only values change: keys,
relations, and geometry stay consistent. Build a new bundle when structure changes. Either way
the version’s source application is you. Speckle’s own parameter editing applies changes in the
host and republishes from there, and a receive-then-send round trip through a Base tree is
unsupported.Do I have to mark the version received?
Do I have to mark the version received?
What if the bundle uses a relation my reader does not know?
What if the bundle uses a relation my reader does not know?