Models
Upload, query, and manage 3D BIM models within projects. Includes endpoints for model import, property queries, quantity calculations, dynamic properties, IFC export, and edit sessions.
Get models in a project.
Returns a list of all accessible models in the given project where the import state is valid, ordered by name. Recommended OAuth scope: models:read.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
Response fields
-
- Name
-
models - Type
- array<object>
- Required
- Optional
- Description
- List of models the current user can see in the project.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The project identifier or request parameters are invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The requested resource was not found
Create a new model and start an import.
Creates a new model in the specified project and starts an import process for a previously uploaded file. Recommended OAuth scope: models:write. The file must already be uploaded using a pre-signed URL from the upload-url endpoint. Supported extensions include Revit (.rvt), SketchUp (.skp), Rhino (.3dm), IFC (.ifc) and ZIP (.zip) An import process is started immediately unless the file or arguments are invalid, in which case a standard error response is returned.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
Request body
-
- Name
-
modelName - Type
- string
- Required
- Required
- Description
- Name of the model as it will appear in the project.
-
- Name
-
uploadUrl - Type
- string
- Required
- Required
- Description
- Pre-signed upload URL pointing to the model file in storage. Must be obtained from the upload URL endpoint.
-
- Name
-
uploadFileName - Type
- string
- Required
- Required
- Description
- File name of the uploaded model (including extension). Used to determine the file type (IFC, Revit, SketchUp, Rhino, ZIP).
-
- Name
-
tags - Type
- array<string>
- Required
- Optional
- Description
- A list of tags to categorize the model (e.g. "Architecture", "MEP", "Structural").
-
- Name
-
defaultRole - Type
- string
- Required
- Optional
- Description
- Optional default role assigned to project members for this model.
Response fields
-
- Name
-
modelId - Type
- string
- Required
- Optional
- Description
- Identifier of the created model.
-
- Name
-
modelGuid - Type
- string
- Required
- Required
- Description
- Globally unique identifier of the created model.
-
- Name
-
id - Type
- string
- Required
- Optional
- Description
-
- Name
-
kind - Type
- "ImportIfc" | "ExportIfc" | "CalculateQuantities" | "CalculateDerivedProperties"
- Required
- Optional
- Description
- The type of long-running operation.
-
- Name
-
status - Type
- "Queued" | "InProgress" | "Ready" | "Failed"
- Required
- Optional
- Description
- Current status of a long-running operation.
-
- Name
-
percentageCompleted - Type
- integer
- Required
- Optional
- Description
Error responses
-
- Name
-
400 - Type
- error
- Description
- The file, discipline, role, upload URL or other arguments are invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The requested resource was not found
Get available product fields for a model.
Returns the names of product fields that can be requested when querying products in this model. Recommended OAuth scope: models:read.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Response fields
-
- Name
-
fields - Type
- array<string>
- Required
- Optional
- Description
- Names of fields that can be requested when querying products.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The project or model identifier is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Get products in a model using a JSON query.
Returns the requested fields for all products that satisfy the provided filters. The request body must be a JSON object with the following shape: ```json { "fields": ["id", "name", "length"], "filters": [ { "property": "name", "operator": "Eq", "value": "Steel Beam" }, { "property": "status", "operator": "In", "value": ["active", "pending"] } ] } ``` - fields (optional): array of product property names to include in the response. If omitted or empty, all default fields are returned. - filters (optional): array of filter objects. Each filter has: - property: the name of the product property to filter on. - operator: the comparison to apply. Supported values: - Eq: property must be equal to value. - In: property value must be one of the items in value. - value: - for Eq, a single JSON value (string, number, boolean, etc.); - for In, a JSON array of values. All filters are combined with logical AND: only products that satisfy every filter are included in the result. Recommended OAuth scope: models:read.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Query parameters
-
- Name
-
page - Type
- integer
- Required
- Optional
- Description
- Page number to return (1-based, default 1).
-
- Name
-
pageSize - Type
- integer
- Required
- Optional
- Description
- Number of products per page (default 1000, max 5000).
Request body
-
- Name
-
fields - Type
- array<string>
- Required
- Optional
- Description
- Product fields to include in the response. If null or empty, all available fields will be returned.
-
- Name
-
filters - Type
- array<object>
- Required
- Optional
- Description
- Filters to apply to the products. All filters are combined using logical AND.
Response fields
-
- Name
-
totalCount - Type
- integer
- Required
- Optional
- Description
- Total number of products matching the query filters (before pagination).
-
- Name
-
page - Type
- integer
- Required
- Optional
- Description
- The current page number (1-based).
-
- Name
-
pageSize - Type
- integer
- Required
- Optional
- Description
- The maximum number of products returned per page.
-
- Name
-
result - Type
- array<object>
- Required
- Optional
- Description
- Collection of products, each represented as a dictionary of field names and values.
Error responses
-
- Name
-
400 - Type
- error
- Description
- Filters or parameters are invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Start a quantity calculation for products in a model.
Starts an asynchronous calculation of quantities for all products that satisfy the given filters. The request body specifies which quantity calculators to use and which filters to apply. The request body must be a JSON object with the following shape: ```json { "calculators": [ "Count", "NetVolume", "GrossArea" ], "filters": [ { "property": "category", "operator": "Eq", "value": "Beam" }, { "property": "status", "operator": "In", "value": [ "active", "pending" ] } ] } ``` - calculators (required): array of calculator names. Supported values: - Count – counts the number of matching products. - Length – sums the length of matching products. - NetArea – sums the net area of matching products. - GrossArea – sums the gross area of matching products. - NetVolume – sums the net volume of matching products. - GrossVolume – sums the gross volume of matching products. - filters (optional): array of filter objects. Each filter has: - property: the name of the product property to filter on. - operator: the comparison to apply. Supported values: - Eq: property must be equal to value. - In: property value must be one of the items in value. - value: - for Eq, a single JSON value (string, number, boolean, etc.); - for In, a JSON array of values. All filters are combined with logical AND: only products that satisfy every filter are included in the calculation. The response contains an operation object that can be polled using the operations endpoint, and used with the quantities result endpoint to obtain the final result. Recommended OAuth scope: models:read.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Request body
-
- Name
-
calculators - Type
- array<"Count" | "Length" | "NetArea" | "GrossArea" | "NetVolume" | "GrossVolume">
- Required
- Required
- Description
- The calculators to use for quantity calculation (e.g. Count, Length, NetArea).
-
- Name
-
filters - Type
- array<object>
- Required
- Optional
- Description
- Optional filters to restrict which products are included in the calculation.
Response fields
-
- Name
-
id - Type
- string
- Required
- Optional
- Description
- Public identifier of the operation.
-
- Name
-
kind - Type
- "ImportIfc" | "ExportIfc" | "CalculateQuantities" | "CalculateDerivedProperties"
- Required
- Optional
- Description
- The type of long-running operation.
-
- Name
-
status - Type
- "Queued" | "InProgress" | "Ready" | "Failed"
- Required
- Optional
- Description
- Current status of a long-running operation.
-
- Name
-
percentageCompleted - Type
- integer
- Required
- Optional
- Description
- Progress of the operation in percent from 0 to 100.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The request body is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Get the result of a quantity calculation.
Returns the result of a quantity calculation as an HTTP redirect to a file, once the operation has finished successfully. Recommended OAuth scope: models:read. If the operation has not finished or has failed, a standard error response with a descriptive error code and message is returned. Result URLs are temporary and expire after seven days.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
-
- Name
-
operationId - Type
- string
- Required
- Required
- Description
- Identifier of the operation.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The operation is not ready or has failed.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project, model or operation does not exist or is not accessible.
Get available product dynamic fields for a model.
Returns the names of product dynamic fields that can be requested when querying products in this model. Recommended OAuth scope: models:read.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Response fields
-
- Name
-
fields - Type
- array<string>
- Required
- Optional
- Description
- Names of fields that can be requested when querying products.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The project or model identifier is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Start a dynamic property calculation for products in a model.
Starts an asynchronous calculation of dynamic properties for all products that satisfy the given filters. The request body specifies which dynamic properties to use and which filters to apply. The request body must be a JSON object with the following shape: ```json { "fields": ["Mass", "GrossFootPrintArea"], "filters": [ { "property": "category", "operator": "Eq", "value": "Beam" }, { "property": "status", "operator": "In", "value": [ "active", "pending" ] } ] } ``` - fields (optional): array of product dynamic property names to include in the response. If omitted or empty, all default fields are returned. - filters (optional): array of filter objects. Each filter has: - property: the name of the product property to filter on. Dynamic properties are not supported for filters. - operator: the comparison to apply. Supported values: - Eq: property must be equal to value. - In: property value must be one of the items in value. - value: - for Eq, a single JSON value (string, number, boolean, etc.); - for In, a JSON array of values. All filters are combined with logical AND: only products that satisfy every filter are included in the calculation. The response contains an operation object that can be polled using the operations endpoint, and used with the dynamic properties result endpoint to obtain the final result. Recommended OAuth scope: models:read. More on Dynamic Properties
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Request body
-
- Name
-
fields - Type
- array<string>
- Required
- Optional
- Description
- Product fields to include in the response. If null or empty, all available fields will be returned.
-
- Name
-
filters - Type
- array<object>
- Required
- Optional
- Description
- Filters to apply to the products. All filters are combined using logical AND.
Response fields
-
- Name
-
id - Type
- string
- Required
- Optional
- Description
- Public identifier of the operation.
-
- Name
-
kind - Type
- "ImportIfc" | "ExportIfc" | "CalculateQuantities" | "CalculateDerivedProperties"
- Required
- Optional
- Description
- The type of long-running operation.
-
- Name
-
status - Type
- "Queued" | "InProgress" | "Ready" | "Failed"
- Required
- Optional
- Description
- Current status of a long-running operation.
-
- Name
-
percentageCompleted - Type
- integer
- Required
- Optional
- Description
- Progress of the operation in percent from 0 to 100.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The request body is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Get the result of a dynamic properties query.
Returns the result of a dynamic properties query as an HTTP redirect to a file, once the operation has finished successfully. Recommended OAuth scope: models:read. If the operation has not finished or has failed, a standard error response with a descriptive error code and message is returned. Result URLs are temporary and expire after seven days.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
-
- Name
-
operationId - Type
- string
- Required
- Required
- Description
- Identifier of the operation.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The operation is not ready or has failed.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project, model or operation does not exist or is not accessible.
Start a modification session on a model.
Starts an external modification session that groups subsequent changes under a client-generated session id. Recommended OAuth scope: models:write. The request must include an X-Client-Session-Id header. The same value must be sent when calling modification endpoints such as product modification, product deletion and discarding changes. Sessions expire automatically after 30 minutes of inactivity. Only one active session per user and model is allowed.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The session header or request parameters are invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
End a modification session on a model.
Ends a previously started modification session identified by the X-Client-Session-Id header. If the session has already expired or does not exist, the request succeeds without further effect.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The session header or request parameters are invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Modify product properties in a model.
Applies one or more modifications to product properties in the model. The request body describes added, updated, deleted or upserted properties grouped by field name and product identifier. Recommended OAuth scope: models:write. The request must include an X-Client-Session-Id header corresponding to an active modification session. If any modification in the request is invalid, no changes are applied and a list of input errors is returned.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Request body
-
- Name
-
add - Type
- object
- Required
- Optional
- Description
- Properties that should be added for the specified products. Keys are property names, values are keyed by product GUID.
-
- Name
-
update - Type
- object
- Required
- Optional
- Description
- Properties that should be updated on existing products. Keys are property names, values are keyed by product GUID.
-
- Name
-
delete - Type
- object
- Required
- Optional
- Description
- Properties that should be removed from products. Keys are property names, values are keyed by product GUID.
-
- Name
-
addOrUpdate - Type
- object
- Required
- Optional
- Description
- Properties that should be added if missing or updated if they already exist. Keys are property names, values are keyed by product GUID.
Response fields
-
- Name
-
errors - Type
- array<object>
- Required
- Optional
- Description
- Validation errors grouped by product and field.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The session header or modification payload is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Delete a product from a model.
Deletes the product with the given identifier from the model. Recommended OAuth scope: models:write. The request must include an X-Client-Session-Id header corresponding to an active modification session. If the identifier is invalid or the product cannot be removed, a standard error response is returned.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
-
- Name
-
guid - Type
- string
- Required
- Required
- Description
- Identifier of the product to delete.
Response fields
-
- Name
-
errors - Type
- array<object>
- Required
- Optional
- Description
- Validation errors grouped by product and field.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The identifier is invalid or the product cannot be deleted.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Publish all personal changes of the current user for the project
Publishes the current user's personal changes for the project as a new public version. Recommended OAuth scope: models:write. If there are no personal changes for the project, the request completes successfully but has no effect. Publishing occurs at project level and can happen in parallel with changes by other users.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Unique identifier of the model.
Request body
-
- Name
-
title - Type
- string
- Required
- Required
- Description
- Title for the new public version.
-
- Name
-
description - Type
- string
- Required
- Optional
- Description
- Optional description describing the changes that are being published.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The project identifier is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Discard all personal changes of the current user for a model inside of a project
Discards any un-published personal changes for the specified project for the current user. Recommended OAuth scope: models:write. The request must include an X-Client-Session-Id header. If there are no personal changes for the project, the request completes successfully without effect.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The project identifier is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Get a pre-signed upload URL for model files.
Returns a pre-signed URL that can be used to upload a model file directly to storage. The URL is temporary and should be used shortly after it is issued.
Response fields
-
- Name
-
uploadUrl - Type
- string
- Required
- Optional
- Description
- Pre-signed URL that can be used to upload a model file.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The request is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
Start an IFC export for the latest public version of a model.
Starts an asynchronous IFC export using the latest public version of the given model. Recommended OAuth scope: models:read. The response contains an operation object that can be polled using the operations endpoint, and used with the IFC export result endpoint to obtain the final IFC file.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
Response fields
-
- Name
-
id - Type
- string
- Required
- Optional
- Description
- Public identifier of the operation.
-
- Name
-
kind - Type
- "ImportIfc" | "ExportIfc" | "CalculateQuantities" | "CalculateDerivedProperties"
- Required
- Optional
- Description
- The type of long-running operation.
-
- Name
-
status - Type
- "Queued" | "InProgress" | "Ready" | "Failed"
- Required
- Optional
- Description
- Current status of a long-running operation.
-
- Name
-
percentageCompleted - Type
- integer
- Required
- Optional
- Description
- Progress of the operation in percent from 0 to 100.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The project or model identifier is invalid.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project or model does not exist or is not accessible.
Get the result of an IFC export operation.
Returns the result of an IFC export operation as an HTTP redirect to a file, once the operation has finished successfully. If the operation has not finished or has failed, a standard error response with a descriptive error code and message is returned. Result URLs are temporary and expire after seven days.
Path parameters
-
- Name
-
projectId - Type
- integer
- Required
- Required
- Description
- Identifier of the project.
-
- Name
-
modelId - Type
- integer
- Required
- Required
- Description
- Identifier of the model.
-
- Name
-
operationId - Type
- string
- Required
- Required
- Description
- Identifier of the operation.
Error responses
-
- Name
-
400 - Type
- error
- Description
- The operation is not ready or has failed.
-
- Name
-
401 - Type
- error
- Description
- Authentication required. Provide a valid Bearer token in the Authorization header.
-
- Name
-
403 - Type
- error
- Description
- The user does not have sufficient permissions for this operation.
-
- Name
-
404 - Type
- error
- Description
- The project, model or operation does not exist or is not accessible.