DevOp.ZoHo.Desk
1.2.1
dotnet add package DevOp.ZoHo.Desk --version 1.2.1
NuGet\Install-Package DevOp.ZoHo.Desk -Version 1.2.1
<PackageReference Include="DevOp.ZoHo.Desk" Version="1.2.1" />
<PackageVersion Include="DevOp.ZoHo.Desk" Version="1.2.1" />
<PackageReference Include="DevOp.ZoHo.Desk" />
paket add DevOp.ZoHo.Desk --version 1.2.1
#r "nuget: DevOp.ZoHo.Desk, 1.2.1"
#:package DevOp.ZoHo.Desk@1.2.1
#addin nuget:?package=DevOp.ZoHo.Desk&version=1.2.1
#tool nuget:?package=DevOp.ZoHo.Desk&version=1.2.1
DevOp.ZoHo.Desk
A practical .NET client for ZoHo Desk.
DevOp.ZoHo.Desk gives you typed, auto-paginating access to ZoHo Desk through a fluent query builder, rich structured search, and full OAuth 2.0 token management via DevOp.ZoHo.Auth.
Install
dotnet add package DevOp.ZoHo.Desk
dotnet add package DevOp.ZoHo.Auth
Register with DI
builder.Services
.AddZoHo(auth =>
{
auth.ClientId = configuration["ZoHo:ClientId"]!;
auth.ClientSecret = configuration["ZoHo:ClientSecret"]!;
auth.RefreshToken = configuration["ZoHo:RefreshToken"]!;
auth.Region = ZoHoRegion.EU;
})
.AddZoHoDesk(desk =>
{
desk.BaseUrl = "https://desk.zoho.eu";
});
Then inject ZoHoDeskClient directly into your controllers or services.
Query Tickets
// Auto-paginate — fetches every page transparently
var tickets = await client.Tickets
.Query()
.Status("Open")
.Priority("High")
.Account(accountId)
.IncludeContacts()
.IncludeAssignee()
.ToListAsync();
// Cap the result set
var recent = await client.Tickets.Query().Take(100).ToListAsync();
// Manual page-by-page control
await foreach (var page in client.Tickets.Query().Status("Open").Paged())
{
// process one page at a time
}
Search Tickets
// Field-specific search with date range and sort
var results = await client.Search.Tickets()
.Status("Open", "Pending")
.AccountName("Acme*")
.CreatedBetween(
new DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero),
DateTimeOffset.UtcNow)
.OrderBy("modifiedTime", descending: true)
.ToListAsync();
// Search across all fields
var all = await client.Search.Tickets().All("billing*").ToListAsync();
// Custom field search
var byContract = await client.Search.Tickets()
.CustomField(1, "cf_contract_number", "CNT-*")
.ToListAsync();
Cross-Module Search
var results = await client.Search
.Query("billing issue")
.Modules(DeskModule.Ticket, DeskModule.Account, DeskModule.Contact)
.ToListAsync();
// Each SearchResult carries an EntityType discriminator
foreach (var r in results)
Console.WriteLine($"{r.EntityType}: {r.Subject ?? r.Name}");
Accounts and Contacts
var account = await client.Accounts.GetAsync(accountId);
var contacts = await client.Contacts.Query().ForAccount(accountId).ToListAsync();
await client.Accounts.AssociateContactAsync(accountId, contactId);
await client.Accounts.DissociateContactAsync(accountId, contactId);
Agents
var agent = await client.Agents.GetMeAsync();
var signatures = await client.Agents.GetSignaturesAsync(agent!.Id!);
var entries = await client.Agents
.QueryTimeEntries(agent.Id!)
.Module(DeskModule.Ticket)
.CreatedBetween(DateTime.UtcNow.AddDays(-30), DateTime.UtcNow)
.ToListAsync();
Contracts and Support Plans
var contracts = await client.Contracts.Query().Status("Active").IncludeAll().ToListAsync();
var plans = await client.SupportPlans.Query().Account(accountId).ToListAsync();
await client.Contracts.TrashAsync(contractId);
Resources Covered
Tickets · Accounts · Contacts · Organizations · Departments ·
Agents · Teams · Articles · Contracts · SupportPlans · Search
Target Frameworks
netstandard2.1 · net8.0 · net10.0
| 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 is compatible. 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 is compatible. 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 | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | 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.1
- DevOp.ZoHo.Auth (>= 1.4.0 && < 2.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- System.Text.Json (>= 10.0.0)
-
net10.0
- DevOp.ZoHo.Auth (>= 1.4.0 && < 2.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
-
net8.0
- DevOp.ZoHo.Auth (>= 1.4.0 && < 2.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Adds account phone field to webhook extensions.
- Adds TryGetAccountPhone to ZoHoAccountWebhookExtensions for inbound phone sync