C# / .NET SDK
dotnet add package Noxdren
Requires .NET 8+.
Quickstart
using Noxdren;
using var client = new NoxdrenClient("ndx_..."); // from app.noxdren.com
// Range rings
var r = await client.RangeIq.AnalyzeAsync(new RangeIqRequest
{
UserLat = 37.5,
UserLon = -122.3,
SelectedDroneKey = "dji_mavic_3",
WindSpeed = 6.0,
WindDirection = 270,
});
foreach (var ring in r.Obj("result")!.List("rings"))
Console.WriteLine($"{ring.Str("label")} @ {ring.Num("battery_threshold_pct")}%");
// Multi-leg mission
var m = await client.Missions.AnalyzeGeometryAsync(new MissionRequest
{
HomeLat = 37.5,
HomeLon = -122.3,
DroneKey = "dji_mavic_3",
Waypoints = new List<Waypoint>
{
new() { Lat = 37.50, Lon = -122.30, AltitudeM = 80 },
new() { Lat = 37.52, Lon = -122.31, AltitudeM = 100 },
},
Weather = new Weather { WindSpeedMps = 6.0, WindDirDeg = 270 },
});
Console.WriteLine(m.Obj("result")!.Str("mission_verdict"));
Read responses with typed navigation (r.Obj("result")!.List("rings")[0].Str("label"))
or r.Raw for the parsed dictionary.
Error handling
try
{
await client.RangeIq.AnalyzeAsync(req);
}
catch (AuthenticationException) { /* 401 */ }
catch (ValidationException e) { Console.WriteLine($"{e.Code} {e.Message}"); /* 400/422 */ }
catch (RateLimitException e) { Console.WriteLine($"retry after {e.RetryAfter}s"); /* 429 */ }
catch (NoxdrenException e) { Console.WriteLine($"{e.Code} {e.RequestId}"); /* catch-all */ }
Transient errors retry automatically (backoff honoring Retry-After); tune via
the maxRetries constructor argument.
Configuration
new NoxdrenClient(
apiKey: "ndx_...",
baseUrl: "https://api.noxdren.com",
timeoutSeconds: 30,
maxRetries: 2);
Coverage
| Method | Endpoint |
|---|---|
client.Drones.ListAsync() / .GetAsync(key) | GET /v1/drones, /v1/drones/{key} |
client.RangeIq.AnalyzeAsync(...) | POST /v1/rangeiq/analyze |
client.Missions.AnalyzeGeometryAsync(...) | POST /v1/missions/analyze-geometry |
client.HealthAsync() / .VersionAsync() | GET /v1/health, /v1/version |
See the API reference for every field.