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.Sdk

Quick 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:

PropertyTypeDefaultDescription
BaseUrlstringhttps://app.dimesheets.comAPI base URL
ApiKeystring--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);