Skip to main content

C# SDK

Installation

dotnet add package FlexOps.Sdk

Quick Start

using FlexOps;

var client = new FlexOpsClient("your-api-key");

var rates = await client.Rates.GetAsync(new RateRequest
{
From = new Address { Zip = "80202", Country = "US" },
To = new Address { Zip = "10001", Country = "US" },
Parcel = new Parcel { Weight = 2.5m, Length = 10, Width = 8, Height = 4 },
});

foreach (var rate in rates.Rates)
Console.WriteLine($"{rate.Carrier} {rate.Service}: ${rate.TotalPrice}");

Configuration

var client = new FlexOpsClient(new FlexOpsOptions
{
ApiKey = "your-api-key",
BaseUrl = "https://api.flexops.io/v1", // optional
Timeout = TimeSpan.FromSeconds(30), // default 30s
MaxRetries = 3, // default 3
});

Dependency Injection

builder.Services.AddFlexOps(options =>
{
options.ApiKey = builder.Configuration["FlexOps:ApiKey"]!;
});

Then inject IFlexOpsClient into your services.

Shipping Operations

Create a Label

var label = await client.Labels.CreateAsync(new CreateLabelRequest
{
Carrier = "usps",
Service = "priority",
From = new Address
{
Name = "Warehouse",
Street1 = "123 Main St",
City = "Denver",
State = "CO",
Zip = "80202",
Country = "US",
},
To = new Address
{
Name = "Customer",
Street1 = "456 Broadway",
City = "New York",
State = "NY",
Zip = "10001",
Country = "US",
},
Parcel = new Parcel { Weight = 2.5m, Length = 10, Width = 8, Height = 4 },
}, idempotencyKey: "order-12345");

Console.WriteLine(label.TrackingNumber);
Console.WriteLine(label.LabelUrl);

Track a Shipment

var tracking = await client.Tracking.GetAsync("9400111899223456789012");

Console.WriteLine(tracking.Status);
Console.WriteLine(tracking.EstimatedDelivery);

foreach (var evt in tracking.Events)
Console.WriteLine($"{evt.Timestamp}: {evt.Description}");

Validate an Address

var result = await client.Addresses.ValidateAsync(new Address
{
Street1 = "123 Main St",
City = "Denver",
State = "CO",
Zip = "80202",
Country = "US",
});

if (result.IsValid)
Console.WriteLine($"Validated: {result.Normalized}");

Batch Label Creation

var batch = await client.Labels.CreateBatchAsync(new[]
{
new CreateLabelRequest { Carrier = "usps", Service = "priority", ... },
new CreateLabelRequest { Carrier = "usps", Service = "priority", ... },
});

foreach (var result in batch.Results)
{
if (result.Success)
Console.WriteLine(result.Label.TrackingNumber);
else
Console.Error.WriteLine(result.Error);
}

Webhook Verification

app.MapPost("/webhooks/flexops", async (HttpContext context) =>
{
var signature = context.Request.Headers["X-FlexOps-Signature"].ToString();
using var reader = new StreamReader(context.Request.Body);
var body = await reader.ReadToEndAsync();

if (!WebhookVerifier.Verify(body, signature, "whsec_your_secret"))
return Results.Unauthorized();

var webhookEvent = JsonSerializer.Deserialize<WebhookEvent>(body);
// Handle event...

return Results.Ok();
});

Error Handling

try
{
var label = await client.Labels.CreateAsync(request);
}
catch (RateLimitException ex)
{
Console.WriteLine($"Retry after {ex.RetryAfter} seconds");
}
catch (FlexOpsException ex)
{
Console.Error.WriteLine($"{ex.Code}: {ex.Message}");
}