MoonrakerSharpWebApi 1.3.0

There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package MoonrakerSharpWebApi --version 1.3.0
                    
NuGet\Install-Package MoonrakerSharpWebApi -Version 1.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MoonrakerSharpWebApi" Version="1.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MoonrakerSharpWebApi" Version="1.3.0" />
                    
Directory.Packages.props
<PackageReference Include="MoonrakerSharpWebApi" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MoonrakerSharpWebApi --version 1.3.0
                    
#r "nuget: MoonrakerSharpWebApi, 1.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MoonrakerSharpWebApi@1.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MoonrakerSharpWebApi&version=1.3.0
                    
Install as a Cake Addin
#tool nuget:?package=MoonrakerSharpWebApi&version=1.3.0
                    
Install as a Cake Tool

MoonrakerRestApiSharp (former KlipperRestApiSharp)

A C# based library to communicate with the Moonraker WebApi, available with Fluidd and MainsailOS.

Important!

With the upcoming version, starting from 1.1.0, KlipperClient become MoonrakerClient. also the namespaces will changed and generalized with our other print server api nugets.

Old New
AndreasReitberger AndreasReitberger.API.Moonraker
KlipperClient MoonrakerClient
Klipper... Moonraker...

Nuget MoonrakerRestApiSharp

NuGet NuGet

Nuget KlipperRestApiSharp (deprecated)

NuGet NuGet

Platform specific setup

Android

On Android you need to allow local connections in the AndroidManifest.xml. For this, create a new xml file and link to it in your manifest at android:networkSecurityConfig

Content of the network_security_config.xml file

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
	<base-config cleartextTrafficPermitted="true" />
</network-security-config>

The manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:versionName="1.0.0"
	android:versionCode="1"
	package="com.company.app"
	>
	<application
		android:label="App Name"
		android:allowBackup="true"
		android:icon="@mipmap/appicon" 
		android:roundIcon="@mipmap/appicon_round"
		android:supportsRtl="true"
		android:networkSecurityConfig="@xml/network_security_config"
		>
	</application>
	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
	<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
	<uses-permission android:name="android.permission.WAKE_LOCK" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>

Moonrakers Documentation

This C# library wraps the available Web API functions listed in the Moonraker's documentation below. https://moonraker.readthedocs.io/en/latest/web_api/

You can see the current migration progress in the following table.

Supported OS

Basically all OS using the Moonraker WebApi are theoretically supported.

Tested with our app

  • MainsailOS
  • FluiddPi

App's using this library

FeaturedImage

I also created an iOS app to interact with a moonraker based OS. The app is available for testing here:<br> TestFlight: https://testflight.apple.com/join/TyguKzt9

Note for Android

There is an android version in development, however due to the poor performance using Xamarin.Android, I decided to wait till .NET MAUI is available.

WebAPI migration status

Following you'll find the list of migrated functions from the WebAPI.

Printer Administration

Function Added? Tested?
Get Klippy host information ✅ ✅
Emergency Stop ✅ ✅
Host Restart ✅ ✅
Firmware Restart ✅ ✅

Printer Status

Function Added? Tested?
List available printer objects ✅ ✅
Query printer object status ✅ ✅
Subscribe to printer object status ✅ ✅
Query Endstops ✅ ✅
Query Server Info ✅ ✅
Get Server Configuration ✅ ✅
Request Cached Temperature Data ✅ ✅
Request Cached GCode Responses ✅ ✅
Restart Server ✅ ✅
Get Websocket ID ✅ ✅

GCode APIs

Function Added? Tested?
Run a gcode ✅ ✅
Get GCode Help ✅ ✅
Function Added? Tested?
Print a file ✅ ✅
Pause a print ✅ ✅
Resume a print ✅ ✅
Cancel a print ✅ ✅

Machine Commands

Function Added? Tested?
Get System Info ✅ ✅
Shutdown the Operating System ✅ ✅
Reboot the Operating System ✅ ✅
Restart a system service ✅ No
Stop a system service ✅ No
Start a system service ✅ No
Get Moonraker Process Stats ✅ ✅

File Operations

Function Added? Tested?
List available files ✅ ✅
Get gcode metadata ✅ ✅
Get directory information ✅ ✅
Create directory ✅ ✅
Delete directory ✅ ✅
Move a file or directory ✅ ✅
Copy a file or directory ✅ ✅
File download ✅ ✅
File upload ✅ ✅
File delete ✅ ✅
Download klippy.log ✅ ✅
Download moonraker.log ✅ ✅

Authorization

Function Added? Tested?
Login User ✅ ✅
Logout Current User ✅ ✅
Get Current User ✅ ✅
Create User ✅ ✅
Delete User ✅ ✅
List Available Users ✅ ✅
Reset User Password ✅ ✅
Refresh JSON Web Token ✅ ✅
Generate a Oneshot Token ✅ ✅
Get the Current API Key ✅ ✅
Generate a New API Key ✅ ✅

Database APIs

Function Added? Tested?
List namespaces ✅ ✅
Get Database Item ✅ ✅
Add Database Item ✅ ✅
Delete Database Item ✅ ✅

Job Queue APIs

Function Added? Tested?
Retrieve the job queue status ✅ ✅
Enqueue a job ✅ ✅
Remove a Job ✅ ✅
Pause the job queue ✅ ✅
Start the job queue ✅ ✅

Update Manager APIs

Function Added? Tested?
Get update status ✅ ✅
Perform a full update ✅ ✅
Update Moonraker ✅ No
Update Klipper ✅ No
Update Client ✅ No
Update System Packages ✅ No
Recover a corrupt repo ✅ No

Power APIs

Function Added? Tested?
Get Device List ✅ ✅
Get Device Status ✅ ✅
Set Device State ✅ ✅
Get Batch Device Status ✅ ✅
Batch Power On Devices ✅ ✅
Batch Power Off Devices ✅ ✅

Octoprint API emulation

Function Added? Tested?
Version information ✅ ✅
Server status ✅ ✅
Login verification & User information ✅ No
Get settings ✅ ✅
Octoprint File Upload ✅ ✅
Get Job status ✅ ✅
Get Printer status ✅ ✅
Send GCode command ✅ ✅
List Printer profiles ✅ ✅

History APIs

Function Added? Tested?
Get job list ✅ ✅
Get job totals ✅ ✅
Reset totals ✅ ✅
Get a single job ✅ ✅
Delete job ✅ ✅

MQTT APIs

Function Added? Tested?
Publish a topic No No
Subscribe to a topic No No

Websocket notifications

Not implemented yet.

Usage

You can check the Test project for more code examples.

Initialize the client

This initialize a new KlipperClient object. Always check if the client is reachable before using it.

private readonly string _host = "192.168.10.113";
private readonly int _port = 80;
private readonly string _api = "";
private readonly bool _ssl = false;

// Note, the api key is not mandatory
KlipperClient _server = new(_host, _port, _ssl);
await _server.CheckOnlineAsync();
if (_server.IsOnline)
{
    await _server.RefreshAllAsync();
    Assert.IsTrue(_server.InitialDataFetched);

    //var token = await _server.GetOneshotTokenAsync();
    KlipperAccessTokenResult token2 = await _server.GetApiKeyAsync();
    Assert.IsTrue(!string.IsNullOrEmpty(token2.Result));
}

WebSocket

It's recommended to StartListening() to the WebSocket of your Klipper server. An example is shown below.

Dictionary<DateTime, string> websocketMessages = new();
KlipperClient _server = new(_host, _api, _port, _ssl);

await _server.CheckOnlineAsync();
Assert.IsTrue(_server.IsOnline);

_server.StartListening();

// Once the Id has been received, subscribe to the printer status objects
_server.WebSocketConnectionIdChanged += (o, args) =>
{
    Assert.IsNotNull(args.ConnectionId);
    Assert.IsTrue(args.ConnectionId > 0);
    Task.Run(async () =>
    {
        string subResult = await _server.SubscribeAllPrinterObjectStatusAsync(args.ConnectionId);
    });
};

_server.Error += (o, args) =>
{
    Assert.Fail(args.ToString());
};
_server.ServerWentOffline += (o, args) =>
{
    Assert.Fail(args.ToString());
};

_server.WebSocketDataReceived += (o, args) =>
{
    if (!string.IsNullOrEmpty(args.Message))
    {
        websocketMessages.Add(DateTime.Now, args.Message);
        Debug.WriteLine($"WebSocket Data: {args.Message} (Total: {websocketMessages.Count})");
    }
};

_server.WebSocketError += (o, args) =>
{
    Assert.Fail($"Websocket closed due to an error: {args}");
};

// Wait 10 minutes
CancellationTokenSource cts = new(new TimeSpan(0, 10, 0));
_server.WebSocketDisconnected += (o, args) =>
{
    if (!cts.IsCancellationRequested)
        Assert.Fail($"Websocket unexpectly closed: {args}");
};

do
{
    await Task.Delay(10000);
    await _server.CheckOnlineAsync();
} while (_server.IsOnline && !cts.IsCancellationRequested);
_server.StopListening();


Assert.IsTrue(cts.IsCancellationRequested);

User auth

If your Klipper server is protected with a login, please call the LoginUserAsync method first. Alternatively you can provide the API key instead.

string username = "TestUser";
string password = "TestPassword";

KlipperUserActionResult userCreated = await _server.CreateUserAsync(username, password);
Assert.IsNotNull(userCreated);

List<KlipperUser> users = await _server.ListAvailableUsersAsync();
Assert.IsTrue(users?.Count > 0);

KlipperUserActionResult login = await _server.LoginUserAsync(username, password);
Assert.IsNotNull(login);
Assert.IsTrue(login.Username == username);

KlipperUser currentUser = await _server.GetCurrentUserAsync();
Assert.IsNotNull(currentUser);

KlipperUserActionResult newTokenResult = await _server.RefreshJSONWebTokenAsync();
Assert.IsNotNull(newTokenResult);
Assert.IsTrue(_server.UserToken == newTokenResult.Token);

string newPassword = "TestPasswordChanged";
KlipperUserActionResult refreshPassword = await _server.ResetUserPasswordAsync(password, newPassword);
Assert.IsNotNull(refreshPassword);

KlipperUserActionResult logout = await _server.LogoutCurrentUserAsync();
Assert.IsNotNull(logout);

login = await _server.LoginUserAsync(username, newPassword);
Assert.IsNotNull(login);
Assert.IsTrue(login.Username == username);

logout = await _server.LogoutCurrentUserAsync();
Assert.IsNotNull(logout);

KlipperUserActionResult userDeleted = await _server.DeleteUserAsync(username);
Assert.IsNotNull(userDeleted);
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.1-preview3 460 11/18/2025
1.3.1-preview2 563 1/23/2025
1.3.1-preview 245 4/22/2024
1.3.0 2,707 5/19/2023
1.2.0-beta 345 12/11/2022
1.1.0-alpha 349 10/9/2022

Check GitHub releases for changelog.