SDKs
.NET SDK
Install and use the Dime.Sheets .NET client library.
.NET SDK
The .NET SDK provides a typed client for the Dime.Sheets API, targeting .NET 8+.
Installation
dotnet add package Dime.Sheets.SdkQuick start
using Dime.Sheets.Sdk;
var client = new DimeSheetsClient(new DimeSheetsClientOptions
{
BaseUrl = "https://app.dimesheets.com",
ApiKey = "your-api-key"
});
// List all projects
var projects = await client.Projects.GetAllAsync();
foreach (var project in projects)
Console.WriteLine($"{project.ExternalId}: {project.Name}");Configuration
The client accepts a DimeSheetsClientOptions object:
| Property | Type | Default | Description |
|---|---|---|---|
BaseUrl | string | https://app.dimesheets.com | API base URL |
ApiKey | string | -- | API key for authentication |
You can also pass your own HttpClient for custom configuration (proxies, retry policies, logging):
var httpClient = new HttpClient { BaseAddress = new Uri("https://app.dimesheets.com") };
httpClient.DefaultRequestHeaders.Add("X-API-KEY", "your-api-key");
var client = new DimeSheetsClient(options, httpClient);When you provide your own HttpClient, the SDK will not dispose it.
Resources
Projects
var all = await client.Projects.GetAllAsync();
var one = await client.Projects.GetByExternalIdAsync("proj-100");
var created = await client.Projects.CreateAsync(new Project { Name = "New Project", ExternalId = "proj-101" });
var updated = await client.Projects.UpdateAsync("proj-101", project);
await client.Projects.DeleteAsync("proj-101");Tasks
var tasks = await client.Tasks.GetAllAsync();
var task = await client.Tasks.GetByExternalIdAsync("task-200");
var created = await client.Tasks.CreateAsync(new TaskModel { Name = "Design", ProjectId = 3, ExternalId = "task-201" });
var updated = await client.Tasks.UpdateAsync("task-201", task);
await client.Tasks.DeleteAsync("task-201");Clients
var clients = await client.Clients.GetAllAsync();
var one = await client.Clients.GetByExternalIdAsync("client-acme");Time Entries
var entries = await client.TimeEntries.GetAllAsync();
var created = await client.TimeEntries.CreateAsync(new TimeEntry
{
TaskId = 3,
Date = DateTime.UtcNow,
Duration = 2.5,
Description = "API integration work",
IsBillable = true
});Timesheets
var timesheet = await client.Timesheets.GetByIdAsync(12);Timesheet Period Templates
var templates = await client.TimesheetPeriodTemplates.GetAllAsync();
var template = await client.TimesheetPeriodTemplates.GetByExternalIdAsync("tpl-weekly");Timesheet Periods
var periods = await client.TimesheetPeriods.GetAllAsync();
var filtered = await client.TimesheetPeriods.GetFilteredAsync(templateId: 1, status: 0, year: 2026);
var period = await client.TimesheetPeriods.GetByExternalIdAsync("period-2026-w14");Integration
var result = await client.Integration.UpsertProjectsAsync(new[]
{
new Project { ExternalId = "erp-001", Name = "ERP Project" }
});
Console.WriteLine($"Succeeded: {result.Succeeded}/{result.Total}");Disposal
The client implements IDisposable. When you let the SDK create its own HttpClient, call Dispose() or use a using block:
using var client = new DimeSheetsClient(options);