DolphinBoilderApi 0.2.0
dotnet add package DolphinBoilderApi --version 0.2.0
NuGet\Install-Package DolphinBoilderApi -Version 0.2.0
<PackageReference Include="DolphinBoilderApi" Version="0.2.0" />
<PackageVersion Include="DolphinBoilderApi" Version="0.2.0" />
<PackageReference Include="DolphinBoilderApi" />
paket add DolphinBoilderApi --version 0.2.0
#r "nuget: DolphinBoilderApi, 0.2.0"
#:package DolphinBoilderApi@0.2.0
#addin nuget:?package=DolphinBoilderApi&version=0.2.0
#tool nuget:?package=DolphinBoilderApi&version=0.2.0
DolphinBoilderApi
A .NET client library for the Dolphin Boiler smart water heater API.
Authenticate, monitor, and control your Dolphin Boiler programmatically — perfect for building custom home automation integrations, dashboards, or bots.
v0.2.0 covers the app's full documented
/API/surface (~50 endpoints). Authentication is handled internally by the client from the device name + account email (no server-issued API key). v0.1.x replaced the earlier/HA/V1/API-key client with a partial/API/client; v0.2.0 fills in the rest (manual control, history/graphs, notifications, sharing, network/specs, account ops).
Features
- Authentication & account — login, signup, logout, delete account
- Device discovery — list all boilers on the account, including their server-side nicknames
- Live status — power on/off, current temperature, target temperature, and current draw in Amps
- Manual control — turn on (by quantity) / off, enable/disable Dolphin, reset temperature
- Settings — Shabbat, Legionella, fixed-temperature flags (read + toggle)
- Schedule — read/create/edit/delete quantity timers and fixed-temperature timers
- History — per-month usage totals (
getHistory) and per-day temperature traces (getGraphHistory) - Notifications, sharing/permissions, network & boiler specs, Dolphin Plus
Setter/command endpoints return a CommandResult { Success, Message, Error, Raw }. Getters with a
well-known response shape are strongly typed; those whose response isn't documented in the APK return
the raw JsonElement so you can read whatever fields the server sends.
How authentication works
Log in once with LoginAsync(email, password); after that the client authenticates each call for you
from the device name + account email, so no password or session key needs to be stored. The auth
handling is internal to the client — just call the methods below.
The official app disables TLS certificate validation, and so does this client (it trusts all certs) to match the cloud server's behavior.
Quick start
Prerequisites
- .NET 10 or later
Installation
Add the project as a reference, or copy the single-file DolphinBoilderApi/DolphinBoilerApi.cs into your solution.
Usage
using DolphinBoilderApi;
await using var client = new DolphinClient();
const string email = "you@example.com";
// 1. Authenticate — returns the account's primary device name.
var login = await client.LoginAsync(email, "your-password");
if (!login.Success)
{
Console.WriteLine($"Login failed: {login.Error}");
return;
}
// 2. Discover devices (with nicknames). Seeded by the primary device from login.
var devices = await client.GetDevicesAsync(login.DeviceName!, email);
foreach (var d in devices)
Console.WriteLine($"{d.DeviceName} ({d.Nickname})");
var device = devices[0].DeviceName;
// 3. Read live state.
var data = await client.GetMainScreenDataAsync(device, email);
Console.WriteLine($"{data?.Temperature}°C (target {data?.TargetTemperature}°C) — " +
$"Power {(data?.PowerOn == true ? "ON" : "OFF")}, {data?.Amps} A");
// 4. Read settings (authoritative Shabbat state).
var settings = await client.GetSettingsAsync(device, email);
Console.WriteLine($"Shabbat: {(settings?.ShabbatEnabled == true ? "ON" : "OFF")}");
// 5. Read the schedule.
var timers = await client.GetTimersAsync(device, email); // start time + quantity (showers/°)
var windows = await client.GetFixedTemperatureTimersAsync(device, email); // explicit begin→end windows
// 6. Control.
await client.EnableShabbatAsync(device, email);
API reference
One method per /API/ endpoint, grouped as in the app. Setters return CommandResult; typed getters
return the model shown; undocumented-shape getters return JsonElement? (read fields yourself).
Auth / account
| Method | Endpoint |
|---|---|
LoginAsync(email, password, language="en") → LoginResult |
login.php |
SignupAsync(email, password, language="en") |
signup.php |
LogoutAsync(deviceName, email, pushToken="") |
logout.php |
DeleteAccountAsync(deviceName, email) |
deleteAccount.php |
CheckServerHealthAsync(deviceName, email) → JsonElement? |
checkServerHealth.php |
SetRegistrationTokenAsync(deviceName, email, registrationToken, source="app") |
setRegistrationToken.php |
Main screen / manual control
| Method | Endpoint |
|---|---|
GetMainScreenDataAsync(deviceName, email) → MainScreenData |
getMainScreenData.php |
TurnOnManuallyAsync(deviceName, email, quantity, source="app") |
turnOnManually.php |
TurnOffManuallyAsync(deviceName, email) |
turnOffManually.php |
EnableDolphinAsync / DisableDolphinAsync(deviceName, email) |
enableDolphin.php / disableDolphin.php |
ResetTemperatureAsync(deviceName, email) |
resetTemperature.php |
Devices / specs / network
| Method | Endpoint |
|---|---|
GetDevicesAsync(primaryDeviceName, email) → List<DeviceInfo> |
getDevices.php |
GetBoilerSpecsAsync(deviceName, email) → JsonElement? |
getBoilerSpecs.php |
EditBoilerSpecsAsync(deviceName, email, editedBy, boilerSize, orientation, solarPanel, isHeatPump, isTurboHeater) |
editBoilerSpecs.php |
GetNetworkInfoAsync(deviceName, email) → JsonElement? |
getNetworkInfo.php |
ResetNetworkAsync(deviceName, email) |
resetNetwork.php |
SearchNetworkAsync(deviceName, email, ssid, bssid, ipAddress, latitude, longitude) |
searchNetwork.php |
GetMinMaxQuantityAsync(deviceName, email) → JsonElement? |
getMinMaxQuantity.php |
SetNicknameAsync(deviceName, email, nickName) |
setNickname.php |
SetLanguageAsync(deviceName, email, language) |
setLanguage.php |
SetMaxManualDurationAsync(deviceName, email, maxManualDuration) |
setMaxManualDuration.php |
Settings / Shabbat / Legionella
| Method | Endpoint |
|---|---|
GetSettingsAsync(deviceName, email) → DeviceSettings |
getSettings.php |
EnableShabbatAsync / DisableShabbatAsync(deviceName, email) |
enableShabbat.php / disableShabbat.php |
EnableLegionellaAsync / DisableLegionellaAsync(deviceName, email) |
enableLegionella.php / disableLegionella.php |
Timers (quantity / shower)
| Method | Endpoint |
|---|---|
GetTimersAsync(deviceName, email) → List<TimerEntry> |
getTimers.php |
SetTimerAsync(deviceName, email, fields) / EditTimerAsync(…) |
setTimer.php / editTimer.php (free-form fields) |
DeleteTimerAsync / EnableTimerAsync / DisableTimerAsync(deviceName, email, id) |
deleteTimer.php / enableTimer.php / disableTimer.php |
Fixed-temperature
| Method | Endpoint |
|---|---|
GetFixedTemperatureDegreesAsync(deviceName, email) → JsonElement? |
getFixedTemperatureDegrees.php |
GetFixedTemperatureTimersAsync(deviceName, email) → List<FixedTempTimer> |
getFixedTemperatureTimers.php |
SetFixedTemperatureTimerAsync(…) / EditFixedTemperatureTimerAsync(…) |
setFixedTemperatureTimer.php / edit… |
Delete / Enable / Disable / Pause / Resume / Reset…TimerAsync(…) |
the matching …FixedTemperatureTimer.php |
EnableFixedTemperatureAsync / DisableFixedTemperatureAsync(deviceName, email) |
enableFixedTemperature.php / disable… |
History / graphs
| Method | Endpoint |
|---|---|
GetHistoryAsync(deviceName, email, year, month) → MonthlyHistory |
getHistory.php (year + month, month 1–12) |
GetGraphHistoryAsync(deviceName, email, date) → List<GraphHistoryPoint> |
getGraphHistory.php (date = yyyy-MM-dd; DateOnly overload too) |
Notifications
| Method | Endpoint |
|---|---|
GetNotificationsAsync / GetNotificationsHistoryAsync(deviceName, email) → JsonElement? |
getNotifications.php / getNotificationsHistory.php |
EnableNotificationAsync / DisableNotificationAsync(deviceName, email, notificationId) |
enableNotification.php / disableNotification.php |
SetNotificationTemperatureAsync(deviceName, email, notificationId, temperature) |
setNotificationTemperature.php |
Sharing / permissions
| Method | Endpoint |
|---|---|
GetSharedAccountsAsync(deviceName, email) → JsonElement? |
getSharedAccounts.php |
ShareAccountAsync / DeleteSharedAccountAsync(deviceName, email, sharedEmail) |
shareAccount.php / deleteSharedAccount.php |
GetUserPermissionsAsync(deviceName, email, sharedEmail) → JsonElement? |
getUserPermissions.php |
SetUserPermissionsAsync(deviceName, email, sharedEmail, viewOnly, timers, restartTemperatureCalculation, wallSwitchOverride, settings, share, maxTemperature) |
setUserPermissions.php |
Dolphin Plus
| Method | Endpoint |
|---|---|
IsDolphinPlusAsync(deviceName, email, function=null) → JsonElement? |
isDolphinPlus.php |
Account-level calls (
getSharedAccounts,shareAccount, …) still need adeviceNamebecause auth is always keyed to a device — pass the account's primary device name.
Field notes
- Amps, not kWh.
MainScreenData.Ampsis the API'sEnergyfield — instantaneous current in Amperes (the app renders it as"X(A)"). The API exposes no voltage or kWh, so energy totals must be estimated (Ah × assumed voltage). - Booleans. Settings flags arrive as
"1"/"0"; main-screen flags arrive as"ON". Both are normalized for you. Parsing is lenient (JsonElement-based), so extra or missing fields are tolerated. Dayencoding. Timer days are a comma-separated list ofSun,Mon,Tue,Wed,Thu,Fri,Sat(oronce). Quantity timers carry only a start time + aQuantity(shower count or target °), not a duration — only fixed-temperature timers have an explicit end time.getHistoryshape is unverified. The decompiled APK doesn't pin downgetHistory.php's response fields, soMonthlyHistory.Cost/TotalMinutes/Consumptionare a best-effort mapping over the likely key names.MonthlyHistory.Rawis authoritative — inspect it against a live response and tighten the mapping once the real field names are known.
Dependency injection
DolphinClient accepts optional HttpClient and ILogger<DolphinClient> parameters. Note that when
you pass your own HttpClient, you are responsible for the trust-all TLS handler and the
https://api.dolphinboiler.com/API/ base address — the built-in defaults are only applied when the
client creates its own HttpClient.
Related projects
Shoutout to dolphin by @0xAlon — a Home Assistant integration for Dolphin Boiler. If you're looking for a ready-made HA custom component rather than a standalone .NET library, check it out!
License
This project is provided as-is. Use at your own risk.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Microsoft.Extensions.Logging (>= 10.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.