Skip to main content
Use client.Version to list versions on a model, read referencedObject for Receive2, or create a version after Send2 so data appears in the Speckle UI. Guide: Build your first model analysis tool loads the latest version · Full send/receive tour shows publish after send
After SendPipeline (connectors only), the server creates the version asynchronously — do not call Version.Create on that path.

Methods

Get
Task<Version> Get(string versionId, string projectId, CancellationToken cancellationToken = default)
Retrieves a version by id.
GetVersions
Task<ResourceCollection<Version>> GetVersions(string modelId, string projectId, int limit = 25, string? cursor = null, ModelVersionsFilter? filter = null, CancellationToken cancellationToken = default)
Lists versions of a model.
Create
Task<Version> Create(CreateVersionInput input, CancellationToken cancellationToken = default)
Creates a version pointing at an already-sent object. CreateVersionInput(string objectId, string modelId, string projectId, string? message = null, string? sourceApplication = ".net", int? totalChildrenCount = null, IReadOnlyList<string>? parents = null).
Update
Task<Version> Update(UpdateVersionInput input, CancellationToken cancellationToken = default)
Updates a version’s message.
MoveToModel
Task<string> MoveToModel(MoveVersionsInput input, CancellationToken cancellationToken = default)
Moves one or more versions to a different model. Returns the target model id. MoveVersionsInput(string projectId, string targetModelName, IReadOnlyList<string> versionIds) — note targetModelName takes the destination model’s name, not its id.
Delete
Task Delete(DeleteVersionsInput input, CancellationToken cancellationToken = default)
Deletes one or more versions.
Received
Task Received(MarkReceivedVersionInput input, CancellationToken cancellationToken = default)
Marks a version as received by the current application, for telemetry/analytics purposes.

Usage

https://mintcdn.com/speckle/VtRPWzmN-ULoLfIv/images/developers/sdks/csharp.svg?fit=max&auto=format&n=VtRPWzmN-ULoLfIv&q=85&s=f2970e3b8bd4a2c7899b46211a42f251Example
using var transport = provider.GetRequiredService<IServerTransportFactory>().Create(client.Account, project.id);
var (objectId, _) = await provider.GetRequiredService<IOperations>().Send(myData, transport, useDefaultCache: true);

var version = await client.Version.Create(new CreateVersionInput(objectId, model.id, project.id, "Initial version"));
Sending with Send or Send2 does not create a version by itself — follow up with client.Version.Create to publish data to a model’s history and viewer. The SendPipeline path is different: after WaitForUpload, the server creates the version asynchronously — do not call Version.Create on that pathway.

FAQ

For Send and Send2, pass the id returned by the send operation — not a value from Base.GetId(), which is obsolete and may not match every send path. For SendPipeline, do not call Version.Create — the server creates the version after upload. See Publish large models (connectors).
Call client.Version.Get to read referencedObject, then IOperations.Receive2 with that id. See Build your first model analysis tool.

Next Steps

Core concepts

Orphaned objects and version lifecycle

Build your first model analysis tool

Load latest version with Receive2

Operations API

Send and Send2 entry points
Last modified on July 10, 2026