Overview
GraphQL subscriptions provide a way to receive real-time updates from the Speckle server. Unlike webhooks, which are HTTP-based and designed for server-to-server communication, subscriptions are ideal for client applications that need to stay synchronized with Speckle data in real-time.When to Use Subscriptions vs Webhooks:
- Subscriptions: Use for client applications (web apps, desktop apps) that need real-time UI updates. Subscriptions use WebSocket connections and require an active connection.
- Webhooks: Use for server-to-server integrations, CI/CD pipelines, and HTTP-based automation workflows. Webhooks send HTTP POST requests to your endpoint, making them ideal for serverless functions and webhook endpoints.
Available Subscriptions
The complete list of available subscriptions is documented in Apollo Studio: Apollo Studio - Subscriptions Common subscription types include:- Project Events:
projectUpdated,projectModelsUpdated,projectVersionsUpdated,projectCommentsUpdated,projectIssuesUpdated - Version Events:
projectVersionsUpdated - File Upload / Ingestion Events:
projectModelIngestionUpdated(see the example below),projectPendingVersionsUpdated(legacy) - Automation Events:
projectAutomationsUpdated,projectTriggeredAutomationsStatusUpdated - Workspace & User Events:
workspaceUpdated,userProjectsUpdated
Using Subscriptions
Endpoint and Authentication
Subscriptions use WebSocket connections. The endpoint forapp.speckle.systems is:
Example
Most subscriptions accept anid parameter to filter events for a specific project:
userProjectsUpdated, don’t require parameters and will send updates for all projects the authenticated user has access to.
Tracking file upload and model ingestion progress
projectModelIngestionUpdated fires whenever a model ingestion — for example a file upload started with fileUploadMutations.startFileIngestion from the file upload guide — is created or changes status. The ingestionReference input takes exactly one of modelId (all ingestions targeting a model) or ingestionId (a single ingestion):
type field tells you what happened to the ingestion (created, updated, cancellationRequested, or deleted), and statusData is a union — use inline fragments as above to read the status-specific fields.
The
projectPendingVersionsUpdated subscription still works, but it reports file uploads through
the legacy pending-version surface. Use projectModelIngestionUpdated for new integrations — it
covers all ingestion types and carries granular status and progress data.