Skip to main content

Goal

Get a working SpeckleSharp script with the shortest path to load and analyse model data — without learning dependency injection.

What you will build

A script that authenticates, loads the latest version of an existing model, counts elements by category, and prints a summary to the console.

When to use this

Use this page when you write:
  • A one-off C# script or console app
  • A Grasshopper C# Script or custom component
  • A C# cell in a polyglot notebook (Jupyter, Visual Studio, Rider)
  • A small automation that is not a desktop connector
You do not need to understand dependency injection, service lifetimes, or ASP.NET Core. Paste the bootstrap once, then write normal C# against client, operations, and Base objects.
If you are building a production desktop connector (Revit, Rhino, AutoCAD, and similar), start with Dependency injection (connectors) and Publish large models (connectors) instead.
The recommended approach for server-facing AEC automation scripts is Receive2/Send2 — no transport factory required. Paste the bootstrap below, authenticate with a PAT from SPECKLE_TOKEN, and call IOperations methods directly. For Grasshopper object construction without server calls, see Use SpeckleSharp in a Grasshopper C# node. For connector Publish/Load on the canvas, use the Grasshopper connector — the SDK complements those components; it does not replace them.

One-time bootstrap (copy this)

Paste this at the top of your script, notebook cell, or Grasshopper C# component. Run it once per process. This is the canonical bootstrap — other pages link here instead of repeating the full block.
Example
You can rename SpeckleBootstrap to anything. The point is a single static holder so notebook cells and script functions do not repeat new ServiceCollection() on every run.
There is no new Operations() or import-and-go equivalent. Every public entry point (IOperations, IClientFactory, IAccountFactory) is resolved from the bootstrap container. That is a one-time setup cost, not an ongoing architectural commitment.

Complete example

Load an existing model and count elements by category:
Complete example
onProgressAction and cancellationToken are for long-running host applications (connectors with progress UI). For scripts, null and default are correct — not placeholders to replace.

How it works

See Load and publish model data for when to use Send/Receive with transports instead.

Common mistakes

What to skip (unless you are building a connector)

Grasshopper and hosted scripts

Speckle connector components (Publish, Load): use the components for transport. Custom analysis in Grasshopper C#: see Use SpeckleSharp in a Grasshopper C# node for DataObject construction; return here for Send2/Receive2.

Polyglot notebooks

  1. Paste the bootstrap in the first cell and run it once per kernel session.
  2. In later cells, call SpeckleBootstrap.Operations, SpeckleBootstrap.ClientFactory, and so on directly.
  3. Store account or client in notebook variables if you reuse them — IClient is IDisposable.

Next Steps

Build your first model analysis tool

Full CSV report walkthrough

Authentication

PAT and environment variables

Load and publish model data

Send2 vs Send decision guide

FAQ

No. Treat AddSpeckleSdk + BuildServiceProvider() as a required preamble — like adding using statements.
Build your first model analysis tool for a complete automation. This page for the bootstrap snippet. Full send/receive tour if you want to understand publishing from scratch.
Last modified on July 18, 2026