Sync workspace members from your identity provider
When someone joins or leaves your team, your identity provider (Okta, Azure AD, Authentik, etc.) can push that change directly to Speckle. Speckle’s SCIM 2.0 endpoint creates new workspace members, keeps their emails and display name in sync, and removes them from the workspace when they’re deprovisioned upstream — no manual invite or cleanup required.
SCIM is available on Speckle Cloud and is currently rolling out per workspace. Contact
us to enable it on yours.
We strongly recommend setting up SSO before enabling SCIM. SSO and SCIM are independent features that solve different problems:
SSO handles login — members sign in to Speckle through your identity provider.
SCIM handles lifecycle — your identity provider creates, updates, and removes workspace members.
SCIM provisions accounts but does not give them a way to log in. Without SSO, every SCIM-provisioned user has to go through Speckle’s password reset flow before they can access the workspace for the first time — a friction point you can avoid entirely by enabling SSO. With SSO in place, provisioned users sign in directly through your identity provider on first access.SCIM does not technically require SSO, but pairing them is the experience your users will thank you for.
Configure SCIM under Settings -> Security.
Workspace members can see this section, but only workspace admins can change these controls.
SCIM is shown in the Security page only when SCIM is enabled for the workspace.
SCIM card under Settings -> Security
If you haven’t configured SSO yet, do it before enabling SCIM. Provisioned
users without SSO have to use the password reset flow on first login.
1
Generate a SCIM token
Click Enable SCIM. Speckle generates a workspace-scoped bearer token and shows it once in a reveal dialog. Copy the token and the SCIM base URL before closing.
Token reveal dialog. Copy the token before closing.
The token is shown only once. Copy it somewhere safe — you cannot recover it later. If you lose it, rotate the token to generate a new one.
2
Configure your identity provider
In your identity provider, create a new SCIM 2.0 application pointing at:
SCIM endpoint: the base URL from the previous step, e.g. https://app.speckle.systems/api/v1/workspaces/{workspace-slug}/scim/v2
Authentication: bearer token (paste the token you copied)
Filter the identity provider push to the users you want in the workspace.
Provisioned users join with the workspace’s default project-access setting
and the member workspace role.
Example SCIM application configuration in your identity provider
3
Trigger the first sync
Trigger a test sync from your identity provider. The SCIM card updates
Last sync and Provisioned users within seconds, and the test user
appears under workspace Members with the default project-access setting.
Display name and given/family name updates flow through to the Speckle profile.
Email changes on a verified workspace domain are synced. The identity provider’s primary email becomes the Speckle primary email.
Secondary emails added in the identity provider are added in Speckle; secondary emails removed there are removed in Speckle.
An unverified Speckle email matching the identity provider push is marked verified — Speckle trusts the identity provider as authoritative for its own domains.
Email sync is restricted to verified workspace domains. Personal emails (e.g. @gmail.com) pushed
from the identity provider are ignored.
Not strictly, but it is strongly recommended. SCIM provisions accounts but
does not handle login. Without SSO, every provisioned user must complete
Speckle’s password reset flow on first access. With SSO enabled first,
provisioned users sign in directly through your identity provider — no
password reset, no friction. Set up SSO before enabling
SCIM whenever possible.
What happens if a user's email is unverified in Speckle?
SCIM returns a 409 conflict. Ask the user to verify their email in Speckle
(or remove the email from their account), then retry the sync from your
identity provider. SCIM never silently links unverified accounts.
Can SCIM change a user's password or other workspace memberships?
No. SCIM never touches passwords — users authenticate through SSO
(recommended) or via Speckle’s password reset flow if SSO is not configured.
SCIM also only manages membership in the SCIM-enabled workspace; the user’s
other workspace memberships are untouched.
Can SCIM manage project membership?
No. SCIM manages workspace-level user lifecycle (create, update, remove)
within the SCIM-enabled workspace. Project collaborator membership and
project-level roles are managed separately in project settings.
Can the same user be SCIM-managed in multiple workspaces?
No. A user can only be SCIM-managed in one workspace at a time. Provisioning
a user who is already SCIM-active in another workspace returns a 409
conflict — deprovision them in the first workspace before provisioning
elsewhere.
What if I lose the SCIM token?
Tokens cannot be recovered. Open Settings -> Security, rotate
the token, and update your identity provider with the new value.
Does SCIM upgrade permissions above the defaults?
No. SCIM creates members using the workspace defaults. It does not promote
users to admin or elevate project permissions automatically.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Speckle Docs","colors":{"primary":"#2563EB","light":"#3B82F6","dark":"#2563EB"},"logo":{"light":"https://mintcdn.com/speckle/8FGkkbZZbcuHzOBq/logo/light.svg?fit=max\u0026auto=format\u0026n=8FGkkbZZbcuHzOBq\u0026q=85\u0026s=9fc87cac252fa8cc443a9828ecbace70","dark":"https://mintcdn.com/speckle/8FGkkbZZbcuHzOBq/logo/dark.svg?fit=max\u0026auto=format\u0026n=8FGkkbZZbcuHzOBq\u0026q=85\u0026s=560ffcf355d3abfde56e5f8e514a64b7"},"favicon":"https://mintcdn.com/speckle/EShMFmfm7tGBxVKq/favicon-smaller.svg?fit=max\u0026auto=format\u0026n=EShMFmfm7tGBxVKq\u0026q=85\u0026s=805ae0301be5e103926e84e99871779c","navbar":{"links":[{"href":"https://speckle.systems/","label":"Speckle"},{"href":"https://speckle.community/","label":"Support"}],"primary":{"type":"button","label":"Sign up","href":"https://app.speckle.systems/?utm_source=Docs\u0026utm_medium=SignUp\u0026utm_campaign=Docs"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/specklesystems","youtube":"https://www.youtube.com/@SpeckleSystems","github":"https://github.com/specklesystems","instagram":"https://www.instagram.com/specklesystems"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-05WEYFZ28C"},"intercom":{"appId":"hoiaq4wn"},"mixpanel":{"projectToken":"acd87c5a50b56df91a795e999812a3a4"}},"contextual":{"options":["copy","chatgpt","claude"],"display":"header"},"metadata":{"timestamp":true},"markdown":{"instructions":["These docs describe Speckle as it works today, including everything released in 2026.9. Treat page content as current unless the page or section says it applies only to versions published before 2026.9.","Content scoped to versions published before 2026.9 (the object graph and root object, Proxies, Receive2, operations.receive, object.children) applies only to model versions in that earlier data format. For versions published in 2026.9, answer from the Object model pages and the SDK migration guides.","The What's new pages summarise what changed in 2026.9 and link to the page that documents each change. Answer from the linked page rather than from the summary. Legacy (v2) connectors are retired; send questions about them to the community help forum.","Match guidance to the customer's deployment, model data format, connector, plan and permissions. Self-hosted servers on a release before 2026.9 and compatibility-mode workflows follow the Compatibility mode page. If an unknown version or data format changes the answer, ask one focused question; do not infer the deployment version from the date alone."]},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"speckle","hasAudioNarration":false,"actualSubdomain":"speckle","customDomains":["docs.speckle.systems"],"gitSource":{"type":"github","owner":"specklesystems","repo":"speckle-docs-new","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae306ba36199f9bca5446ac","collectionId":"c0a27784-b9bd-4a60-804a-0f7ae4af7863","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae306ba36199f9bca5446ac"},"feedback":{"issues":true},"entitlements":{},"buildId":"6ae306ba36199f9bca5446ac","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"default","tag":"Developers","count":200},{"language":"default","tag":"User Guides","count":95},{"language":"default","tag":"SDKs","count":65},{"language":"default","tag":"API Reference","count":54},{"language":"default","tag":"Viewer","count":50},{"language":"default","tag":"Connectors","count":39},{"language":"default","tag":"Publishing \u0026 Loading","count":37},{"language":"default","tag":"C# .NET","count":33},{"language":"default","tag":"Python","count":30},{"language":"default","tag":"Guides","count":23}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#footer div:first-child>div:first-child>div:first-child{display:none}.header-link+p{margin-top:.6rem}li .frame{margin-top:1rem;margin-bottom:1.5rem}div:has(>.frame)+div:has(>.frame){margin-top:.75rem}"}],"page":{"pagePath":"workspaces/scim","slug":"/workspaces/scim","pageMetadata":{"title":"User provisioning (SCIM)","description":"Sync workspace members from your identity provider","sidebarTitle":"Provisioning (SCIM)","tag":"Enterprise","href":"/workspaces/scim"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Sync workspace members from your identity provider\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`When someone joins or leaves your team, your identity provider (Okta, Azure AD, Authentik, etc.) can push that change directly to Speckle. Speckle’s SCIM 2.0 endpoint creates new workspace members, keeps their emails and display name in sync, and removes them from the workspace when they’re deprovisioned upstream — no manual invite or cleanup required.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`SCIM is available on Speckle Cloud and is currently rolling out per workspace. `,_jsx(_components.a,{href:`mailto:[email protected]`,children:`Contact\nus`}),` to enable it on yours.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`set-up-sso-first`,children:`Set up SSO first`}),`\n`,_jsxs(_components.p,{children:[`We strongly recommend setting up `,_jsx(_components.a,{href:`/workspaces/sso`,children:`SSO`}),` before enabling SCIM. SSO and SCIM are independent features that solve different problems:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SSO`}),` handles `,_jsx(_components.em,{children:`login`}),` — members sign in to Speckle through your identity provider.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SCIM`}),` handles `,_jsx(_components.em,{children:`lifecycle`}),` — your identity provider creates, updates, and removes workspace members.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`SCIM provisions accounts but does not give them a way to log in. Without SSO, every SCIM-provisioned user has to go through Speckle’s password reset flow before they can access the workspace for the first time — a friction point you can avoid entirely by enabling SSO. With SSO in place, provisioned users sign in directly through your identity provider on first access.`}),`\n`,_jsx(_components.p,{children:`SCIM does not technically require SSO, but pairing them is the experience your users will thank you for.`}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/workspaces/sso`,children:`SSO`}),` configured on the workspace (strongly recommended — see above).`]}),`\n`,_jsx(_components.li,{children:`Workspace admin role.`}),`\n`,_jsxs(_components.li,{children:[`At least one `,_jsx(_components.a,{href:`/workspaces/domain-protection`,children:`verified workspace domain`}),`. SCIM only syncs emails on verified domains.`]}),`\n`,_jsx(_components.li,{children:`The Speckle team has enabled SCIM on your workspace.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`enable-scim`,children:`Enable SCIM`}),`\n`,_jsxs(_components.p,{children:[`Configure SCIM under `,_jsx(_components.strong,{children:`Settings -> Security`}),`.\nWorkspace members can see this section, but only workspace admins can change these controls.\nSCIM is shown in the Security page only when SCIM is enabled for the workspace.`]}),`\n`,_jsx(Frame,{caption:`SCIM card under Settings -> Security`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=ff055201ebb09cfdc39483f8d318068e`,alt:`SCIM card in workspace security settings`,\"data-og-width\":`1839`,width:`1839`,\"data-og-height\":`1116`,height:`1116`,\"data-path\":`images/workspaces/scim/security-settings.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?w=280\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=68d3144db61e69760f40e1b508364a3d 280w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?w=560\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=4f71b0a12f7ed14a193a439e2659cac1 560w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?w=840\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=3f47f3b00c88a5c9853f38c518e2c820 840w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?w=1100\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=ce1f9042f4d1600f9cc627bf998db475 1100w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?w=1650\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=5b792ea983ff320f382c44994b6ab547 1650w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/security-settings.png?w=2500\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=92ad8f6a8f8674c739db0e69f567fcb5 2500w`})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`If you haven’t configured `,_jsx(_components.a,{href:`/workspaces/sso`,children:`SSO`}),` yet, do it before enabling SCIM. Provisioned\nusers without SSO have to use the password reset flow on first login.`]})}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Generate a SCIM token`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Enable SCIM`}),`. Speckle generates a workspace-scoped bearer token and shows it once in a reveal dialog. Copy the token and the `,_jsx(_components.strong,{children:`SCIM base URL`}),` before closing.`]}),_jsx(Frame,{caption:`Token reveal dialog. Copy the token before closing.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=3bd70425547d395421be258db3926f76`,alt:`SCIM token reveal dialog`,\"data-og-width\":`1573`,width:`1573`,\"data-og-height\":`1032`,height:`1032`,\"data-path\":`images/workspaces/scim/token-reveal.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?w=280\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=3b264339ff12da1d4bbcefc1be10b7d4 280w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?w=560\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=ee3ca3ac8b3a431d369fb5741afc5963 560w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?w=840\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=c855c44b6cd73d378839485701513367 840w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?w=1100\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=cd6a5e67c78810eb7fc6a8285b8e6e60 1100w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?w=1650\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=9227852b71e74130fcef7126c77f1fe8 1650w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/token-reveal.png?w=2500\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=96a7d40791b8bcdca3f7f195b49a26cb 2500w`})}),_jsx(Warning,{children:_jsx(_components.p,{children:`The token is shown only once. Copy it somewhere safe — you cannot recover it later. If you lose it, rotate the token to generate a new one.`})})]}),_jsxs(Step,{title:`Configure your identity provider`,children:[_jsx(_components.p,{children:`In your identity provider, create a new SCIM 2.0 application pointing at:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SCIM endpoint`}),`: the base URL from the previous step, e.g. `,_jsx(_components.code,{children:`https://app.speckle.systems/api/v1/workspaces/{workspace-slug}/scim/v2`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Authentication`}),`: bearer token (paste the token you copied)`]}),`\n`]}),_jsxs(_components.p,{children:[`Filter the identity provider push to the users you want in the workspace.\nProvisioned users join with the workspace’s default project-access setting\nand the `,_jsx(_components.code,{children:`member`}),` workspace role.`]}),_jsx(Frame,{caption:`Example SCIM application configuration in your identity provider`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=a9639321d4eee5ccc3f5ca951bc8d7f9`,alt:`Identity provider SCIM configuration`,\"data-og-width\":`1794`,width:`1794`,\"data-og-height\":`1441`,height:`1441`,\"data-path\":`images/workspaces/scim/idp-config.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?w=280\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=edcc8dae5ef4821dfc1deed24232b39c 280w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?w=560\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=13503951b0400f176617ee692cd0420e 560w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?w=840\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=962392db804a2b4f5288d5643fdae1da 840w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?w=1100\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=f8d81f7aaf6d62ca6909c84ca98a5970 1100w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?w=1650\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=09f63849c553ce5fc73ac4daad7a3c3c 1650w, https://mintcdn.com/speckle/8-d0zKM4asW1fW43/images/workspaces/scim/idp-config.png?w=2500\u0026fit=max\u0026auto=format\u0026n=8-d0zKM4asW1fW43\u0026q=85\u0026s=0a2455bbab09bf929b274d472cd6b6bf 2500w`})})]}),_jsx(Step,{title:`Trigger the first sync`,children:_jsxs(_components.p,{children:[`Trigger a test sync from your identity provider. The SCIM card updates\n`,_jsx(_components.strong,{children:`Last sync`}),` and `,_jsx(_components.strong,{children:`Provisioned users`}),` within seconds, and the test user\nappears under workspace `,_jsx(_components.strong,{children:`Members`}),` with the default project-access setting.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-scim-syncs`,children:`What SCIM syncs`}),`\n`,_jsx(Heading,{level:`3`,id:`when-a-user-is-provisioned`,children:`When a user is provisioned`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A Speckle account is created if one doesn’t exist for the user’s primary email.`}),`\n`,_jsx(_components.li,{children:`An existing Speckle account is matched and linked when the email belongs to a verified workspace domain.`}),`\n`,_jsxs(_components.li,{children:[`The user joins the workspace as a `,_jsx(_components.code,{children:`member`}),` with the default project-access\nsetting.`]}),`\n`,_jsx(_components.li,{children:`The user’s display name and emails are synced from the identity provider.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`when-a-user-is-updated`,children:`When a user is updated`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Display name and given/family name updates flow through to the Speckle profile.`}),`\n`,_jsx(_components.li,{children:`Email changes on a verified workspace domain are synced. The identity provider’s primary email becomes the Speckle primary email.`}),`\n`,_jsx(_components.li,{children:`Secondary emails added in the identity provider are added in Speckle; secondary emails removed there are removed in Speckle.`}),`\n`,_jsx(_components.li,{children:`An unverified Speckle email matching the identity provider push is marked verified — Speckle trusts the identity provider as authoritative for its own domains.`}),`\n`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Email sync is restricted to verified workspace domains. Personal emails (e.g. `,_jsx(_components.code,{children:`@gmail.com`}),`) pushed\nfrom the identity provider are ignored.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`when-a-user-is-deprovisioned`,children:`When a user is deprovisioned`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The user is removed from the workspace.`}),`\n`,_jsx(_components.li,{children:`Their Speckle account, projects, and other workspace memberships are untouched.`}),`\n`,_jsxs(_components.li,{children:[`Reactivating the user in the identity provider later restores their workspace\nmembership with the default project-access setting and `,_jsx(_components.code,{children:`member`}),` role.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`SCIM cannot remove the last admin from a workspace. Promote another admin first, then deprovision\nin your identity provider.`})}),`\n`,_jsx(Heading,{level:`2`,id:`rotate-or-disable`,children:`Rotate or disable`}),`\n`,_jsx(_components.p,{children:`Open the SCIM card menu:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rotate token`}),` — generates a new token and revokes the old one. Update the token in your identity provider, otherwise the next sync returns 401.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Disable SCIM`}),` — revokes the token and stops syncing. Existing workspace members are kept; manage them manually until SCIM is re-enabled.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Rotate the token if you suspect it has leaked, when the admin who created it leaves the team, or\non your normal credential-rotation cadence.`})}),`\n`,_jsx(Heading,{level:`2`,id:`scim-endpoint-reference`,children:`SCIM endpoint reference`}),`\n`,_jsxs(_components.p,{children:[`All requests use `,_jsx(_components.code,{children:`Authorization: Bearer {token}`}),` and the `,_jsx(_components.code,{children:`application/scim+json`}),` content type. Pagination uses `,_jsx(_components.code,{children:`startIndex`}),` (1-based) and `,_jsx(_components.code,{children:`count`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Methods`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/ServiceProviderConfig`})}),_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:`Capability advertisement`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/ResourceTypes`}),`, `,_jsx(_components.code,{children:`/Schemas`})]}),_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:`Schema discovery`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/Users`})}),_jsx(_components.td,{children:`GET, POST`}),_jsxs(_components.td,{children:[`List (filter by `,_jsx(_components.code,{children:`userName eq`}),` or `,_jsx(_components.code,{children:`externalId eq`}),`), create`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/Users/{id}`})}),_jsx(_components.td,{children:`GET, PATCH, PUT, DELETE`}),_jsx(_components.td,{children:`Read, update, deprovision`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/Groups`}),`, `,_jsx(_components.code,{children:`/Groups/{id}`})]}),_jsx(_components.td,{children:`GET (empty), other → 501`}),_jsx(_components.td,{children:`Group provisioning is not implemented`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Do I need SSO to use SCIM?`,id:`do-i-need-sso-to-use-scim`,children:_jsxs(_components.p,{children:[`Not strictly, but it is strongly recommended. SCIM provisions accounts but\ndoes not handle login. Without SSO, every provisioned user must complete\nSpeckle’s password reset flow on first access. With SSO enabled first,\nprovisioned users sign in directly through your identity provider — no\npassword reset, no friction. Set up `,_jsx(_components.a,{href:`/workspaces/sso`,children:`SSO`}),` before enabling\nSCIM whenever possible.`]})}),_jsx(Accordion,{title:`What happens if a user's email is unverified in Speckle?`,id:`what-happens-if-a-users-email-is-unverified-in-speckle`,children:_jsx(_components.p,{children:`SCIM returns a 409 conflict. Ask the user to verify their email in Speckle\n(or remove the email from their account), then retry the sync from your\nidentity provider. SCIM never silently links unverified accounts.`})}),_jsx(Accordion,{title:`Can SCIM change a user's password or other workspace memberships?`,id:`can-scim-change-a-users-password-or-other-workspace-memberships`,children:_jsx(_components.p,{children:`No. SCIM never touches passwords — users authenticate through SSO\n(recommended) or via Speckle’s password reset flow if SSO is not configured.\nSCIM also only manages membership in the SCIM-enabled workspace; the user’s\nother workspace memberships are untouched.`})}),_jsx(Accordion,{title:`Can SCIM manage project membership?`,id:`can-scim-manage-project-membership`,children:_jsx(_components.p,{children:`No. SCIM manages workspace-level user lifecycle (create, update, remove)\nwithin the SCIM-enabled workspace. Project collaborator membership and\nproject-level roles are managed separately in project settings.`})}),_jsx(Accordion,{title:`Can the same user be SCIM-managed in multiple workspaces?`,id:`can-the-same-user-be-scim-managed-in-multiple-workspaces`,children:_jsx(_components.p,{children:`No. A user can only be SCIM-managed in one workspace at a time. Provisioning\na user who is already SCIM-active in another workspace returns a 409\nconflict — deprovision them in the first workspace before provisioning\nelsewhere.`})}),_jsx(Accordion,{title:`What if I lose the SCIM token?`,id:`what-if-i-lose-the-scim-token`,children:_jsxs(_components.p,{children:[`Tokens cannot be recovered. Open `,_jsx(_components.strong,{children:`Settings -> Security`}),`, rotate\nthe token, and update your identity provider with the new value.`]})}),_jsx(Accordion,{title:`Does SCIM upgrade permissions above the defaults?`,id:`does-scim-upgrade-permissions-above-the-defaults`,children:_jsx(_components.p,{children:`No. SCIM creates members using the workspace defaults. It does not promote\nusers to admin or elevate project permissions automatically.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"User provisioning (SCIM)","description":"Sync workspace members from your identity provider","sidebarTitle":"Provisioning (SCIM)","tag":"Enterprise","href":"/workspaces/scim"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Set up SSO first","slug":"set-up-sso-first","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Enable SCIM","slug":"enable-scim","depth":2,"children":[]},{"title":"What SCIM syncs","slug":"what-scim-syncs","depth":2,"children":[{"title":"When a user is provisioned","slug":"when-a-user-is-provisioned","depth":3,"children":[]},{"title":"When a user is updated","slug":"when-a-user-is-updated","depth":3,"children":[]},{"title":"When a user is deprovisioned","slug":"when-a-user-is-deprovisioned","depth":3,"children":[]}]},{"title":"Rotate or disable","slug":"rotate-or-disable","depth":2,"children":[]},{"title":"SCIM endpoint reference","slug":"scim-endpoint-reference","depth":2,"children":[]},{"title":"FAQ","slug":"faq","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/speckle/338e4d421a1293df/.omp/extensions/atlas-sync.js"],"subdomain":"speckle","siteName":"Speckle Docs","title":"User provisioning (SCIM) - Speckle Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-18T12:12:48.233Z","gitLastModified":"2026-07-18T12:11:54.000Z","originalFileLocation":"workspaces/scim.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Sync workspace members from your identity provider\">\u003cmeta data-mint-head name=\"application-name\" content=\"Speckle Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"User provisioning (SCIM) - Speckle Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Sync workspace members from your identity provider\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Speckle Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.speckle.systems/workspaces/scim\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://speckle.mintlify.app/_mintlify/api/og/v2?division=Access+and+Identity\u0026amp;title=User+provisioning+%28SCIM%29\u0026amp;description=Sync+workspace+members+from+your+identity+provider\u0026amp;theme=0f587db618e29aef1bad566c\u0026amp;signature=a679777863d1fb98c1ac220e09140fd8c912227c4b76ed53dba722750bd58bb0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"User provisioning (SCIM) - Speckle Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Sync workspace members from your identity provider\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://speckle.mintlify.app/_mintlify/api/og/v2?division=Access+and+Identity\u0026amp;title=User+provisioning+%28SCIM%29\u0026amp;description=Sync+workspace+members+from+your+identity+provider\u0026amp;theme=0f587db618e29aef1bad566c\u0026amp;signature=a679777863d1fb98c1ac220e09140fd8c912227c4b76ed53dba722750bd58bb0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Speckle Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2563EB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.speckle.systems/workspaces/scim\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/workspaces/scim.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.speckle.systems/#organization\",\"name\":\"Speckle Docs\",\"url\":\"https://docs.speckle.systems\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/speckle/8FGkkbZZbcuHzOBq/logo/light.svg?fit=max\u0026auto=format\u0026n=8FGkkbZZbcuHzOBq\u0026q=85\u0026s=9fc87cac252fa8cc443a9828ecbace70\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.speckle.systems#website\",\"name\":\"Speckle Docs\",\"url\":\"https://docs.speckle.systems\",\"publisher\":{\"@id\":\"https://docs.speckle.systems/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.speckle.systems/workspaces/scim#webpage\",\"url\":\"https://docs.speckle.systems/workspaces/scim\",\"name\":\"User provisioning (SCIM)\",\"description\":\"Sync workspace members from your identity provider\",\"dateModified\":\"2026-07-18T12:11:54.000Z\",\"isPartOf\":{\"@id\":\"https://docs.speckle.systems#website\"},\"breadcrumb\":{\"@id\":\"https://docs.speckle.systems/workspaces/scim#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.speckle.systems/workspaces/scim#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Your Speckle Workspace\",\"item\":\"https://docs.speckle.systems/workspaces/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access and Identity\",\"item\":\"https://docs.speckle.systems/workspaces/roles-and-seats\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"User provisioning (SCIM)\",\"item\":\"https://docs.speckle.systems/workspaces/scim\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.speckle.systems/workspaces/scim#article\",\"headline\":\"User provisioning (SCIM)\",\"name\":\"User provisioning (SCIM)\",\"description\":\"Sync workspace members from your identity provider\",\"url\":\"https://docs.speckle.systems/workspaces/scim\",\"mainEntityOfPage\":{\"@id\":\"https://docs.speckle.systems/workspaces/scim#webpage\"},\"dateModified\":\"2026-07-18T12:11:54.000Z\",\"publisher\":{\"@id\":\"https://docs.speckle.systems/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.speckle.systems#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Speckle Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Speckle Docs","nav":{"global":null,"dropdowns":[{"dropdown":"User Guides","icon":"book-open","groups":[{"group":"Quick Reference","pages":[{"title":"Welcome to Speckle","sidebarTitle":"Welcome","href":"/quickstart/welcome"},{"title":"Speckle's new data model: what has changed for you","sidebarTitle":"Data model migration","href":"/workspaces/data-model-migration"},{"title":"Quickstart Guide","href":"/quickstart/quickstart"},{"title":"Frequently Asked Questions","href":"/quickstart/faq"},{"title":"What's new in 2026.9 for workspace users","sidebarTitle":"What's new","href":"/whats-new/users"}]},{"group":"Your Speckle Workspace","pages":[{"title":"Organize teams and projects","sidebarTitle":"Overview","href":"/workspaces/introduction"},{"group":"Projects, Models, and Versions","pages":[{"title":"Projects","href":"/workspaces/projects"},{"title":"Models","href":"/workspaces/models"},{"title":"Version Control","href":"/workspaces/versions"}]},{"group":"Access and Identity","pages":[{"title":"Roles and permissions","href":"/workspaces/roles-and-seats"},{"title":"Invite to Workspace","href":"/workspaces/inviting"},{"title":"Workspace Discoverability","href":"/workspaces/workspace-discoverability"},{"title":"Domain Protection","href":"/workspaces/domain-protection"},{"title":"Single Sign-On (SSO)","description":"Secure who can access your workspace","tag":"Enterprise","href":"/workspaces/sso"},{"title":"User provisioning (SCIM)","sidebarTitle":"Provisioning (SCIM)","tag":"Enterprise","href":"/workspaces/scim"}]},{"group":"Plans and Governance","pages":[{"title":"Plans and Governance","sidebarTitle":"Overview","description":"A single place for plan controls, governance features, compliance, and secure sharing practices.","href":"/workspaces/plans-and-governance"},{"title":"Billing","href":"/workspaces/billing"},{"title":"Data Residency","tag":"Enterprise","href":"/workspaces/data-residency"}]},{"group":"Configuration","pages":[{"title":"Configuration","href":"/workspaces/configuration"},{"title":"Check workspace activity, plan limits, and AI spend","sidebarTitle":"Usage","href":"/workspaces/usage"},{"title":"Project metadata","tag":"Enterprise","href":"/workspaces/configuration/project-metadata"}]}]},{"group":"Viewing \u0026 Sharing","pages":[{"title":"Open and explore models in the 3D viewer","sidebarTitle":"Overview","href":"/3d-viewer/introduction"},{"title":"Interface and navigation","href":"/3d-viewer/interface-nav"},{"group":"Inspect and Compare","pages":[{"title":"Filter, browse, and measure your model","sidebarTitle":"Exploration","href":"/3d-viewer/exploration"},{"title":"Compare versions","href":"/3d-viewer/compare-versions"},{"title":"Combine models in one scene","sidebarTitle":"Model federation","href":"/3d-viewer/federation"}]},{"group":"Feedback and Tracking","pages":[{"title":"Issues","href":"/3d-viewer/issues"},{"title":"Sketch on your model","sidebarTitle":"Sketch","href":"/3d-viewer/markups"},{"title":"Saved views","href":"/3d-viewer/saved-views"}]},{"group":"Present and Share","pages":[{"title":"Present a model with saved views","sidebarTitle":"Presentation","href":"/3d-viewer/presentation"},{"title":"Share your models","href":"/3d-viewer/sharing"}]}]},{"group":"Publishing \u0026 Loading","pages":[{"title":"Connectors, cloud integrations, and file uploads","sidebarTitle":"Overview","href":"/connectors/overview"},{"group":"Connectors","pages":[{"title":"Installing Connectors","href":"/connectors/installation"},{"title":"Connector Assets \u0026 Templates","sidebarTitle":"Assets \u0026 Templates","href":"/connectors/assets"},{"group":"Revit","pages":[{"title":"How to use Speckle for Revit","sidebarTitle":"Quickstart","href":"/connectors/revit/revit"},{"title":"Loading blocks as families in Revit","sidebarTitle":"Blocks as Families","href":"/connectors/revit/blocks-to-families"}]},{"group":"Rhino","pages":[{"title":"How to use Speckle for Rhino","sidebarTitle":"Quickstart","href":"/connectors/rhino/rhino"},{"title":"Revit Categorization","href":"/connectors/rhino/rhino-revit"},{"title":"RhinoInside","sidebarTitle":"RhinoInside","href":"/connectors/grasshopper/grasshopper-integrations"}]},{"group":"Grasshopper","pages":[{"title":"How to use Speckle for Grasshopper","sidebarTitle":"Quickstart","href":"/connectors/grasshopper/grasshopper"},{"title":"Explore what an object is connected to","sidebarTitle":"Explore","href":"/connectors/grasshopper/explore"},{"title":"Models","href":"/connectors/grasshopper/grasshopper-models"},{"title":"Collections","href":"/connectors/grasshopper/grasshopper-collections"},{"title":"Objects","href":"/connectors/grasshopper/grasshopper-objects"},{"title":"Properties","href":"/connectors/grasshopper/grasshopper-properties"},{"title":"Developer Nodes","href":"/connectors/grasshopper/grasshopper-developer"},{"title":"Recommendations","href":"/connectors/grasshopper/grasshopper-recommendations"},{"title":"Karamba3D","sidebarTitle":"Karamba3D","tag":"Third-Party","href":"/connectors/third-party/karamba3d"},{"title":"ShapeDiver","sidebarTitle":"ShapeDiver","tag":"Third-Party","href":"/connectors/third-party/shapediver"}]},{"title":"How to use Speckle for SketchUp","sidebarTitle":"SketchUp","href":"/connectors/sketchup"},{"group":"Power BI","pages":[{"title":"How to use Speckle for Power BI","sidebarTitle":"Quickstart","href":"/connectors/power-bi/power-bi"},{"title":"Power BI Data Gateway","sidebarTitle":"Data Gateway","href":"/connectors/power-bi/gateway"}]},{"title":"How to use Speckle for Archicad","sidebarTitle":"Archicad","href":"/connectors/archicad"},{"title":"Publish Navisworks models to Speckle","sidebarTitle":"Navisworks","href":"/connectors/navisworks"},{"title":"How to use Speckle for Blender","sidebarTitle":"Blender","href":"/connectors/blender"},{"title":"How to use Speckle for Civil 3D","sidebarTitle":"Civil 3D","href":"/connectors/civil3d"},{"title":"How to use Speckle for Plant 3D","sidebarTitle":"Plant 3D","href":"/connectors/plant3d"},{"title":"How to use Speckle for AutoCAD","sidebarTitle":"AutoCAD","href":"/connectors/autocad"},{"title":"How to use Speckle for ETABS","sidebarTitle":"ETABS","href":"/connectors/etabs"},{"title":"How to use Speckle for Tekla Structures","sidebarTitle":"Tekla Structures","href":"/connectors/teklastructures"},{"title":"How to use Speckle for Vectorworks","sidebarTitle":"Vectorworks","tag":"Third-Party","href":"/connectors/third-party/vectorworks"}]},{"group":"Cloud Integrations","pages":[{"title":"Autodesk Forma Data Management","sidebarTitle":"Forma Data Management (ACC)","tag":"Enterprise","href":"/connectors/cloud-integrations/acc"},{"title":"Sync models from Trimble Connect","sidebarTitle":"Trimble Connect","tag":"Enterprise","href":"/connectors/cloud-integrations/trimble-connect"},{"title":"Sync models from SharePoint","sidebarTitle":"SharePoint","href":"/connectors/cloud-integrations/sharepoint"},{"title":"Bentley ProjectWise","sidebarTitle":"Bentley ProjectWise","tag":"Enterprise","href":"/connectors/cloud-integrations/projectwise"},{"title":"Databricks","sidebarTitle":"Databricks","href":"/connectors/cloud-integrations/databricks"},{"title":"Snowflake","sidebarTitle":"Snowflake","href":"/connectors/cloud-integrations/snowflake"}]},{"title":"Direct uploads","href":"/connectors/direct-uploads/introduction"}]},{"group":"Analytics \u0026 Intelligence","pages":[{"group":"Intelligence","pages":[{"title":"Ask questions about your models with Speckle Intelligence","sidebarTitle":"Speckle Intelligence","href":"/analytics/intelligence"},{"title":"Reuse organisation playbooks with Intelligence skills","sidebarTitle":"Skills","href":"/analytics/intelligence-skills"},{"title":"Set standing AI Rules for the workspace","sidebarTitle":"AI Rules","href":"/analytics/intelligence-rules"},{"title":"Create and share Intelligence Reports","sidebarTitle":"Reports","href":"/analytics/reports"}]},{"group":"Dashboards","pages":[{"title":"Intelligence Dashboards","sidebarTitle":"Overview","href":"/analytics/intelligence-dashboards"},{"title":"Retired and replaced dashboard widgets","sidebarTitle":"Widget availability","href":"/analytics/dashboards-widget-availability"},{"title":"Layout","sidebarTitle":"Layout","href":"/analytics/dashboards/layout"},{"title":"Sharing","sidebarTitle":"Sharing","href":"/analytics/dashboards/sharing"},{"title":"Filters","sidebarTitle":"Filters","href":"/analytics/dashboards/filters"},{"title":"Lookup tables","sidebarTitle":"Lookup tables","href":"/analytics/dashboards/lookup-tables"},{"title":"Calculated fields","sidebarTitle":"Calculated fields","href":"/analytics/dashboards/calculated-fields"},{"title":"Common workflows","sidebarTitle":"Common workflows","href":"/analytics/dashboards/common-workflows"}]},{"group":"Data Validation","pages":[{"title":"Data Validation","sidebarTitle":"Overview","href":"/analytics/data-validation/overview"},{"title":"Checks","sidebarTitle":"Checks","href":"/analytics/data-validation/checks"},{"title":"Project standards","sidebarTitle":"Standards","href":"/analytics/data-validation/standards"},{"title":"Viewing Results","sidebarTitle":"Viewing Results","href":"/analytics/data-validation/viewing-results"},{"title":"Validation Widgets in Dashboards","sidebarTitle":"Validation Widgets","href":"/analytics/dashboards/validation-widgets"}]},{"group":"Data Conditioning","pages":[{"title":"Update parameters from the model viewer","sidebarTitle":"Parameter Updater","href":"/beta/parameter-updater"}]}]},{"group":"Workflows","pages":[{"title":"Combine capabilities into outcomes","sidebarTitle":"Overview","href":"/workflows/overview"},{"title":"Assess model changes with Speckle Intelligence","sidebarTitle":"Compare versions with Intelligence","href":"/workflows/assess-model-changes"},{"title":"Take off quantities and cost with Speckle Intelligence","sidebarTitle":"Quantity \u0026 cost takeoff","href":"/workflows/take-off-quantities"},{"title":"Benchmark a project against your portfolio with Speckle Intelligence","sidebarTitle":"Portfolio benchmarking","href":"/workflows/benchmark-against-your-portfolio"},{"title":"Validate incoming models automatically","sidebarTitle":"Automatic model validation","href":"/workflows/validate-incoming-models-automatically"},{"title":"Design review workflow","sidebarTitle":"Design Review","href":"/workflows/design-review-workflow"},{"title":"Componentised Grasshopper workflow","sidebarTitle":"Grasshopper","href":"/workflows/grasshopper-componentised-workflow"},{"title":"Compare parametric design options from Grasshopper","sidebarTitle":"Design Explorer","href":"/workflows/grasshopper-design-explorer"},{"title":"Extract Revit room data with SpecklePy","sidebarTitle":"Revit room data extraction","href":"/workflows/revit-room-data-extraction-specklepy"},{"title":"Analyse model data with SpecklePy and DuckDB","sidebarTitle":"SpecklePy analytics","href":"/workflows/specklepy-model-data-analytics"}]}],"global":{"anchors":[]}},{"dropdown":"Developers","icon":"code","tabs":[{"tab":"Build with Speckle","groups":[{"group":"Overview","pages":[{"title":"Developer documentation","sidebarTitle":"Introduction","href":"/developers/introduction"},{"title":"What's new in 2026.9 for developers","sidebarTitle":"What's new","href":"/whats-new/developers"}]},{"group":"Getting Started","pages":[{"title":"Your learning path","sidebarTitle":"Your Learning Path","href":"/developers/getting-started"},{"group":"Authentication","pages":[{"title":"Authenticating with Speckle","sidebarTitle":"Introduction","href":"/developers/authentication/introduction"},{"title":"Building with PATs","sidebarTitle":"PATs","href":"/developers/authentication/pats"},{"title":"Building with OAuth2","sidebarTitle":"OAuth2 and PKCE","href":"/developers/authentication/oauth2"},{"title":"Single Sign-On (SSO) Authentication","sidebarTitle":"SSO Authentication","href":"/developers/authentication/sso"}]},{"title":"Key Concepts","sidebarTitle":"Key Concepts","href":"/developers/key-concepts"}]},{"group":"Building Custom Apps","pages":[{"title":"Building Custom Applications","sidebarTitle":"Building Custom Apps","href":"/developers/building-apps"}]},{"group":"Building Integrations","pages":[{"title":"Add Speckle connectivity to your authoring applications","sidebarTitle":"Overview","href":"/developers/building-integrations"},{"title":"Build integrations on the bundle format","sidebarTitle":"Bundles","href":"/developers/building-integrations/bundles"},{"title":"Publish a bundle from your own code","sidebarTitle":"Publish","href":"/developers/building-integrations/publish"},{"title":"Load a bundle in your own code","sidebarTitle":"Load","href":"/developers/building-integrations/load"},{"title":"Publish, load, and integration depth","sidebarTitle":"Publish \u0026 Load","href":"/developers/connectivity/integration-depth"},{"title":"Desktop host connectivity","sidebarTitle":"Desktop Host","href":"/developers/connectivity/desktop-host"},{"title":"Cloud and automation connectivity","sidebarTitle":"Cloud \u0026 Automation","href":"/developers/connectivity/cloud-automation"},{"title":"Middleware and orchestration","sidebarTitle":"Middleware","href":"/developers/connectivity/middleware"},{"title":"Hybrid connectivity","sidebarTitle":"Hybrid","href":"/developers/connectivity/hybrid"},{"title":"Data model and build order","sidebarTitle":"Data \u0026 Build Order","href":"/developers/connectivity/data-and-build"},{"title":"Connectivity resources","sidebarTitle":"Resources","href":"/developers/connectivity/resources"}]},{"group":"Migration notices","hidden":true,"pages":[{"title":"Speckle's new data model: what has changed for developers","sidebarTitle":"Data model migration","href":"/developers/migration/data-model-migration"},{"title":"Publish through model ingestions, not legacy send","sidebarTitle":"Publish via ingestions","href":"/developers/migration/publish-through-ingestions"}]}]},{"tab":"Data Schema","groups":[{"group":"Object model","pages":[{"title":"Object model","sidebarTitle":"Overview","href":"/developers/object-model/overview"},{"title":"Relations","sidebarTitle":"Relations","href":"/developers/object-model/relations"},{"title":"Where version metadata lives","sidebarTitle":"Version metadata","href":"/developers/object-model/version-metadata"},{"title":"Geometry encoding","sidebarTitle":"Geometry encoding","href":"/developers/object-model/geometry-encoding"}]},{"group":"Object graph (before 2026.9)","pages":[{"title":"Data schema","href":"/developers/data-schema/overview"},{"title":"Core Concepts","href":"/developers/data-schema/concepts"},{"title":"Versions and the root object","href":"/developers/data-schema/version-root-object"},{"title":"Object Schema","href":"/developers/data-schema/object-schema"},{"title":"Traversal Recipes","href":"/developers/data-schema/traversal-recipes"},{"title":"Geometry Schema","href":"/developers/data-schema/geometry-schema"},{"title":"Proxy Schemas","href":"/developers/data-schema/proxy-schema"}]},{"group":"Connectors","pages":[{"title":"Object Types by Connector","sidebarTitle":"Object Types","href":"/developers/data-schema/connector-index"},{"group":"Schemas by Data Source","pages":[{"title":"ArchiCAD Schema","href":"/developers/data-schema/connectors/archicad-schema"},{"title":"IFC Schema","href":"/developers/data-schema/connectors/ifc-schema"},{"title":"Navisworks Schema","href":"/developers/data-schema/connectors/navisworks-schema"},{"title":"Revit Schema","href":"/developers/data-schema/connectors/revit-schema"},{"title":"Tekla Schema","href":"/developers/data-schema/connectors/tekla-schema"},{"title":"AutoCAD Schema","href":"/developers/data-schema/connectors/autocad-schema"},{"title":"Civil 3D Schema","href":"/developers/data-schema/connectors/civil3d-schema"},{"title":"ETABS Schema","href":"/developers/data-schema/connectors/etabs-schema"},{"title":"Rhino Schema","href":"/developers/data-schema/connectors/rhino-schema"}]}]}]},{"tab":"Interfaces","groups":[{"group":"GraphQL","pages":[{"title":"API reference","href":"/developers/api/graphql"},{"title":"Subscriptions","href":"/developers/api/subscriptions"},{"title":"GraphQL Endpoint","deprecated":null,"version":null,"openapi":"/developers/api/graphql-openapi.json post /graphql","href":"/api-reference/graphql/graphql-endpoint"}]},{"group":"REST","pages":[{"title":"API reference","href":"/developers/api/rest"},{"title":"Preview Service","href":"/developers/api/previews/preview-service"},{"title":"Download a Single Object","deprecated":null,"version":null,"openapi":"/developers/api/rest-openapi.json get /objects/{projectId}/{objectId}/single","href":"/api-reference/objects/download-a-single-object"},{"title":"Download an Object and All its Children","deprecated":null,"version":null,"openapi":"/developers/api/rest-openapi.json get /objects/{projectId}/{objectId}","href":"/api-reference/objects/download-an-object-and-all-its-children"}]},{"group":"Webhooks","pages":[{"title":"Broadcast and Subscribe to Speckle Events with Webhooks","sidebarTitle":"Webhooks Overview","href":"/developers/api/webhooks"},{"title":"Events and Payloads","href":"/developers/api/webhooks/events"},{"title":"Creating and Managing Webhooks","href":"/developers/api/webhooks/management"},{"title":"Webhook Security","href":"/developers/api/webhooks/security"}]},{"group":"Guides","pages":[{"title":"Upload IFC and other files to Speckle","sidebarTitle":"Upload files","href":"/developers/api/guides/file-uploads"},{"title":"Read and Write Project Metadata via GraphQL","sidebarTitle":"Project metadata","tag":"Enterprise","href":"/developers/api/guides/project-metadata"},{"title":"Updating Cloud Integration Syncs via GraphQL","sidebarTitle":"Updating Syncs","href":"/developers/api/guides/updating-syncs"},{"title":"Get Data Validation Results with GraphQL","sidebarTitle":"Validation Results","href":"/developers/api/guides/data-validation-results"},{"title":"Send Slack Notifications from Speckle Webhooks","sidebarTitle":"Slack Notifications","href":"/developers/api/guides/slack-notifications"}]}]},{"tab":"SDKs","groups":[{"group":"Speckle SDKs","pages":[{"title":"Introduction","sidebarTitle":"Introduction","href":"/developers/sdks/introduction"}]},{"group":"Python","icon":"python","pages":[{"title":"specklepy","href":"/developers/sdks/python/introduction"},{"title":"Migrate a specklepy script to 2026.9","sidebarTitle":"Migrate to 2026.9","href":"/developers/sdks/python/migrate-to-2026-9"},{"group":"Getting Started","pages":[{"title":"Installation","href":"/developers/sdks/python/getting-started/installation"},{"title":"Authentication","href":"/developers/sdks/python/getting-started/authentication"},{"title":"Quickstart","href":"/developers/sdks/python/getting-started/quickstart"}]},{"group":"Core Concepts","pages":[{"title":"Python SDK concepts","href":"/developers/sdks/python/concepts/overview"},{"title":"Data Types in Speckle","href":"/developers/sdks/python/concepts/data-types"},{"title":"Objects \u0026 Base Class","href":"/developers/sdks/python/concepts/objects"},{"title":"Data Traversal","href":"/developers/sdks/python/concepts/data-traversal"},{"title":"Display Values","href":"/developers/sdks/python/concepts/display-values"},{"title":"Proxification","href":"/developers/sdks/python/concepts/proxification"}]},{"group":"API Reference","pages":[{"title":"SpeckleClient","href":"/developers/sdks/python/api-reference/client"},{"title":"Operations","href":"/developers/sdks/python/api-reference/operations"},{"group":"Resources","pages":[{"title":"ProjectResource","href":"/developers/sdks/python/api-reference/resources/project"},{"title":"ModelResource","href":"/developers/sdks/python/api-reference/resources/model"},{"title":"VersionResource","href":"/developers/sdks/python/api-reference/resources/version"},{"title":"ActiveUserResource","href":"/developers/sdks/python/api-reference/resources/active-user"},{"title":"OtherUserResource","href":"/developers/sdks/python/api-reference/resources/other-user"},{"title":"WorkspaceResource","href":"/developers/sdks/python/api-reference/resources/workspace"},{"title":"ServerResource","href":"/developers/sdks/python/api-reference/resources/server"}]},{"title":"Transports","href":"/developers/sdks/python/api-reference/transports"},{"title":"Exceptions","href":"/developers/sdks/python/api-reference/exceptions"}]},{"group":"Guides","pages":[{"title":"Working with Speckle Objects","href":"/developers/sdks/python/guides/how-to-work-with-objects"},{"title":"Finding and Extracting Data","href":"/developers/sdks/python/guides/how-to-find-and-extract-data"},{"title":"Performance and Complex Patterns","href":"/developers/sdks/python/guides/how-to-optimize-and-handle-complexity"},{"title":"Simple Data Patterns","href":"/developers/sdks/python/guides/simple-data-patterns"},{"title":"BIM Data Patterns","href":"/developers/sdks/python/guides/bim-data-patterns"},{"title":"Extracting Display Values and Transform Instances","href":"/developers/sdks/python/guides/working-with-proxies"},{"title":"Understanding Speckle Mesh","href":"/developers/sdks/python/guides/understanding-speckle-mesh"},{"title":"Working with Geometry","href":"/developers/sdks/python/guides/working-with-geometry"}]}]},{"group":"C# .NET","icon":"microsoft","pages":[{"title":"speckle-sharp","sidebarTitle":"speckle-sharp","href":"/developers/sdks/dotnet/introduction"},{"title":"Migrate a Speckle.Sdk script to 2026.9","sidebarTitle":"Migrate to 2026.9","href":"/developers/sdks/dotnet/migrate-to-2026-9"},{"group":"Getting Started","pages":[{"title":"Installation","sidebarTitle":"Installation","href":"/developers/sdks/dotnet/getting-started/installation"},{"title":"Build your first model analysis tool","sidebarTitle":"First analysis tool","href":"/developers/sdks/dotnet/guides/build-your-first-model-analysis-tool"},{"title":"Automate with scripts and notebooks","sidebarTitle":"Scripts","href":"/developers/sdks/dotnet/getting-started/scripts-and-notebooks"},{"title":"Authentication","sidebarTitle":"Authentication","href":"/developers/sdks/dotnet/getting-started/authentication"},{"title":"Publish and load a model from C#","sidebarTitle":"Quickstart","href":"/developers/sdks/dotnet/getting-started/quickstart"}]},{"group":"Guides","pages":[{"title":"Use SpeckleSharp in a Grasshopper C# node","sidebarTitle":"Grasshopper C#","href":"/developers/sdks/dotnet/guides/use-speckle-sdk-in-grasshopper-csharp"},{"title":"Find objects by property","sidebarTitle":"Find \u0026 extract","href":"/developers/sdks/dotnet/guides/finding-and-extracting-data"},{"title":"Export model data to CSV","sidebarTitle":"Export to CSV","href":"/developers/sdks/dotnet/guides/export-model-data-to-csv"},{"title":"Send analysis results back to Speckle","sidebarTitle":"Send results back","href":"/developers/sdks/dotnet/guides/send-analysis-results-back"},{"title":"BIM data patterns","sidebarTitle":"BIM patterns","href":"/developers/sdks/dotnet/guides/bim-data-patterns"},{"title":"Compare two model versions","sidebarTitle":"Compare versions","href":"/developers/sdks/dotnet/guides/compare-two-model-versions"},{"title":"Resolve groups and instances","sidebarTitle":"Proxies","href":"/developers/sdks/dotnet/guides/working-with-proxies"},{"title":"Read and create geometry","sidebarTitle":"Geometry","href":"/developers/sdks/dotnet/guides/working-with-geometry"},{"title":"Handling server capabilities","href":"/developers/sdks/dotnet/guides/handling-server-capabilities"},{"title":"Publish large models (connectors)","sidebarTitle":"Connector sends","href":"/developers/sdks/dotnet/guides/building-connector-scale-sends"}]},{"group":"Concepts","pages":[{"title":"How your code talks to Speckle Server","sidebarTitle":"Core concepts","href":"/developers/sdks/dotnet/concepts/overview"},{"title":"Work with model objects","sidebarTitle":"Objects","href":"/developers/sdks/dotnet/concepts/objects-and-traversal"},{"title":"Load and publish model data","sidebarTitle":"Send \u0026 receive","href":"/developers/sdks/dotnet/concepts/send-and-receive-paths"},{"title":"Dependency injection (connectors)","sidebarTitle":"DI (advanced)","href":"/developers/sdks/dotnet/concepts/dependency-injection"}]},{"group":"API Reference","pages":[{"title":"Client","sidebarTitle":"Client","href":"/developers/sdks/dotnet/api-reference/client"},{"title":"Service registration","sidebarTitle":"Registration","href":"/developers/sdks/dotnet/api-reference/service-registration"},{"title":"Operations","sidebarTitle":"Operations","href":"/developers/sdks/dotnet/api-reference/operations"},{"group":"Resources","pages":[{"title":"Project","sidebarTitle":"Project","href":"/developers/sdks/dotnet/api-reference/resources/project"},{"title":"Model","sidebarTitle":"Model","href":"/developers/sdks/dotnet/api-reference/resources/model"},{"title":"Version","sidebarTitle":"Version","href":"/developers/sdks/dotnet/api-reference/resources/version"},{"title":"Users","sidebarTitle":"Users","href":"/developers/sdks/dotnet/api-reference/resources/users"},{"title":"Workspace","sidebarTitle":"Workspace","href":"/developers/sdks/dotnet/api-reference/resources/workspace"},{"title":"Server","sidebarTitle":"Server","href":"/developers/sdks/dotnet/api-reference/resources/server"},{"title":"Model ingestion","sidebarTitle":"Ingestion","href":"/developers/sdks/dotnet/api-reference/resources/ingestion"}]},{"title":"Transports","sidebarTitle":"Transports","href":"/developers/sdks/dotnet/api-reference/transports"},{"title":"Exceptions","sidebarTitle":"Exceptions","href":"/developers/sdks/dotnet/api-reference/exceptions"}]}]},{"group":"JS/TS","icon":"javascript","pages":[{"title":"speckle.js","href":"/developers/sdks/typescript/introduction"}]}]},{"tab":"Viewer","groups":[{"group":"Speckle Viewer","pages":[{"title":"Developers Guide","sidebarTitle":"Getting Started","href":"/developers/viewer/introduction"},{"title":"Load a bundle in your Viewer app","sidebarTitle":"Loading bundles","href":"/developers/viewer/loading-bundles"},{"title":"Installation","href":"/developers/viewer/installation"},{"title":"Basic Setup","href":"/developers/viewer/basic-setup"},{"title":"Advanced Setup","href":"/developers/viewer/advanced-setup"}]},{"group":"Core Concepts","pages":[{"title":"3D Viewer","href":"/developers/viewer/overview"},{"title":"Data Tree","href":"/developers/viewer/viewer-data"},{"title":"Rendering","href":"/developers/viewer/viewer-rendering"},{"title":"Loaders","href":"/developers/viewer/loaders"}]},{"group":"API Reference","pages":[{"group":"Viewer Core","pages":[{"title":"AccelerationStructure","href":"/developers/viewer/acceleration-structure-api"},{"title":"Batch","href":"/developers/viewer/batch-api"},{"title":"BatchObject","href":"/developers/viewer/batch-object-api"},{"title":"GeometryConverter","href":"/developers/viewer/geometry-converter-api"},{"title":"Input","href":"/developers/viewer/input-api"},{"title":"Intersections","href":"/developers/viewer/intersections-api"},{"title":"Loader","href":"/developers/viewer/loader-api"},{"title":"Queries","href":"/developers/viewer/queries-api"},{"title":"NodeRenderView","href":"/developers/viewer/render-view-api"},{"title":"RenderTree","href":"/developers/viewer/render-tree-api"},{"group":"Rendering Pipelines","pages":[{"title":"Pipeline","href":"/developers/viewer/rendering-pipeline-api/pipeline-api"},{"title":"ProgressivePipeline","href":"/developers/viewer/rendering-pipeline-api/progressive-pipeline-api"},{"title":"GPass","href":"/developers/viewer/rendering-pipeline-api/g-pass-api"},{"title":"BaseGPass","href":"/developers/viewer/rendering-pipeline-api/base-g-pass-api"},{"title":"ProgressiveGPass","href":"/developers/viewer/rendering-pipeline-api/progressive-g-pass-api"}]},{"title":"SpeckleMaterial","href":"/developers/viewer/speckle-material-api"},{"title":"SpeckleRenderer","href":"/developers/viewer/speckle-renderer-api"},{"title":"TopLevelAccelerationStructure","href":"/developers/viewer/top-level-acceleration-structure-api"},{"title":"Viewer","href":"/developers/viewer/viewer-api"},{"title":"WorldTree","href":"/developers/viewer/world-tree-api"}]},{"group":"Extensions","pages":[{"title":"Extension","href":"/developers/viewer/extensions/extension-api"},{"title":"CameraController","href":"/developers/viewer/extensions/camera-controller-api"},{"title":"DifExtension","href":"/developers/viewer/extensions/diff-extension-api"},{"title":"FilteringExtension","href":"/developers/viewer/extensions/filtering-extension-api"},{"title":"MeasurementsTool","href":"/developers/viewer/extensions/measurements-tool-api"},{"title":"SelectionExtension","href":"/developers/viewer/extensions/selection-extension-api"},{"title":"SectionTool","href":"/developers/viewer/extensions/section-tool-api"},{"title":"SectionToolOutlines","href":"/developers/viewer/extensions/section-tool-outlines-api"},{"title":"SpeckleControls","href":"/developers/viewer/extensions/speckle-controls-api"},{"title":"SmoothOrbitControls","href":"/developers/viewer/extensions/smooth-orbit-controls-api"},{"title":"ViewModes","href":"/developers/viewer/extensions/view-modes-api"}]}]},{"group":"Examples","pages":[{"title":"Basic Example","href":"/developers/viewer/examples/basic-example"},{"title":"More Extensions","href":"/developers/viewer/examples/more-extensions-example"},{"title":"Filtering","href":"/developers/viewer/examples/filtering-example"},{"title":"Loading Data","href":"/developers/viewer/examples/loading-example"},{"title":"Object Manipulation","href":"/developers/viewer/examples/object-manipulation-example"},{"title":"Box Selection","href":"/developers/viewer/examples/box-selection-example"},{"title":"Animation \u0026 Custom Text","href":"/developers/viewer/examples/categorize-example"}]},{"group":"Reference","pages":[{"title":"Migration Guide","href":"/developers/viewer/migration-guide"},{"title":"Backwards Compatibility","href":"/developers/viewer/migration-guide-compatibility"},{"title":"API 1.0 Full Migration","href":"/developers/viewer/migration-guide-v1"}]}]},{"tab":"Server","groups":[{"group":"Speckle Server","pages":[{"title":"Hosting Your Own Speckle Server","sidebarTitle":"Overview","href":"/developers/server/introduction"},{"title":"Choosing a Speckle Deployment","sidebarTitle":"Choosing a Deployment","href":"/developers/server/self-hosted-vs-cloud-hosted-speckle"},{"title":"Docker Compose Quickstart","sidebarTitle":"Getting Started","href":"/developers/server/getting-started"},{"title":"Server Architecture","href":"/developers/server/architecture"},{"title":"Self-Hosted Deployment Options","href":"/developers/server/deployment-options"}]},{"group":"Deployment","pages":[{"title":"Deploy to Kubernetes","href":"/developers/server/deployment/kubernetes-with-helm"},{"title":"Server Maintenance","href":"/developers/server/deployment/backup-upgrade-restore"},{"title":"Deploying a Speckle Enterprise licensed server","sidebarTitle":"Enterprise Servers","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license"},{"title":"Deploying a Speckle Enterprise licensed Automate server","sidebarTitle":"Enterprise Automate","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license-automate"},{"title":"Deploying a Speckle Enterprise licensed Intelligence server","sidebarTitle":"Enterprise Intelligence","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license-intelligence"},{"title":"Deploying a Speckle Enterprise licensed Desktop UI server","sidebarTitle":"Enterprise licensed Desktop UI","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license-desktop-ui"}]},{"group":"Local Development","pages":[{"title":"Environment Setup","href":"/developers/server/development/setup"}]}]},{"tab":"Automate","groups":[{"group":"Speckle Automate","pages":[{"title":"Powering Your Automation Workflows","sidebarTitle":"Overview","tag":"Enterprise","href":"/developers/automate/introduction"},{"title":"Quickstart Guide","href":"/developers/automate/quickstart"},{"title":"API Reference","href":"/developers/automate/api-reference"},{"title":"Frequently Asked Questions","href":"/developers/automate/faq"}]},{"group":"Automate Functions","pages":[{"title":"Create an Automate function","sidebarTitle":"Creating Functions","href":"/developers/automate/create-function"},{"title":"Making Your Function","href":"/developers/automate/making-your-function"},{"title":"Function Inputs","href":"/developers/automate/function-inputs"},{"title":"Releasing a New Version","href":"/developers/automate/release-function-version"},{"title":"Publishing Automate Functions without the GitHub App","sidebarTitle":"Publish without GitHub","href":"/developers/automate/publishing-without-github"}]},{"group":"Working with Data","pages":[{"title":"Handling Data in Functions","href":"/developers/automate/function-data"},{"title":"AutomationContext","href":"/developers/automate/function-context"},{"title":"Annotating Function Results","href":"/developers/automate/function-results"},{"title":"Reporting Success","href":"/developers/automate/function-success"},{"title":"Function Artefacts","href":"/developers/automate/function-artefacts"}]},{"group":"Creating Automations","pages":[{"title":"Creating Automations","href":"/developers/automate/create-automation"},{"title":"Viewing Automation Results","href":"/developers/automate/viewing-results"},{"title":"Update an Automation","href":"/developers/automate/update-automation"}]},{"group":"Testing \u0026 Development","pages":[{"title":"Testing Your Functions","href":"/developers/automate/function-testing"},{"title":"Troubleshooting Automations","href":"/developers/automate/troubleshooting"}]},{"group":"Reference","pages":[{"title":"Considerations \u0026 Limitations","href":"/developers/automate/important-considerations"},{"title":"Function Specification","href":"/developers/automate/function-specification"}]}]}],"global":{"anchors":[]}},{"dropdown":"IT Administrators","icon":"wrench","groups":[{"group":"Deployment \u0026 Maintenance","pages":[{"title":"IT setup guide","href":"/it-admin/setup"},{"title":"Keep connectors current across your estate","sidebarTitle":"Connector updates","href":"/it-admin/connector-updates"},{"title":"Compatibility mode for ACC sync and uploads","sidebarTitle":"Compatibility mode","href":"/it-admin/compatibility-mode"},{"title":"Security","href":"/it-admin/security"},{"group":"Cloud Integrations","pages":[{"title":"Cloud Integrations: Access and Governance","sidebarTitle":"Introduction","href":"/it-admin/integrations/introduction"},{"title":"Enable Autodesk Forma Data Management integration","sidebarTitle":"Forma Data Management (ACC)","tag":"Enterprise","href":"/it-admin/integrations/acc"},{"title":"Configure Bentley ProjectWise Integration","sidebarTitle":"Bentley ProjectWise","tag":"Enterprise","href":"/it-admin/integrations/projectwise"},{"title":"Approve Speckle for SharePoint","sidebarTitle":"SharePoint","href":"/it-admin/integrations/sharepoint"},{"title":"Enable Databricks Integration","sidebarTitle":"Databricks","href":"/it-admin/integrations/databricks"},{"title":"Enable Snowflake Integration","sidebarTitle":"Snowflake","href":"/it-admin/integrations/snowflake"}]},{"title":"Admin Support Mode","href":"/it-admin/support-mode"},{"title":"Archive and unarchive projects","sidebarTitle":"Project Archival","tag":"Enterprise","href":"/it-admin/archived-projects"},{"title":"What's new in 2026.9 for IT admins","sidebarTitle":"What's new","href":"/whats-new/it-admins"}]},{"group":"Manual Connector Installation","pages":[{"title":"Manual installation","sidebarTitle":"Overview","href":"/connectors/manual-installation/introduction"},{"title":"Desktop Services","sidebarTitle":"Desktop Services (deprecated)","href":"/connectors/manual-installation/desktop-services"},{"title":"Archicad","href":"/connectors/manual-installation/archicad"},{"title":"AutoCAD","href":"/connectors/manual-installation/autocad"},{"title":"Blender","href":"/connectors/manual-installation/blender"},{"title":"Civil 3D","href":"/connectors/manual-installation/civil3d"},{"title":"ETABS","href":"/connectors/manual-installation/etabs"},{"title":"Navisworks","href":"/connectors/manual-installation/navisworks"},{"title":"Power BI","href":"/connectors/manual-installation/powerbi"},{"title":"Revit","href":"/connectors/manual-installation/revit"},{"title":"Rhino \u0026 Grasshopper","href":"/connectors/manual-installation/rhino-grasshopper"},{"title":"SketchUp","href":"/connectors/manual-installation/sketchup"},{"title":"Tekla Structures","href":"/connectors/manual-installation/teklastructures"}]}],"global":{"anchors":[]}},{"dropdown":"Get Involved","icon":"users","groups":[{"group":"Ways to get involved","pages":[{"title":"User testing and feedback","sidebarTitle":"User Testing","href":"/get-involved/user-testing"},{"title":"Join the Speckle Community","sidebarTitle":"Community","href":"/get-involved/community"},{"title":"Open source at Speckle","sidebarTitle":"Open source","href":"/get-involved/open-source"}]}],"global":{"anchors":[]}},{"dropdown":"Changelog","icon":"history","pages":[{"title":"Changelog — October 2026","sidebarTitle":"October 2026","href":"/technical-changelog/2026-10"},{"title":"Changelog — September 2026","sidebarTitle":"September 2026","href":"/technical-changelog/2026-09"}],"global":{"anchors":[]}}]},"basePath":"","title":"User provisioning (SCIM) - Speckle Docs","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":["07c022d89b","a74be98ba7","a9bb46feb3"],"chunks":["Frame-Bpq2Z6jK.js","DynamicMarkdown-D5M2At0B.js","zoom-image-lightbox-DL4wrF0w.js","lightbox-handle-r17bVUz3.js","Markdown-D7QRHV3m.js","clsx-D1Z-ELXV.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-lvhuD9Du.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CKfC4ywL.js"]}