A .NET library for working with Revit Server REST API. Provides easy access to Revit Server operations including folder management, project operations, locking, and history tracking.
- Server Management: Get server information and status
- Folder Operations: Create, delete, and manage folders on Revit Server
- Project Management: Handle project operations and metadata
- Locking System: Manage file locks and permissions
- History Tracking: Access project history and version information
- Direct Export: Convert Revit Server models to RVT using RS assemblies (net48)
- Multi-Version Support: Supports Revit Server versions from 2012 to 2026
- Async Operations: All API calls are asynchronous for better performance
Install-Package RevitServerNetOr via NuGet Package Manager:
RevitServerNet
Or via .NET CLI:
dotnet add package RevitServerNetusing RevitServerNet;
// Initialize API client
var api = new RevitServerApi("your-server-host", "your-username");
// Get server information
var serverInfo = await api.GetServerInfoAsync();
// List folders
var folders = await api.GetFoldersAsync("/path/to/folder");- Revit Server 2012-2026
- .NET Framework 4.8
- Newtonsoft.Json 13.0.3
using RevitServerNet;
// Create API client
var api = new RevitServerApi(
host: "your-revit-server.com",
userName: "your-username",
useHttps: true, // Optional, default: false
serverVersion: "2024" // Optional, default: "2019"
);// Get server information
var serverInfo = await api.GetServerInfoAsync();
// Get server status
var status = await api.GetServerStatusAsync();// List folders in a directory
var folders = await api.GetFoldersAsync("/Projects");
// Create a new folder
await api.CreateFolderAsync("/Projects/NewProject");
// Delete a folder
await api.DeleteFolderAsync("/Projects/OldProject");// Get project information
var projectInfo = await api.GetProjectInfoAsync("/Projects/MyProject");
// Get project history
var history = await api.GetProjectHistoryAsync("/Projects/MyProject");// Lock a file
await api.LockFileAsync("/Projects/MyProject/file.rvt");
// Unlock a file
await api.UnlockFileAsync("/Projects/MyProject/file.rvt");
// Get lock information
var lockInfo = await api.GetLockInfoAsync("/Projects/MyProject/file.rvt");RevitServerNet can export a model directly to a local RVT file using the RS Enterprise assemblies — without calling RevitServerTool.exe. This works only on .NET Framework 4.8 because Autodesk’s RS libraries target net48.
Prerequisites:
- Windows with .NET Framework 4.8
- Access to the Revit Server host
- RS assemblies for the target version available in
RSAssemblies/<year>(shipped in the repo) or in a custom folder you pass viaAssembliesPath
using RevitServerNet;
var options = new ModelExporterOptions
{
ServerHost = "revit-server.local",
ModelPipePath = "|Projects|Demo|Model.rvt", // pipe or Windows-style path
DestinationFile = @"C:\Exports\Demo.rvt",
RevitVersion = "2024",
AssembliesPath = @"C:\path\to\RSAssemblies\2024", // optional: autodetected if bundled folder is present
Overwrite = true
};
var resultPath = await ModelExporter.ExportAsync(
options,
new Progress<long>(bytes => Console.WriteLine($"Downloaded {bytes} bytes"))
);
Console.WriteLine($"Exported to: {resultPath}");using RevitServerNet;
using RevitServerNet.Extensions;
var api = new RevitServerApi("revit-server.local", "user", serverVersion: "2024");
await api.ExportModelAsync(
modelPath: "|Projects|Demo|Model.rvt",
destinationFile: @"C:\Exports\Demo.rvt",
overwrite: true
);Notes:
- The extension infers host/version from
api.BaseUrl. It throwsPlatformNotSupportedExceptionon non-net48 targets. - Use pipe-format paths (
|Projects|...|file.rvt) or Windows-style relative paths (Projects\...\file.rvt).
See AnlaxRSExportService (net48 WebAPI + CLI) for a working sample that wraps ModelExporter:
- CLI:
AnlaxRSExportService.exe --export <server> <pipePath> <localPath> <revitVersion> [rsAssembliesPath] - HTTP:
POST http://localhost:3074/api/export/exportwith JSON matchingModelExporterOptionsfields.
Main class for interacting with Revit Server REST API.
public RevitServerApi(string host, string userName, bool useHttps = false, string serverVersion = "2019")BaseUrl: Gets the base URL for API requestsUserName: Gets the user name used for API requests
GetAsync(string command, Dictionary<string, string> additionalHeaders = null): Performs GET requestPostAsync(string command, string data = null, Dictionary<string, string> additionalHeaders = null): Performs POST requestPutAsync(string command, string data = null, Dictionary<string, string> additionalHeaders = null): Performs PUT requestDeleteAsync(string command, Dictionary<string, string> additionalHeaders = null): Performs DELETE request
The library provides extension methods for common operations:
GetServerInfoAsync(this RevitServerApi api)GetServerStatusAsync(this RevitServerApi api)
GetFoldersAsync(this RevitServerApi api, string path)CreateFolderAsync(this RevitServerApi api, string path)DeleteFolderAsync(this RevitServerApi api, string path)
GetProjectInfoAsync(this RevitServerApi api, string path)
GetProjectHistoryAsync(this RevitServerApi api, string path)
LockFileAsync(this RevitServerApi api, string path)UnlockFileAsync(this RevitServerApi api, string path)GetLockInfoAsync(this RevitServerApi api, string path)
The library throws RevitServerApiException for API-related errors:
try
{
var folders = await api.GetFoldersAsync("/Projects");
}
catch (RevitServerApiException ex)
{
Console.WriteLine($"API Error: {ex.Message}");
}Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
If you encounter any issues or have questions, please open an issue on the GitHub repository.