Home

Budgets and Time

If you’re looking for a budget on a Work Item, that’s an Estimate Summary. If you’re looking for logged time (hours worked), that’s an Individual Time Entry. Neither is named quite what you’d expect, so this guide maps the everyday terms to the actual endpoints.

Budgets (Estimate Summaries)

A Work Item’s budget is made up of one Estimate Summary per user/task combination — the estimated time or cost for that person to complete that task type.

List every Estimate Summary on a Work Item:

GET https://api.karbonhq.com/v3/EstimateSummaries/{WorkItemKey}
Authorization: Bearer {token}
AccessKey: {key}
{
  "value": [
    {
      "EstimateSummaryKey": "160F79F6-E650-40C3-8BD9-F70C287B7476-0",
      "UserKey": "RXq4mB32PXg",
      "RoleName": "Accountant",
      "TaskTypeName": "Admin",
      "EstimateMinutes": 15,
      "HourlyRate": 150,
      "ActualMinutes": 14,
      "EstimateAmount": 37.5
    }
  ]
}

To read or change a single estimate, use its EstimateSummaryKey against the nested endpoint:

GET   https://api.karbonhq.com/v3/WorkItems/{WorkItemKey}/EstimateSummaries/{EstimateSummaryKey}
PATCH https://api.karbonhq.com/v3/WorkItems/{WorkItemKey}/EstimateSummaries/{EstimateSummaryKey}

PATCH accepts EstimateMinutes, EstimateAmount, and HourlyRate — all optional, but a firm’s Time and Budget setting decides whether estimates are tracked by time or by amount, so only the matching field is accepted, and EstimateMinutes/EstimateAmount can’t be supplied together:

{
  "EstimateAmount": 250.0
}

A successful PATCH returns 204 No Content. Changing HourlyRate can reissue the EstimateSummaryKey — always follow the OData-EntityId response header for the estimate’s new location rather than reusing the key you sent.

An EstimateSummaryKey starting with 0- represents time logged against a task with no estimate assigned, not a real budget line — it’s GET-only. Assign an estimate to that task in Karbon before it becomes patchable.

Time tracking (Individual Time Entries)

Logged time — what a user actually worked, as opposed to what was budgeted — lives at /v3/IndividualTimeEntries, one record per user/day/task:

GET https://api.karbonhq.com/v3/IndividualTimeEntries?$filter=WorkItemKey eq '3cC1vkWmhGb1'&$orderby=Date desc
Authorization: Bearer {token}
AccessKey: {key}
{
  "value": [
    {
      "IndividualTimeEntryKey": "a1b2c3d4e5f67890abcdef1234567890",
      "TimesheetKey": "3TxlnQ4Pd8zJ",
      "WorkItemKey": "3cC1vkWmhGb1",
      "UserKey": "2xfLMq5PFqb7",
      "TaskTypeName": "Tax Return",
      "Date": "2024-07-04T00:00:00Z",
      "Minutes": 90,
      "HourlyRate": 250,
      "TotalCost": 375,
      "BilledStatus": "Unbilled"
    }
  ]
}

$filter supports Date, TimesheetKey, EntityKey, WorkItemKey, ClientKey, UserKey, RoleName, and TaskTypeName. $orderby only sorts by DateDate (default) or Date desc. A single entry can also be fetched directly with GET /v3/IndividualTimeEntries/{IndividualTimeEntryKey}.

Note: GET /v3/Timesheets also exists but is deprecated. It returns time aggregated to the tenant’s timesheet period (weekly by default), not a per-day breakdown. Use IndividualTimeEntries instead for anything that needs entry-level detail.

Quick reference

Asking for… Use
A Work Item’s budget/estimate GET /v3/EstimateSummaries/{WorkItemKey}
Updating one budget line PATCH /v3/WorkItems/{WorkItemKey}/EstimateSummaries/{EstimateSummaryKey}
Logged time / hours worked GET /v3/IndividualTimeEntries
A single logged time entry GET /v3/IndividualTimeEntries/{IndividualTimeEntryKey}
Aggregated weekly timesheets GET /v3/Timesheets — deprecated, prefer IndividualTimeEntries