The C# SDK provides convenient access to the Dodo Payments REST API from applications written in C#. It features an async Task-based API with strong typing, automatic retries, and comprehensive error handling.
Installation
Install the package from NuGet :
dotnet add package DodoPayments.Client
The SDK requires .NET 8.0 or later. It works with ASP.NET Core, Console applications, and other .NET project types.
Quick Start
Initialize the client and create a checkout session:
using System ;
using DodoPayments . Client ;
using DodoPayments . Client . Models . CheckoutSessions ;
// Configured using the DODO_PAYMENTS_API_KEY and DODO_PAYMENTS_BASE_URL environment variables
DodoPaymentsClient client = new ();
CheckoutSessionCreateParams parameters = new ()
{
ProductCart =
[
new ()
{
ProductID = "product_id" ,
Quantity = 1 ,
},
],
};
var checkoutSessionResponse = await client . CheckoutSessions . Create ( parameters );
Console . WriteLine ( checkoutSessionResponse . SessionId );
Always store your API keys securely using environment variables, user secrets, or Azure Key Vault. Never hardcode them in your source code or commit them to version control.
Core Features
Async/Await Full async Task-based API for non-blocking operations
Strong Typing Comprehensive type safety with nullable reference types
Smart Retries Automatic retries with exponential backoff for transient errors
Error Handling Built-in exception hierarchy for precise error management
Configuration
Environment Variables
DODO_PAYMENTS_API_KEY = your_api_key_here
// Automatically reads from environment variables
DodoPaymentsClient client = new ();
Property Environment variable Required Default value BearerTokenDODO_PAYMENTS_API_KEYtrue - WebhookKeyDODO_PAYMENTS_WEBHOOK_KEYfalse - BaseUrlDODO_PAYMENTS_BASE_URLtrue "https://live.dodopayments.com"
Manual Configuration
DodoPaymentsClient client = new () { BearerToken = "My Bearer Token" };
Environments
Switch between live and test mode:
using DodoPayments . Client . Core ;
DodoPaymentsClient client = new () { BaseUrl = EnvironmentUrl . TestMode };
Retries
The SDK automatically retries 2 times by default with exponential backoff. It retries on connection errors and status codes 408, 409, 429, and 5xx.
// Custom retry count
DodoPaymentsClient client = new () { MaxRetries = 3 };
Timeouts
Requests time out after 1 minute by default.
DodoPaymentsClient client = new () { Timeout = TimeSpan . FromSeconds ( 30 ) };
Per-Request Overrides
Temporarily modify configuration for a single request using WithOptions:
var response = await client
. WithOptions ( options => options with
{
Timeout = TimeSpan . FromSeconds ( 10 ),
MaxRetries = 5 ,
})
. CheckoutSessions . Create ( parameters );
Common Operations
Create a Checkout Session
var parameters = new CheckoutSessionCreateParams
{
ProductCart =
[
new ()
{
ProductID = "prod_123" ,
Quantity = 1
}
],
ReturnUrl = "https://yourdomain.com/return"
};
var session = await client . CheckoutSessions . Create ( parameters );
Console . WriteLine ( $"Checkout URL: { session . Url } " );
Manage Customers
// Create a customer
var customer = await client . Customers . Create ( new CustomerCreateParams
{
Email = "customer@example.com" ,
Name = "John Doe"
});
// Retrieve customer
var retrieved = await client . Customers . Retrieve ( "cus_123" );
Console . WriteLine ( $"Customer: { retrieved . Name } ( { retrieved . Email } )" );
Handle Subscriptions
// Create a subscription
var subscription = await client . Subscriptions . Create ( new SubscriptionCreateParams
{
CustomerID = "cus_123" ,
ProductID = "prod_456" ,
PriceID = "price_789"
});
// Cancel subscription
await client . Subscriptions . Cancel ( subscription . Id );
Error Handling
The SDK throws specific exceptions based on the HTTP status code. All 4xx errors inherit from DodoPayments4xxException.
Status Exception 400 DodoPaymentsBadRequestException401 DodoPaymentsUnauthorizedException403 DodoPaymentsForbiddenException404 DodoPaymentsNotFoundException422 DodoPaymentsUnprocessableEntityException429 DodoPaymentsRateLimitException5xx DodoPayments5xxExceptionothers DodoPaymentsUnexpectedStatusCodeException
Other exception types:
DodoPaymentsIOException: I/O networking errors
DodoPaymentsInvalidDataException: Failure to interpret parsed data
DodoPaymentsException: Base class for all exceptions
Iterate through all results across all pages using the Paginate method, which returns an IAsyncEnumerable:
var page = await client . Payments . List ( parameters );
await foreach ( var item in page . Paginate ())
{
Console . WriteLine ( item );
}
var page = await client . Payments . List ();
while ( true )
{
foreach ( var item in page . Items )
{
Console . WriteLine ( item );
}
if ( ! page . HasNext ())
{
break ;
}
page = await page . Next ();
}
ASP.NET Core Integration
Register the client in your DI container:
using DodoPayments . Client ;
var builder = WebApplication . CreateBuilder ( args );
builder . Services . AddSingleton < DodoPaymentsClient >( sp =>
{
var configuration = sp . GetRequiredService < IConfiguration >();
return new DodoPaymentsClient
{
BearerToken = configuration [ "DodoPayments:ApiKey" ]
};
});
var app = builder . Build ();
app . Run ();
{
"DodoPayments" : {
"ApiKey" : "your_api_key_here"
}
}
For development, use user secrets instead of storing keys in appsettings.json: dotnet user-secrets init
dotnet user-secrets set "DodoPayments:ApiKey" "your_api_key_here"
Resources
NuGet Package View package on NuGet Gallery
GitHub Repository View source code and contribute
API Reference Complete API documentation
Discord Community Get help and connect with developers
Support
Need help with the C# SDK?