Tell the two formats apart
referencedObject on the version you actually have — don’t assume based on upload
date or workspace settings alone.
What’s no longer supported
For a version whosereferencedObject is a bundle reference, these stop working. There is
currently no GraphQL-level replacement for the filtering and selection behavior — see Get element
data today for what to use instead.
Object.children(query:, select:, limit:)— the server-side filter/select mechanism (for example, filtering by an IFC type and selecting a handful of property paths in one request).Object.totalChildrenCount— nothing to count against; there is no object tree.Project.object(id: referencedObject)— the reference isn’t a content hash, so there’s nothing to look up.- Reading geometry as JSON (the
datafield) — 2026.9 geometry is stored in a binary format read by the Viewer and SDKs, not served as a JSON payload.
Get element data today
Prior to 2026.9, one GraphQL query could filter elements by property and select just the fields you needed:- Prior to 2026.9
- 2026.9
IfcDoor” filter from the query above, filter that array yourself:
Find matching object ids
path == "ifcType" and valueText == "IfcDoor", and collect their
objectId values. The outcome is the id of every door in the model.Pull their other properties
objectId is one of those ids. The outcome is every
property row belonging to a matching element.Group by objectId
objectId to get one record per door with its properties. The outcome
matches what select used to return, without the size limit.GET .../versions/{versionId}/eav/download variant for a plain download, and a GET .../models/{modelId}/eav/download variant that always serves the latest version.
Payload size, and moving to the bundle directly
Losingselect and query doesn’t break anything — you still end up with the same elements once
you’ve filtered client-side — but it does change what “minimal” means. The old query returned
exactly the fields you asked for, for exactly the elements that matched. The properties endpoint
above always returns everything: every indexed property, on every element, every time you call it.
That’s a fixed cost that scales with model size, not with how much of the model you actually
wanted.
For a one-off check, or a model with a few hundred elements, that’s a non-issue. For something that
runs repeatedly against a large model — a nightly flow, a live dashboard — downloading and
re-filtering the full properties table on every run is the wrong shape for the job, even though it
technically works.
At that point, don’t look for a lighter version of the JSON export — there isn’t one yet (see the
FAQ below). Instead, stop treating the version as “a JSON payload to filter” and start reading its
bundle directly:
From an SDK instead of raw HTTP
For anything that can run real code rather than a low-code flow, an SDK’s native path reads the bundle above directly instead of downloading the full properties table yourself:- Python: see Assess specklepy breaking
changes —
operations.receive3gives direct, filtered property access (model.objects_with("ifcType")), and the legacyoperations.receivekeeps working as a compatibility path. - .NET: see Assess .NET SDK breaking changes.
FAQ
My upload fails outright with an error — is that this page?
My upload fails outright with an error — is that this page?
UNSUPPORTED_FILE_TYPE
— you’re almost certainly still calling the deprecated startFileImport mutation, which the
2026.9 server rejects outright as of 1 September 2026. See File
uploads to switch to
startFileIngestion. This page covers a different symptom: uploads that succeed, but querying
elements back afterward returns null or empty.Why did my object.children query suddenly return null?
Why did my object.children query suddenly return null?
referencedObject is a
bundle. reference (see Tell the two formats apart). This isn’t
a bug or a temporary gap: server-side filtering over the object tree doesn’t apply to that
format. Use the properties endpoint above instead.Can I still use object.children for versions created before 2026.9?
Can I still use object.children for versions created before 2026.9?
referencedObject is a hex string.
The two formats can coexist — check the version you actually have rather than assuming based on
project or workspace.I just uploaded a file and the version/properties endpoints return nothing yet — is something wrong?
I just uploaded a file and the version/properties endpoints return nothing yet — is something wrong?
Model.latestIngestion.statusData until it reports
ModelIngestionSuccessStatus, then query the version it names — don’t fire the read on a timer
or a webhook that isn’t actually tied to ingestion completion.Does the properties endpoint only work for 2026.9 (bundle) versions?
Does the properties endpoint only work for 2026.9 (bundle) versions?
"Version not found or has no EAV artefact" if that version
hasn’t had one built yet, which is a different failure than “wrong format.” Bundle versions
always have one; older versions may or may not, depending on whether they’ve been through
backfill.Is server-side filtering coming to the properties endpoint?
Is server-side filtering coming to the properties endpoint?
My workspace has compatibility mode on — why is object.children still failing?
My workspace has compatibility mode on — why is object.children still failing?
referencedObject is a hex string, not a bundle. reference. See Data
model migration for developers —
compatibility mode ends 1 November 2026 either way, so plan the move regardless.How do I get a total element count without walking the whole properties table?
How do I get a total element count without walking the whole properties table?
objectId values in the properties
export, or use an SDK’s native accessors (see From an SDK instead of raw
HTTP).Can a low-code tool like Power Automate, Zapier, or n8n read the bundle artifacts directly?
Can a low-code tool like Power Automate, Zapier, or n8n read the bundle artifacts directly?
NODE_FUNCTION_ALLOW_EXTERNAL) or install a community node built for it — that’s a deliberate
setup step, not the default. The properties export endpoint exists specifically so low-code
tools have a plain-JSON option that works everywhere, cloud or self-hosted, with no extra
configuration. See Payload size, and moving to the bundle
directly.How do I decide between the JSON properties export and reading the bundle directly?
How do I decide between the JSON properties export and reading the bundle directly?
Can one project have both hex-reference and bundle-reference versions?
Can one project have both hex-reference and bundle-reference versions?