Explore the Harvest data model

See how the various Harvest endpoints relate to each other, using our handy Entity Relationship Diagram.

Pulling data from Harvest is only the first part of your reporting. You also need to understand the relationships between different endpoints - something that APIs typically fail to convey.

At SyncHub, we not only pull your Harvest endpoints down into a reportable format, we also describe their relationships (e.g. in terms of foreign keys) so that you can quickly get a grasp of your data and how it fits together. This page is intended as technical documentation of these relationships.

Endpoints

Client

Documentation: https://help.getharvest.com/api-v2/clients-api/clients/clients/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string - -
Address string - -
StatementKey string - -
Currency string - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

Company

Documentation: https://help.getharvest.com/api-v2/company-api/company/company/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
Name string - -
BaseUri string - -
FullDomain string - -
IsActive boolean - -
WeekStartDay string - -
WantsTimestampTimers boolean - -
TimeFormat string - -
DateFormat string - -
PlanType string - -
ExpenseFeature boolean - -
InvoiceFeature boolean - -
EstimateFeature boolean - -
ApprovalFeature boolean - -
Clock string - -
DecimalSymbol string - -
ThousandsSeparator string - -
ColorScheme string - -
WeeklyCapacity string - -

Contact

Documentation: https://help.getharvest.com/api-v2/clients-api/clients/contacts/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Title string - -
FirstName string - -
LastName string - -
Email string - -
PhoneOffice string - -
PhoneMobile string - -
Fax string - -
ClientID long Client → ID -
CreatedAt datetime - -
UpdatedAt datetime - -

Estimate

Documentation: https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
ClientID long Client → ID -
CreatedByUserID long User → ID -
ClientKey string - -
Number string - -
PurchaseOrder string - -
Amount decimal - -
Tax decimal - -
TaxAmount decimal - -
Tax2 decimal - -
Tax2Amount decimal - -
Discount decimal - -
DiscountAmount decimal - -
Subject string - -
Notes string - -
State string - -
IssueDate string - -
SentAt datetime - -
AcceptedAt datetime - -
DeclinedAt datetime - -
Currency string - -
CreatedAt datetime - -
UpdatedAt datetime - -

EstimateItem

Column Type Relates to Notes
RemoteID string - -
EstimateRemoteID string Estimate → RemoteID -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Description string - -
EstimateID long Estimate → ID -
LineNumber int - -
Kind string EstimateItemCategory → Name -
Quantity decimal - -
UnitPrice decimal - -
Amount decimal - -
Taxed boolean - -
Taxed2 boolean - -

EstimateItemCategory

Documentation: https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string -
  • 29 Mar 2022 Used as a foreign key from the Estimate table. We have confirmed that the Harvest app does not let one create duplicates
CreatedAt datetime - -
UpdatedAt datetime - -

Expense

Documentation: https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
ReceiptUrl string - -
ReceiptFileName string - -
ReceiptFileSize decimal - -
ReceiptContentType string - -
UserID long User → ID -
UserAssignmentID long UserAssignment → ID -
ProjectID long Project → ID -
ClientID long Client → ID -
InvoiceID long Invoice → ID -
ExpenseCategoryID long - -
Notes string - -
TotalCost decimal - -
Units decimal - -
IsClosed boolean - -
IsLocked boolean - -
IsBilled boolean - -
LockedReason string - -
SpentDate string - -
Billable boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

ExpenseCategory

Documentation: https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string - -
UnitName string - -
UnitPrice decimal - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

Invoice

Documentation: https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
ClientID long Client → ID -
CreatedByUserID long User → ID -
ClientKey string - -
Number string - -
PurchaseOrder string - -
Amount decimal - -
DueAmount decimal - -
Tax string - -
TaxAmount decimal - -
Tax2 decimal - -
Tax2Amount decimal - -
Discount decimal - -
DiscountAmount decimal - -
Subject string - -
Notes string - -
State string - -
PeriodStart string - -
PeriodEnd string - -
IssueDate string - -
DueDate string - -
PaymentTerm string - -
SentAt datetime - -
PaidAt datetime - -
PaidDate string - -
ClosedAt datetime - -
RecurringInvoiceID long Invoice → ID -
Currency string - -
EstimateID long Estimate → ID -
RetainerID long - -
CreatedAt datetime - -
UpdatedAt datetime - -

InvoiceItem

Column Type Relates to Notes
RemoteID string - -
InvoiceRemoteID string Invoice → RemoteID -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
Description string - -
InvoiceID long Invoice → ID -
LineNumber int - -
ProjectID long - -
Kind string InvoiceItemCategory → Name -
Quantity decimal - -
UnitPrice decimal - -
Amount decimal - -
Taxed boolean - -
Taxed2 boolean - -

InvoiceItemCategory

Documentation: https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string -
  • 29 Mar 2022 Used as a foreign key from the invoice table. We have confirmed that the Harvest app does not let one create duplicates
UseAsService boolean - -
UseAsExpense boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

InvoicePayment

Documentation: https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments/

Column Type Relates to Notes
RemoteID string - -
InvoiceRemoteID string Invoice → RemoteID -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
InvoiceID long Invoice → ID -
PaymentGatewayID long - -
PaymentGatewayName string - -
Amount decimal - -
PaidAt datetime - -
PaidDate string - -
RecordedBy string - -
RecordedByEmail string - -
Notes string - -
TransactionID string - -
CreatedAt datetime - -
UpdatedAt datetime - -

Project

Documentation: https://help.getharvest.com/api-v2/Projects-api/Projects/Projects/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string - -
ClientID long Client → ID -
Code string - -
BillBy string - -
Budget decimal - -
BudgetBy string - -
BudgetIsMonthly boolean - -
NotifyWhenOverBudget boolean - -
OverBudgetNotificationPercentage decimal - -
OverBudgetNotificationDate datetime - -
ShowBudgetToAll boolean - -
StartsOn string - -
EndsOn string - -
IsBillable boolean - -
IsFixedFee boolean - -
Notes string - -
CostBudget decimal - -
CostBudgetIncludeExpenses boolean - -
HourlyRate decimal - -
Fee decimal - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

Role

Documentation: https://help.getharvest.com/api-v2/Roles-api/Roles/Roles/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string - -
CreatedAt datetime - -
UpdatedAt datetime - -

Task

Documentation: https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
Name string - -
BillableByDefault boolean - -
DefaultHourlyRate decimal - -
IsDefault boolean - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

TaskAssignment

Documentation: https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/

Column Type Relates to Notes
RemoteID string -
  • 28 Mar 2022 The TaskAssignmentID is globally unique, but we still need the ProjectID in order to query for single items
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
ProjectID long Project → ID -
TaskID long Task → ID -
Billable boolean - -
HourlyRate decimal - -
Budget decimal - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

TimeEntry

Documentation: https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
SpentDate string - -
ExternalReferenceID string - -
ExternalReferenceGroupID string - -
ExternalReferenceAccountID string - -
ExternalReferencePermaLink string - -
ExternalReferenceService string - -
UserID long User → ID -
ClientID long Client → ID -
ProjectID long Project → ID -
TaskID long Task → ID -
UserAssignmentID long UserAssignment → ID -
TaskAssignmentID long TaskAssignment → ID -
InvoiceID long Invoice → ID -
Hours decimal - -
HoursWithoutTimer decimal - -
RoundedHours decimal - -
Notes string - -
IsLocked boolean - -
LockedReason string - -
IsClosed boolean - -
IsBilled boolean - -
TimerStartedAt datetime -
  • 28 Mar 2022 If tracking by duration
StartedTime string -
  • 28 Mar 2022 If tracking by start/end times
EndedTime string -
  • 28 Mar 2022 If tracking by start/end times
IsRunning boolean - -
Billable boolean - -
Budgeted boolean - -
BillableRate decimal - -
CostRate decimal - -
CreatedAt datetime - -
UpdatedAt datetime - -

User

Documentation: https://help.getharvest.com/api-v2/users-api/users/users/

Column Type Relates to Notes
RemoteID string - -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
FirstName string - -
LastName string - -
Email string - -
Telephone string - -
Timezone string -
  • 28 Mar 2022 Harvest has their own timezone terminology. You can find a list in their API docs.
HasAccessToAllFutureProjects boolean - -
IsContractor boolean - -
IsProjectManager boolean - -
CanSeeRates boolean - -
CanCreateProjects boolean - -
CanCreateInvoices boolean - -
IsAdmin boolean - -
WeeklyCapacity decimal - -
DefaultHourlyRate decimal - -
CostRate decimal - -
AvatarUrl string - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

UserAssignment

Documentation: https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/

Column Type Relates to Notes
RemoteID string -
  • 28 Mar 2022 The UserAssignmentID is globally unique, but we still need the ProjectID in order to query for single items
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
ProjectID long Project → ID -
UserID long User → ID -
IsProjectManager boolean - -
UseDefaultRates boolean - -
Budget decimal - -
HourlyRate decimal - -
IsActive boolean - -
CreatedAt datetime - -
UpdatedAt datetime - -

UserBillableRate

Documentation: https://help.getharvest.com/api-v2/Roles-api/Roles/Roles/

Column Type Relates to Notes
RemoteID string -
  • 29 Mar 2022 The id field is globally unique, however we make our remoteID include the userID, so that we may retrieve the single-item record later
UserRemoteID string User → RemoteID -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
UserID long User → ID -
Amount decimal - -
StartDate string - -
EndDate string - -
CreatedAt datetime - -
UpdatedAt datetime - -

UserCostRate

Documentation: https://help.getharvest.com/api-v2/users-api/users/cost-rates/

Column Type Relates to Notes
RemoteID string -
  • 29 Mar 2022 The id field is globally unique, however we make our remoteID include the userID, so that we may retrieve the single-item record later
UserRemoteID string User → RemoteID -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
ID long - -
UserID long User → ID -
Amount decimal - -
StartDate string - -
EndDate string - -
CreatedAt datetime - -
UpdatedAt datetime - -

UserRole

Column Type Relates to Notes
RemoteID string - -
RoleRemoteID string Role → RemoteID -
MirrorRemoteID int - -
IsDeleted boolean - -
WhenCreated datetime - -
WhenModified datetime - -
UserID long User → ID -
RoleID long Role → ID -

Need more?

SyncHub lives and breathes APIs and data. Keep exploring using the links below.