> ## 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.

# Transports

> ITransport for Send and Receive — use Receive2/Send2 instead for most scripts

**Most AEC automation scripts should use `Receive2`/`Send2`** and skip transports entirely. Read this page only when you use **`IOperations.Send`** or **`Receive`** (Path B) — for example the [Full send/receive tour](/developers/sdks/dotnet/getting-started/quickstart) or local-only `MemoryTransport`/`SQLiteTransport` workflows.

**Read next:** [Load and publish model data](/developers/sdks/dotnet/concepts/send-and-receive-paths) — Path B vs Path C.

## ServerTransport

Sends and receives objects (and blobs) over HTTP to a Speckle Server project.

<ResponseField name="IServerTransportFactory.Create" type="ServerTransport Create(Account account, string streamId, int timeoutSeconds = 60, string? blobStorageFolder = null)">
  Constructs a `ServerTransport`. Always use this factory — `ServerTransport`'s constructor has DI-resolved dependencies (`ISpeckleHttp`, `ISdkActivityFactory`) that aren't convenient to supply manually.
</ResponseField>

```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);
```

<Note>
  `streamId` here is the project id — a naming holdover from Speckle's v2 terminology.
</Note>

## SQLiteTransport

A general-purpose local disk cache, used automatically as the default local cache when `useDefaultCache: true` is passed to `Send`/`Receive`.

<ResponseField name="SQLiteTransport" type="SQLiteTransport(string? basePath = null, string? applicationName = null, string? scope = null)">
  Creates or opens a local SQLite database for caching objects. Defaults to a per-user application data path.
</ResponseField>

```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 localCache = new SQLiteTransport();
```

<Note>
  `SQLiteTransport2` is a related, per-project variant used internally as the default local cache alongside `ServerTransport` — you generally won't construct it directly.
</Note>

## MemoryTransport

An in-memory, non-persistent transport. Fastest option; data is lost when the process ends.

<ResponseField name="MemoryTransport" type="MemoryTransport(ConcurrentDictionary<string, string>? objects = null, bool blobStorageEnabled = false, string? basePath = null, string? applicationName = null)">
  Creates an in-memory object store. Useful for tests and short-lived scripts that don't need persistence.
</ResponseField>

```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}
var transport = new MemoryTransport();
var (objectId, _) = await operations.Send(myData, transport, useDefaultCache: false);
```

## ITransport

All transports implement `ITransport`, which supports:

| Member                  | Purpose                                                |
| ----------------------- | ------------------------------------------------------ |
| `SaveObject`            | Persist a serialized object string by id               |
| `GetObject`             | Retrieve a serialized object string by id              |
| `CopyObjectAndChildren` | Copy an object and its closures into another transport |
| `OnProgressAction`      | Progress reporting callback                            |
| `TransportName`         | Human-readable name, used in diagnostics               |

<Info>
  `IBlobCapableTransport` (implemented by `ServerTransport`, `SQLiteTransport`, and `MemoryTransport`) adds blob sidecar storage for binary attachments alongside object graphs.
</Info>

## FAQ

<AccordionGroup>
  <Accordion title="Do I need a transport if I use Send2?">
    No for server send/receive — `Send2`/`Receive2` talk to the server directly. You still use transports for Path B (`Send`/`Receive`), local-only workflows, or the [Full send/receive tour](/developers/sdks/dotnet/getting-started/quickstart).
  </Accordion>

  <Accordion title="Why must ServerTransport come from IServerTransportFactory?">
    Its constructor depends on `ISpeckleHttp` and other services registered by `AddSpeckleSdk`. The factory supplies those dependencies.
  </Accordion>

  <Accordion title="When should I use MemoryTransport vs SQLiteTransport?">
    **MemoryTransport** for tests and ephemeral scripts. **SQLiteTransport** when you want a persistent local cache across runs or offline receive of previously fetched data.
  </Accordion>
</AccordionGroup>

## Next Steps

<CardGroup cols={3}>
  <Card title="Load and publish model data" icon="route" href="/developers/sdks/dotnet/concepts/send-and-receive-paths">
    When Path B needs a transport
  </Card>

  <Card title="Full send/receive tour" icon="rocket" href="/developers/sdks/dotnet/getting-started/quickstart">
    ServerTransport worked example
  </Card>

  <Card title="Operations" icon="code" href="/developers/sdks/dotnet/api-reference/operations">
    Send and Receive signatures
  </Card>
</CardGroup>
