The mental model
The recommended workflow
Most AEC automation scripts follow these steps:- Authenticate — personal access token from an environment variable (recommended for scripts)
- Choose a project and model — IDs from the Speckle web app URL
- Load a version — usually the latest published version on that model
- Traverse objects —
Flatten()orGraphTraversalover the received graph - Analyse or transform data — counts, QA checks, CSV export, custom logic
- Optionally send results back —
Send2plusVersion.Createwhen you want a new published snapshot
Platform concepts
Speckle organizes data as projects → models → versions → object graphs, not files. The GraphQL API exposes projects, models, and versions;IOperations moves object graphs to and from storage. Full hierarchy: Data Schema Overview.
IClient exposes each level as a typed resource:
Some lower-level APIs (transports,
Send/Receive) still use streamId for what the GraphQL API calls projectId. Pass your project’s id — they are the same value.Base, DataObject, Collection, detachment, displayValue): Work with model objects.
Object IDs (hashes)
Every sent object has a unique object ID, deterministically generated from its content.Load and publish model data
IOperations provides the core methods for moving object graphs. See Load and publish model data for when to use which entry point.
For scripts and notebooks, Receive2/Send2 is the recommended choice. The Full send/receive tour teaches the classic Send/Receive + ServerTransport pair if you want to understand transports:
Orphaned objects
The type system
Every object carries aspeckle_type, derived from its .NET type, which lets Receive reconstruct the correct concrete type:
Custom types and traversal: Work with model objects. Geometry types: Working with Geometry.
Local cache
Speckle.Sdk maintains a local SQLite cache under the current user’s application data folder (.../Speckle/), used automatically by Send/Receive when useDefaultCache: true.
FAQ
What happens if I send data but never create a version?
What happens if I send data but never create a version?
The object is stored on the server with an object ID, but it is orphaned until a version references it. Always create a version after sending data you want others to find.
Should I use Send or Send2?
Should I use Send or Send2?
Use Send2/
Receive2 for scripts, notebooks, and most new server-facing code. Use Send/Receive with an ITransport when you follow the Full send/receive tour, need MemoryTransport/SQLiteTransport, or integrate with code that already uses transports. See Load and publish model data.Why does streamId appear in transport code?
Why does streamId appear in transport code?
Older transport APIs use
streamId for what the GraphQL API calls projectId. Pass your project’s id — they are the same value.Next Steps
Build your first model analysis tool
Load, traverse, and export a CSV report
Load and publish model data
Choose Send2, Send, or SendPipeline
Operations API
Send, Receive, and Send2 signatures