Universal.Xero.Client
12.4.0
dotnet add package Universal.Xero.Client --version 12.4.0
NuGet\Install-Package Universal.Xero.Client -Version 12.4.0
<PackageReference Include="Universal.Xero.Client" Version="12.4.0" />
<PackageVersion Include="Universal.Xero.Client" Version="12.4.0" />
<PackageReference Include="Universal.Xero.Client" />
paket add Universal.Xero.Client --version 12.4.0
#r "nuget: Universal.Xero.Client, 12.4.0"
#:package Universal.Xero.Client@12.4.0
#addin nuget:?package=Universal.Xero.Client&version=12.4.0
#tool nuget:?package=Universal.Xero.Client&version=12.4.0
Universal.Xero.Client
Type-safe, generated wrapper for the Xero API with simplified authentication.
Still uses the official SDK behind the scenes, but provides a saner API.
Getting Started
Installation
dotnet add package Universal.Xero.Client
Authentication
Universal.Xero.Client supports all OAuth2 flows for Xero authentication:
1. Authorization Code Flow (Web Applications)
Standard OAuth2 flow for web applications with a backend server:
// Exchange authorization code for access token and create client
var client = await XeroClient.CreateWithAuthorizationCodeAsync(
clientId: "your-client-id",
clientSecret: "your-client-secret",
code: "authorization-code-from-callback",
redirectUri: "https://yourapp.com/callback",
tenantId: "tenant-id"
);
2. PKCE Flow (Mobile Apps & SPAs)
Recommended for public clients where you can't securely store a client secret:
// Generate code verifier before authorization (store it securely)
string codeVerifier = GenerateCodeVerifier(); // Your implementation
// After receiving the authorization code, create client
var client = await XeroClient.CreateWithPkceAsync(
clientId: "your-client-id",
code: "authorization-code-from-callback",
codeVerifier: codeVerifier,
redirectUri: "yourapp://callback",
tenantId: "tenant-id"
);
3. Client Credentials Flow (Machine-to-Machine)
For server-to-server authentication without user interaction:
var client = await XeroClient.CreateWithClientCredentialsAsync(
clientId: "your-client-id",
clientSecret: "your-client-secret",
scope: "accounting.transactions accounting.contacts"
);
4. Refresh Token Flow
Renew expired access tokens without user interaction:
var client = await XeroClient.CreateWithRefreshTokenAsync(
clientId: "your-client-id",
clientSecret: "your-client-secret",
refreshToken: "stored-refresh-token",
tenantId: "tenant-id"
);
5. Direct Access Token (Custom Connections)
If you already have an access token from elsewhere:
// Standard OAuth Apps (multi-tenant)
var client = new XeroClient(tenantId, accessToken);
// Custom Connections (single organization)
var client = new XeroClient(accessToken);
Working with Tokens
If you need more control over token management, you can obtain tokens separately:
// Get token without creating client
IXeroToken token = await XeroClient.GetTokenByAuthorizationCodeAsync(
clientId, clientSecret, code, redirectUri);
// Access token properties
string accessToken = token.AccessToken;
string refreshToken = token.RefreshToken;
DateTime expiresAt = token.ExpiresAtUtc;
List<Tenant> tenants = token.Tenants;
// Create client later
var client = new XeroClient(tenantId, token.AccessToken);
Available token methods:
GetTokenByAuthorizationCodeAsync()- Standard OAuth2 authorization code flowGetTokenByAuthorizationCodePkceAsync()- PKCE flow for public clientsGetTokenByRefreshTokenAsync()- Refresh an expired tokenGetTokenByClientCredentialsAsync()- Machine-to-machine authentication
Usage
using Universal.Xero.Client;
// Create client with your credentials
var client = new XeroClient(tenantId, accessToken);
// Access any Xero API
// Any class named XApi from the official SDK -> XClient.
var invoices = await client.AccountingClient.GetInvoicesAsync();
var employees = await client.PayrollAuClient.GetEmployeesAsync();
var projects = await client.ProjectClient.GetProjectsAsync();
// Get a specific resource
var invoice = await client.AccountingClient.GetInvoiceAsync(invoiceId);
Features
- Fully Generated: Automatically generated from the official Xero SDK
- Type-Safe: Full IntelliSense support with preserved XML documentation - 1:1 match with official SDK but with quality of life improvements
- All OAuth2 Flows: Support for authorization code, PKCE, client credentials, and refresh token flows
- Organized by API: Separate clients for Accounting, Payroll, Projects, Assets, etc. - same as official SDK
- Simplified Auth: No need to pass access tokens and tenant IDs to every method call - batteries included
Available Clients
AccountingClient- Core accounting operations (invoices, contacts, payments, etc.)AppStoreClient- App marketplace integrationAssetClient- Fixed asset managementBankFeedsClient- Bank feed managementFilesClient- File storage and attachmentsFinanceClient- Financial reportingIdentityClient- OAuth connectionsPayrollAuClient- Australian payrollPayrollNzClient- New Zealand payrollPayrollUkClient- UK payrollProjectClient- Project tracking and time entries
Example: Complete OAuth Flow
// 1. Redirect user to Xero authorization URL (implement in your app)
string authUrl = $"https://login.xero.com/identity/connect/authorize?...";
// 2. User authorizes and returns with code
// 3. Exchange code for token and create client
var client = await XeroClient.CreateWithAuthorizationCodeAsync(
clientId, clientSecret, code, redirectUri, tenantId);
// 4. Use client
var invoices = await client.AccountingClient.GetInvoicesAsync();
// 5. When token expires, refresh it
var newClient = await XeroClient.CreateWithRefreshTokenAsync(
clientId, clientSecret, storedRefreshToken, tenantId);
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Xero.NetStandard.OAuth2 (>= 12.4.0)
- Xero.NetStandard.OAuth2Client (>= 1.6.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 12.4.0 | 438 | 12/9/2025 |