Skip to main content

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

MethodEndpoint
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.