> ## Documentation Index
> Fetch the complete documentation index at: https://docs.speckle.systems/llms.txt
> Use this file to discover all available pages before exploring further.

# Version

> client.Version — load the latest snapshot or publish after Send2

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](/developers/sdks/dotnet/guides/build-your-first-model-analysis-tool) loads the latest version · [Full send/receive tour](/developers/sdks/dotnet/getting-started/quickstart) shows publish after send

<Note>
  After **`SendPipeline`** (connectors only), the server creates the version asynchronously — do not call `Version.Create` on that path.
</Note>

## Methods

<ResponseField name="Get" type="Task<Version> Get(string versionId, string projectId, CancellationToken cancellationToken = default)">
  Retrieves a version by id.
</ResponseField>

<ResponseField name="GetVersions" type="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.
</ResponseField>

<ResponseField name="Create" type="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)`.
</ResponseField>

<ResponseField name="Update" type="Task<Version> Update(UpdateVersionInput input, CancellationToken cancellationToken = default)">
  Updates a version's message.
</ResponseField>

<ResponseField name="MoveToModel" type="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.
</ResponseField>

<ResponseField name="Delete" type="Task Delete(DeleteVersionsInput input, CancellationToken cancellationToken = default)">
  Deletes one or more versions.
</ResponseField>

<ResponseField name="Received" type="Task Received(MarkReceivedVersionInput input, CancellationToken cancellationToken = default)">
  Marks a version as received by the current application, for telemetry/analytics purposes.
</ResponseField>

## Usage

```csharp Example lines icon="https://mintcdn.com/speckle/VtRPWzmN-ULoLfIv/images/developers/sdks/csharp.svg?fit=max&auto=format&n=VtRPWzmN-ULoLfIv&q=85&s=f2970e3b8bd4a2c7899b46211a42f251" theme={null}
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"));
```

<Note>
  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`](/developers/sdks/dotnet/guides/building-connector-scale-sends) path is different: after `WaitForUpload`, the server creates the version asynchronously — do not call `Version.Create` on that pathway.
</Note>

## FAQ

<AccordionGroup>
  <Accordion title="What objectId do I pass to Create?">
    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)](/developers/sdks/dotnet/guides/building-connector-scale-sends).
  </Accordion>

  <Accordion title="How do I receive the data behind a version?">
    Call `client.Version.Get` to read `referencedObject`, then `IOperations.Receive2` with that id. See [Build your first model analysis tool](/developers/sdks/dotnet/guides/build-your-first-model-analysis-tool).
  </Accordion>
</AccordionGroup>

## Next Steps

<CardGroup cols={3}>
  <Card title="Core concepts" icon="book" href="/developers/sdks/dotnet/concepts/overview">
    Orphaned objects and version lifecycle
  </Card>

  <Card title="Build your first model analysis tool" icon="chart-bar" href="/developers/sdks/dotnet/guides/build-your-first-model-analysis-tool">
    Load latest version with Receive2
  </Card>

  <Card title="Operations API" icon="code" href="/developers/sdks/dotnet/api-reference/operations">
    Send and Send2 entry points
  </Card>
</CardGroup>
