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.
Overview
The ProjectResource provides methods for managing Speckle projects. Access it via client.project after authenticating your SpeckleClient.
Projects are the top-level containers in Speckle that hold models, versions, and team members.
from specklepy.api.client import SpeckleClient
client = SpeckleClient( host = "https://app.speckle.systems" )
client.authenticate_with_token(token)
# Access project operations
project = client.project.get( "project_id" )
Methods
get()
Get a single project by ID.
client.project.get(project_id: str ) -> Project
Parameters:
The ID of the project to retrieve
Returns:
Example:
project = client.project.get( "abc123def456" )
print ( f "Project: { project.name } " )
print ( f "Description: { project.description } " )
print ( f "Visibility: { project.visibility } " )
print ( f "Role: { project.role } " )
print ( f "Workspace ID: { project.workspaceId } " )
See Project for property details.
get_permissions()
Get permission checks for a project.
client.project.get_permissions(project_id: str ) -> ProjectPermissionChecks
Parameters:
Returns:
Example:
permissions = client.project.get_permissions( "project_id" )
if permissions.canCreateModel.authorized:
print ( "✓ You can create models" )
else :
print ( f "✗ Cannot create models: { permissions.canCreateModel.message } " )
if permissions.canDelete.authorized:
print ( "✓ You can delete this project" )
if permissions.canPublish.authorized:
print ( "✓ You can publish to this project" )
See PermissionCheckResult for property details.
get_with_models()
Get a project with its models included.
client.project.get_with_models(
project_id: str ,
* ,
models_limit: int = 25 ,
models_cursor: Optional[ str ] = None ,
models_filter: Optional[ProjectModelsFilter] = None
) -> ProjectWithModels
Parameters:
Maximum number of models to return
models_filter
ProjectModelsFilter
default: "None"
Returns:
Project with models collection
Example:
# Get project with first 10 models
project = client.project.get_with_models(
"project_id" ,
models_limit = 10
)
print ( f "Project: { project.name } " )
print ( f "Total models: { project.models.totalCount } " )
for model in project.models.items:
print ( f " - { model.name } (updated: { model.updatedAt } )" )
# Paginate through more models
if project.models.cursor:
next_page = client.project.get_with_models(
"project_id" ,
models_cursor = project.models.cursor
)
See ProjectModelsFilter for filtering options.
get_with_team()
Get a project with its team members and pending invitations.
client.project.get_with_team(project_id: str ) -> ProjectWithTeam
Parameters:
Returns:
Project with team information
Example:
project = client.project.get_with_team( "project_id" )
print ( f "Project: { project.name } " )
print ( f " \n Team members ( { len (project.team) } ):" )
for member in project.team:
print ( f " - { member.user.name } ( { member.role } )" )
print ( f " \n Pending invitations ( { len (project.invitedTeam) } ):" )
for invite in project.invitedTeam:
invited_by = invite.invitedBy.name if invite.invitedBy else "Unknown"
user_name = invite.user.name if invite.user else invite.title
print ( f " - { user_name } ( { invite.role } ) - invited by { invited_by } " )
create()
Create a new personal project (non-workspace).
client.project.create( input : ProjectCreateInput) -> Project
Parameters:
input
ProjectCreateInput
required
Returns:
The newly created project
Example:
from specklepy.core.api.inputs.project_inputs import ProjectCreateInput
# Create a basic project
project = client.project.create(ProjectCreateInput(
name = "My New Project" ,
description = "A project for architectural designs" ,
visibility = "PRIVATE"
))
print ( f "Created project: { project.name } (ID: { project.id } )" )
See ProjectCreateInput for all available fields.
Check if you can create personal projects using client.active_user.can_create_personal_projects() before calling this method.
create_in_workspace()
Create a new workspace project.
client.project.create_in_workspace( input : WorkspaceProjectCreateInput) -> Project
Parameters:
input
WorkspaceProjectCreateInput
required
Returns:
The newly created workspace project
Example:
from specklepy.core.api.inputs.project_inputs import WorkspaceProjectCreateInput
# Get workspace ID first
workspaces = client.active_user.get_workspaces( limit = 1 )
workspace_id = workspaces.items[ 0 ].id
# Create workspace project
project = client.project.create_in_workspace(WorkspaceProjectCreateInput(
name = "Team Project" ,
description = "Shared project for the team" ,
visibility = "PRIVATE" ,
workspaceId = workspace_id
))
print ( f "Created workspace project: { project.name } " )
print ( f "Workspace ID: { project.workspaceId } " )
See WorkspaceProjectCreateInput for all available fields.
This method only works on workspace-enabled servers (e.g., app.speckle.systems). Check workspace permissions using workspace.permissions.canCreateProject before calling.
update()
Update an existing project.
client.project.update( input : ProjectUpdateInput) -> Project
Parameters:
input
ProjectUpdateInput
required
Returns:
Example:
from specklepy.core.api.inputs.project_inputs import ProjectUpdateInput
# Update project details
updated_project = client.project.update(ProjectUpdateInput(
id = "project_id" ,
name = "Updated Project Name" ,
description = "New description" ,
visibility = "PUBLIC" ,
allowPublicComments = True
))
print ( f "Updated: { updated_project.name } " )
See ProjectUpdateInput for all available fields.
delete()
Delete a project permanently.
client.project.delete(project_id: str ) -> bool
Parameters:
The ID of the project to delete
Returns:
True if deletion was successful
Example:
# Delete a project
success = client.project.delete( "project_id" )
if success:
print ( "✓ Project deleted successfully" )
else :
print ( "✗ Failed to delete project" )
This operation is irreversible! All models, versions, and data in the project will be permanently deleted.
update_role()
Update a team member’s role in the project.
client.project.update_role( input : ProjectUpdateRoleInput) -> ProjectWithTeam
Parameters:
input
ProjectUpdateRoleInput
required
Role update parameters
Returns:
Updated project with team information
Example:
from specklepy.core.api.inputs.project_inputs import ProjectUpdateRoleInput
# Promote a user to contributor
project = client.project.update_role(ProjectUpdateRoleInput(
projectId = "project_id" ,
userId = "user_id" ,
role = "stream:contributor" # or "stream:reviewer", "stream:owner"
))
print ( "Updated team roles:" )
for member in project.team:
print ( f " - { member.user.name } : { member.role } " )
ProjectUpdateRoleInput Fields:
projectId (str, required) - The project ID
userId (str, required) - The user ID whose role to update
role (str, required) - New role: "stream:owner", "stream:contributor", or "stream:reviewer"
Role Permissions:
stream:owner - Full control, can delete project and manage team
stream:contributor - Can create models and versions
stream:reviewer - Read-only access
Types
Project
Represents a Speckle project.
"PUBLIC", "PRIVATE", or "UNLISTED"
Your role: "stream:owner", "stream:contributor", or "stream:reviewer"
Whether public comments are allowed
List of source applications used
Workspace ID if this is a workspace project
PermissionCheckResult
Result of a permission check operation.
Whether the action is authorized
ProjectCreateInput(
name: str ,
description: Optional[ str ] = None ,
visibility: Optional[ str ] = None
)
Used with create() .
Fields:
name (str) - Project name
description (str, optional) - Project description
visibility (str, optional) - "PRIVATE", "PUBLIC", or "UNLISTED"
ProjectUpdateInput(
id : str ,
name: Optional[ str ] = None ,
description: Optional[ str ] = None ,
allow_public_comments: Optional[ bool ] = None ,
visibility: Optional[ str ] = None
)
Used with update() .
Fields:
id (str) - Project ID
name (str, optional) - New project name
description (str, optional) - New description
allow_public_comments (bool, optional) - Allow public comments
visibility (str, optional) - New visibility setting
WorkspaceProjectCreateInput(
name: str ,
description: Optional[ str ] = None ,
visibility: Optional[ str ] = None ,
workspaceId: str
)
Used with create_in_workspace() .
Fields:
name (str) - Project name
description (str, optional) - Project description
visibility (str, optional) - "PRIVATE", "PUBLIC", or "UNLISTED"
workspaceId (str) - Workspace ID
Filters
ProjectModelsFilter
ProjectModelsFilter(
contributors: Optional[Sequence[ str ]] = None ,
exclude_ids: Optional[Sequence[ str ]] = None ,
ids: Optional[Sequence[ str ]] = None ,
only_with_versions: Optional[ bool ] = None ,
search: Optional[ str ] = None ,
source_apps: Optional[Sequence[ str ]] = None
)
Used with get_with_models() and client.model.get_models().
Fields:
contributors (List[str], optional) - Filter by contributor user IDs
exclude_ids (List[str], optional) - Exclude specific model IDs
ids (List[str], optional) - Include only specific model IDs
only_with_versions (bool, optional) - Only return models with versions
search (str, optional) - Search by model name
source_apps (List[str], optional) - Filter by source application
ModelResource Work with models in projects
VersionResource Manage versions in models
ActiveUserResource Get user’s projects and permissions
SpeckleClient Main client documentation