What Are Proxies?
Proxies are relationship containers stored at the Root Collection level. They encode connections between:- Objects and shared resources (materials, levels, groups)
- Objects and other objects (group memberships, instance definitions)
- On “Level 1” (spatial organization)
- In “Exterior Walls” group (functional grouping)
- Using “Concrete” material (visual property)
- Part of “Block A” definition (instance relationship)
Proxy Structure
All proxies follow this pattern:Key Fields
speckle_type- Identifies the proxy typeapplicationId- Unique identifier for this proxyname- Human-readable namevalue- The actual resource data (material, level, etc.)objects- Array ofapplicationIds of objects that use this resource
Common Proxy Types
RenderMaterial
Encodes material assignments:Level
Encodes level/floor associations:Group
Encodes group memberships:Definition
Stores geometry for instances (blocks, components). The following diagram illustrates how multiple Instance objects reference a single Definition proxy: The Definition stores the geometry once; each Instance references it and applies its own transform. This enables geometry reuse without duplication.Color
Encodes color assignments (CAD workflows):How Proxies Reference Objects
Proxies reference objects byapplicationId, not id:
To find which objects use a material:
- Get the RenderMaterial proxy
- Read its
objectsarray - Find objects with matching
applicationId
- Get the object’s
applicationId - Search all RenderMaterial proxies for one containing that
applicationIdinobjects
Why use applicationId instead of id for references?
Why use applicationId instead of id for references?
applicationId is stable within a model version and represents the source application’s identifier. id is content-based and changes if the object’s data changes. For relationships that should persist even when object data changes, applicationId is the right choice.Also, applicationId is what the source application uses, making it easier to map back to the original data.Proxy Location
All proxies are stored at the Root Collection level: This centralized storage makes it easy to:- Find all proxies of a type
- Resolve references efficiently
- Avoid duplication
Multiple Relationships
A single object can be referenced by multiple proxies:Nested Proxies and Transform Propagation
Nested proxies occur when a Definition proxy’svalue contains objects that themselves reference other proxies. For example, a Definition might contain a DataObject that uses a RenderMaterial proxy.
Transform propagation works as follows:
- Instance transforms apply to the geometry stored in the Definition proxy
- When resolving an Instance, you:
- Find the Definition proxy by
definitionId(usingapplicationId) - Extract the geometry from
definition.value.displayValue - Apply the Instance’s transform matrix to position/orient the geometry
- Find the Definition proxy by
- Nested instances: If a Definition contains Instances, transforms compose—the nested Instance’s transform is applied relative to the parent Instance’s transform
Why Proxies Matter: Deduplication, Versioning, and Performance
Proxies provide three critical benefits: Deduplication: Shared resources (materials, levels, definitions) are stored once and referenced many times. A single RenderMaterial proxy can reference hundreds of objects, avoiding duplication of material data. Similarly, a Definition proxy stores geometry once for many Instances. Versioning: Because proxies reference objects byapplicationId (which is stable across versions), relationships persist even when object content changes. A wall’s material assignment remains linked even if the wall’s geometry is modified.
Performance: Storing shared resources once reduces data size and transfer time. Instead of duplicating material properties on every object, a single proxy contains the material and references all objects that use it. This is especially important for Definition proxies—geometry stored once can be reused by many Instances without duplication.
These benefits make proxies essential for efficient, maintainable data models, especially in workflows with many repeated elements (blocks, components, shared materials).
Connector-Specific Proxies
Different connectors use different proxy types:- Revit: RenderMaterial, Level, Group
- Rhino: RenderMaterial, Color, Group, Definition
- AutoCAD: RenderMaterial, Color, Group, Definition
- Civil3D: RenderMaterial, Color, Group, Definition, PropertySetDefinition
- Etabs: Section, Material (specialized)
Reference Objects (Non-Proxy)
In addition to proxies, Speckle supports direct reference objects that point to other objects by ID. These are used for different purposes than proxies:ObjectReference
ObjectReference (deprecated as Speckle.Core.Models.ObjectReference, current type is reference) is a non-proxy reference object that directly references another object by its id:
referencedId(required) - The objectid(hash) of the referenced objectclosure(optional) - Dictionary mapping closure information
applicationId and are stored at root level, ObjectReference references by id and can appear anywhere in the object graph.
InstanceProxy
InstanceProxy is a specialized proxy class for block/component instances (e.g., Rhino blocks, AutoCAD block references):
definitionId(required) - TheapplicationIdof the Definition proxy that contains the geometrytransform(required) - 4x4 transformation matrix for the instance placementunits(required) - Units of the host application filemaxDepth(required) - Maximum depth for nested instance resolution
InstanceProxy objects are used to represent instances in the object graph. To get the geometry for an instance:
- Get the
InstanceProxyobject - Use its
definitionIdto find the corresponding Definition proxy - Access
definition_proxy.value.displayValuefor the geometry
Proxy Invariants
- Proxies are at root level - Always stored in Root Collection, never nested
- References use applicationId - Always
applicationId, neverid - No circular references - Proxies don’t reference other proxies
- Value is the resource - The
valuefield contains the actual resource data - objects is a list - Can reference zero or more objects
Can an object be in multiple groups?
Can an object be in multiple groups?
Yes! An object’s
applicationId can appear in multiple Group proxy objects arrays. This allows objects to belong to multiple functional groups simultaneously. The same applies to materials, levels, and other proxy types.Conceptual Capability
After reading this page, you understand how Proxies encode relationships between objects and shared resources: how proxies reference objects byapplicationId, how Definition and Instance patterns enable geometry reuse, how transforms propagate from Instances to geometry, and why proxies matter for deduplication, versioning, and performance. You recognize that proxies solve the overlapping hierarchies problem by storing relationships separately, allowing objects to participate in multiple organizational systems without duplication. You’re ready to explore connector-specific behaviors and extensions.
Next Steps
- Connector Index - Connector-specific proxy usage
- Object Schema - Review object structure