Skip to main content

Harvest full reference

This is the full reference documentation for the Harvest agent connector.

Supported entities and actions

The Harvest connector supports the following entities and actions.

EntityActions
UsersList, Get, Search
ClientsList, Get, Search
ContactsList, Get, Search
CompanyGet, Search
ProjectsList, Get, Search
TasksList, Get, Search
Time EntriesList, Get, Search
InvoicesList, Get, Search
Invoice Item CategoriesList, Get, Search
EstimatesList, Get, Search
Estimate Item CategoriesList, Get, Search
ExpensesList, Get, Search
Expense CategoriesList, Get, Search
RolesList, Get, Search
User AssignmentsList, Search
Task AssignmentsList, Search
Time ProjectsList, Search
Time TasksList, Search

Users

Users List

Returns a paginated list of users in the Harvest account

Python SDK

await harvest.users.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "users",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
first_namenull | string
last_namenull | string
emailnull | string
telephonenull | string
timezonenull | string
has_access_to_all_future_projectsnull | boolean
is_contractornull | boolean
is_activenull | boolean
weekly_capacitynull | integer
default_hourly_ratenull | number
cost_ratenull | number
rolesnull | array
access_rolesnull | array
avatar_urlnull | string
created_atnull | string
updated_atnull | string
employee_idnull | string
calendar_integration_enablednull | boolean
calendar_integration_sourcenull | string
can_create_projectsnull | boolean
permissions_claimsnull | array

Meta

Field NameTypeDescription
next_linknull | string

Users Get

Get a single user by ID

Python SDK

await harvest.users.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "users",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesUser ID
Response Schema

Records

Field NameTypeDescription
idinteger
first_namenull | string
last_namenull | string
emailnull | string
telephonenull | string
timezonenull | string
has_access_to_all_future_projectsnull | boolean
is_contractornull | boolean
is_activenull | boolean
weekly_capacitynull | integer
default_hourly_ratenull | number
cost_ratenull | number
rolesnull | array
access_rolesnull | array
avatar_urlnull | string
created_atnull | string
updated_atnull | string
employee_idnull | string
calendar_integration_enablednull | boolean
calendar_integration_sourcenull | string
can_create_projectsnull | boolean
permissions_claimsnull | array

Search and filter users records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.users.search(
query={"filter": {"eq": {"avatar_url": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "users",
"action": "search",
"params": {
"query": {"filter": {"eq": {"avatar_url": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
avatar_urlstringAvatar URL
cost_ratenumberCost rate
created_atstringWhen created
default_hourly_ratenumberDefault hourly rate
emailstringEmail address
first_namestringFirst name
idintegerUnique identifier
is_activebooleanWhether active
is_contractorbooleanWhether contractor
last_namestringLast name
rolesarrayAssigned roles
telephonestringPhone number
timezonestringTimezone
updated_atstringWhen last updated
weekly_capacityintegerWeekly capacity in seconds
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].avatar_urlstringAvatar URL
data[].cost_ratenumberCost rate
data[].created_atstringWhen created
data[].default_hourly_ratenumberDefault hourly rate
data[].emailstringEmail address
data[].first_namestringFirst name
data[].idintegerUnique identifier
data[].is_activebooleanWhether active
data[].is_contractorbooleanWhether contractor
data[].last_namestringLast name
data[].rolesarrayAssigned roles
data[].telephonestringPhone number
data[].timezonestringTimezone
data[].updated_atstringWhen last updated
data[].weekly_capacityintegerWeekly capacity in seconds

Clients

Clients List

Returns a paginated list of clients

Python SDK

await harvest.clients.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "clients",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
is_activenull | boolean
addressnull | string
statement_keynull | string
currencynull | string
created_atnull | string
updated_atnull | string

Meta

Field NameTypeDescription
next_linknull | string

Clients Get

Get a single client by ID

Python SDK

await harvest.clients.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "clients",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesClient ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
is_activenull | boolean
addressnull | string
statement_keynull | string
currencynull | string
created_atnull | string
updated_atnull | string

Search and filter clients records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.clients.search(
query={"filter": {"eq": {"address": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "clients",
"action": "search",
"params": {
"query": {"filter": {"eq": {"address": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
addressstringThe client's postal address
created_atstringWhen the client record was created
currencystringThe currency used by the client
idintegerUnique identifier for the client
is_activebooleanWhether the client is active
namestringThe client's name
updated_atstringWhen the client record was last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].addressstringThe client's postal address
data[].created_atstringWhen the client record was created
data[].currencystringThe currency used by the client
data[].idintegerUnique identifier for the client
data[].is_activebooleanWhether the client is active
data[].namestringThe client's name
data[].updated_atstringWhen the client record was last updated

Contacts

Contacts List

Returns a paginated list of contacts

Python SDK

await harvest.contacts.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "contacts",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
titlenull | string
first_namenull | string
last_namenull | string
emailnull | string
phone_officenull | string
phone_mobilenull | string
faxnull | string
created_atnull | string
updated_atnull | string
clientnull | object

Meta

Field NameTypeDescription
next_linknull | string

Contacts Get

Get a single contact by ID

Python SDK

await harvest.contacts.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "contacts",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesContact ID
Response Schema

Records

Field NameTypeDescription
idinteger
titlenull | string
first_namenull | string
last_namenull | string
emailnull | string
phone_officenull | string
phone_mobilenull | string
faxnull | string
created_atnull | string
updated_atnull | string
clientnull | object

Search and filter contacts records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.contacts.search(
query={"filter": {"eq": {"client": {}}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "contacts",
"action": "search",
"params": {
"query": {"filter": {"eq": {"client": {}}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
clientobjectClient associated with the contact
created_atstringWhen created
emailstringEmail address
first_namestringFirst name
idintegerUnique identifier
last_namestringLast name
titlestringJob title
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].clientobjectClient associated with the contact
data[].created_atstringWhen created
data[].emailstringEmail address
data[].first_namestringFirst name
data[].idintegerUnique identifier
data[].last_namestringLast name
data[].titlestringJob title
data[].updated_atstringWhen last updated

Company

Company Get

Returns the company information for the authenticated account

Python SDK

await harvest.company.get()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "company",
"action": "get"
}'
Response Schema

Records

Field NameTypeDescription
base_urinull | string
full_domainnull | string
namenull | string
is_activenull | boolean
week_start_daynull | string
wants_timestamp_timersnull | boolean
time_formatnull | string
date_formatnull | string
plan_typenull | string
clocknull | string
currency_code_displaynull | string
currency_symbol_displaynull | string
decimal_symbolnull | string
thousands_separatornull | string
color_schemenull | string
weekly_capacitynull | integer
expense_featurenull | boolean
invoice_featurenull | boolean
estimate_featurenull | boolean
approval_featurenull | boolean
team_featurenull | boolean
currencynull | string
saml_sign_in_requirednull | boolean
day_entry_notes_requirednull | boolean

Search and filter company records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.company.search(
query={"filter": {"eq": {"base_uri": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "company",
"action": "search",
"params": {
"query": {"filter": {"eq": {"base_uri": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
base_uristringThe base URI
currencystringCurrency used by the company
full_domainstringThe full domain name
is_activebooleanWhether the company is active
namestringThe name of the company
plan_typestringThe plan type
weekly_capacityintegerWeekly capacity in seconds
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].base_uristringThe base URI
data[].currencystringCurrency used by the company
data[].full_domainstringThe full domain name
data[].is_activebooleanWhether the company is active
data[].namestringThe name of the company
data[].plan_typestringThe plan type
data[].weekly_capacityintegerWeekly capacity in seconds

Projects

Projects List

Returns a paginated list of projects

Python SDK

await harvest.projects.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "projects",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
codenull | string
is_activenull | boolean
is_billablenull | boolean
is_fixed_feenull | boolean
bill_bynull | string
hourly_ratenull | number
budget_bynull | string
budget_is_monthlynull | boolean
budgetnull | number
cost_budgetnull | number
cost_budget_include_expensesnull | boolean
notify_when_over_budgetnull | boolean
over_budget_notification_percentagenull | number
over_budget_notification_datenull | string
show_budget_to_allnull | boolean
feenull | number
notesnull | string
starts_onnull | string
ends_onnull | string
created_atnull | string
updated_atnull | string
clientnull | object

Meta

Field NameTypeDescription
next_linknull | string

Projects Get

Get a single project by ID

Python SDK

await harvest.projects.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "projects",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesProject ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
codenull | string
is_activenull | boolean
is_billablenull | boolean
is_fixed_feenull | boolean
bill_bynull | string
hourly_ratenull | number
budget_bynull | string
budget_is_monthlynull | boolean
budgetnull | number
cost_budgetnull | number
cost_budget_include_expensesnull | boolean
notify_when_over_budgetnull | boolean
over_budget_notification_percentagenull | number
over_budget_notification_datenull | string
show_budget_to_allnull | boolean
feenull | number
notesnull | string
starts_onnull | string
ends_onnull | string
created_atnull | string
updated_atnull | string
clientnull | object

Search and filter projects records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.projects.search(
query={"filter": {"eq": {"budget": 0.0}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "projects",
"action": "search",
"params": {
"query": {"filter": {"eq": {"budget": 0.0}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
budgetnumberBudget amount
clientobjectClient details
codestringProject code
created_atstringWhen created
hourly_ratenumberHourly rate
idintegerUnique identifier
is_activebooleanWhether active
is_billablebooleanWhether billable
namestringProject name
starts_onstringStart date
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].budgetnumberBudget amount
data[].clientobjectClient details
data[].codestringProject code
data[].created_atstringWhen created
data[].hourly_ratenumberHourly rate
data[].idintegerUnique identifier
data[].is_activebooleanWhether active
data[].is_billablebooleanWhether billable
data[].namestringProject name
data[].starts_onstringStart date
data[].updated_atstringWhen last updated

Tasks

Tasks List

Returns a paginated list of tasks

Python SDK

await harvest.tasks.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "tasks",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
billable_by_defaultnull | boolean
default_hourly_ratenull | number
is_defaultnull | boolean
is_activenull | boolean
created_atnull | string
updated_atnull | string

Meta

Field NameTypeDescription
next_linknull | string

Tasks Get

Get a single task by ID

Python SDK

await harvest.tasks.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "tasks",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesTask ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
billable_by_defaultnull | boolean
default_hourly_ratenull | number
is_defaultnull | boolean
is_activenull | boolean
created_atnull | string
updated_atnull | string

Search and filter tasks records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.tasks.search(
query={"filter": {"eq": {"billable_by_default": True}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "tasks",
"action": "search",
"params": {
"query": {"filter": {"eq": {"billable_by_default": True}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
billable_by_defaultbooleanWhether billable by default
created_atstringWhen created
default_hourly_ratenumberDefault hourly rate
idintegerUnique identifier
is_activebooleanWhether active
namestringTask name
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].billable_by_defaultbooleanWhether billable by default
data[].created_atstringWhen created
data[].default_hourly_ratenumberDefault hourly rate
data[].idintegerUnique identifier
data[].is_activebooleanWhether active
data[].namestringTask name
data[].updated_atstringWhen last updated

Time Entries

Time Entries List

Returns a paginated list of time entries

Python SDK

await harvest.time_entries.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_entries",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
spent_datenull | string
hoursnull | number
hours_without_timernull | number
rounded_hoursnull | number
notesnull | string
is_lockednull | boolean
locked_reasonnull | string
is_closednull | boolean
is_billednull | boolean
timer_started_atnull | string
started_timenull | string
ended_timenull | string
is_runningnull | boolean
billablenull | boolean
budgetednull | boolean
billable_ratenull | number
cost_ratenull | number
created_atnull | string
updated_atnull | string
approval_statusnull | string
is_explicitly_lockednull | boolean
usernull | object
clientnull | object
projectnull | object
tasknull | object
user_assignmentnull | object
task_assignmentnull | object
external_referencenull | object
invoicenull | object

Meta

Field NameTypeDescription
next_linknull | string

Time Entries Get

Get a single time entry by ID

Python SDK

await harvest.time_entries.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_entries",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesTime entry ID
Response Schema

Records

Field NameTypeDescription
idinteger
spent_datenull | string
hoursnull | number
hours_without_timernull | number
rounded_hoursnull | number
notesnull | string
is_lockednull | boolean
locked_reasonnull | string
is_closednull | boolean
is_billednull | boolean
timer_started_atnull | string
started_timenull | string
ended_timenull | string
is_runningnull | boolean
billablenull | boolean
budgetednull | boolean
billable_ratenull | number
cost_ratenull | number
created_atnull | string
updated_atnull | string
approval_statusnull | string
is_explicitly_lockednull | boolean
usernull | object
clientnull | object
projectnull | object
tasknull | object
user_assignmentnull | object
task_assignmentnull | object
external_referencenull | object
invoicenull | object

Search and filter time entries records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.time_entries.search(
query={"filter": {"eq": {"billable": True}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_entries",
"action": "search",
"params": {
"query": {"filter": {"eq": {"billable": True}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
billablebooleanWhether billable
clientobjectAssociated client
created_atstringWhen created
hoursnumberHours logged
idintegerUnique identifier
is_billedbooleanWhether billed
notesstringNotes
projectobjectAssociated project
spent_datestringDate time was spent
taskobjectAssociated task
updated_atstringWhen last updated
userobjectAssociated user
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].billablebooleanWhether billable
data[].clientobjectAssociated client
data[].created_atstringWhen created
data[].hoursnumberHours logged
data[].idintegerUnique identifier
data[].is_billedbooleanWhether billed
data[].notesstringNotes
data[].projectobjectAssociated project
data[].spent_datestringDate time was spent
data[].taskobjectAssociated task
data[].updated_atstringWhen last updated
data[].userobjectAssociated user

Invoices

Invoices List

Returns a paginated list of invoices

Python SDK

await harvest.invoices.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "invoices",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
client_keynull | string
numbernull | string
purchase_ordernull | string
amountnull | number
due_amountnull | number
taxnull | number
tax_amountnull | number
tax2null | number
tax2_amountnull | number
discountnull | number
discount_amountnull | number
subjectnull | string
notesnull | string
currencynull | string
statenull | string
period_startnull | string
period_endnull | string
issue_datenull | string
due_datenull | string
payment_termnull | string
payment_optionsnull | array
sent_atnull | string
paid_atnull | string
paid_datenull | string
closed_atnull | string
recurring_invoice_idnull | integer
created_atnull | string
updated_atnull | string
clientnull | object
estimatenull | object
retainernull | object
creatornull | object
line_itemsnull | array

Meta

Field NameTypeDescription
next_linknull | string

Invoices Get

Get a single invoice by ID

Python SDK

await harvest.invoices.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "invoices",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesInvoice ID
Response Schema

Records

Field NameTypeDescription
idinteger
client_keynull | string
numbernull | string
purchase_ordernull | string
amountnull | number
due_amountnull | number
taxnull | number
tax_amountnull | number
tax2null | number
tax2_amountnull | number
discountnull | number
discount_amountnull | number
subjectnull | string
notesnull | string
currencynull | string
statenull | string
period_startnull | string
period_endnull | string
issue_datenull | string
due_datenull | string
payment_termnull | string
payment_optionsnull | array
sent_atnull | string
paid_atnull | string
paid_datenull | string
closed_atnull | string
recurring_invoice_idnull | integer
created_atnull | string
updated_atnull | string
clientnull | object
estimatenull | object
retainernull | object
creatornull | object
line_itemsnull | array

Search and filter invoices records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.invoices.search(
query={"filter": {"eq": {"amount": 0.0}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "invoices",
"action": "search",
"params": {
"query": {"filter": {"eq": {"amount": 0.0}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
amountnumberTotal amount
clientobjectClient details
created_atstringWhen created
currencystringCurrency
due_amountnumberAmount due
due_datestringDue date
idintegerUnique identifier
issue_datestringIssue date
numberstringInvoice number
statestringCurrent state
subjectstringSubject
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].amountnumberTotal amount
data[].clientobjectClient details
data[].created_atstringWhen created
data[].currencystringCurrency
data[].due_amountnumberAmount due
data[].due_datestringDue date
data[].idintegerUnique identifier
data[].issue_datestringIssue date
data[].numberstringInvoice number
data[].statestringCurrent state
data[].subjectstringSubject
data[].updated_atstringWhen last updated

Invoice Item Categories

Invoice Item Categories List

Returns a paginated list of invoice item categories

Python SDK

await harvest.invoice_item_categories.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "invoice_item_categories",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
use_as_servicenull | boolean
use_as_expensenull | boolean
created_atnull | string
updated_atnull | string

Meta

Field NameTypeDescription
next_linknull | string

Invoice Item Categories Get

Get a single invoice item category by ID

Python SDK

await harvest.invoice_item_categories.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "invoice_item_categories",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesInvoice item category ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
use_as_servicenull | boolean
use_as_expensenull | boolean
created_atnull | string
updated_atnull | string

Search and filter invoice item categories records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.invoice_item_categories.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "invoice_item_categories",
"action": "search",
"params": {
"query": {"filter": {"eq": {"created_at": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
created_atstringWhen created
idintegerUnique identifier
namestringCategory name
updated_atstringWhen last updated
use_as_expensebooleanWhether used as expense type
use_as_servicebooleanWhether used as service type
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].created_atstringWhen created
data[].idintegerUnique identifier
data[].namestringCategory name
data[].updated_atstringWhen last updated
data[].use_as_expensebooleanWhether used as expense type
data[].use_as_servicebooleanWhether used as service type

Estimates

Estimates List

Returns a paginated list of estimates

Python SDK

await harvest.estimates.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "estimates",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
client_keynull | string
numbernull | string
purchase_ordernull | string
amountnull | number
taxnull | number
tax_amountnull | number
tax2null | number
tax2_amountnull | number
discountnull | number
discount_amountnull | number
subjectnull | string
notesnull | string
currencynull | string
statenull | string
issue_datenull | string
sent_atnull | string
accepted_atnull | string
declined_atnull | string
created_atnull | string
updated_atnull | string
clientnull | object
creatornull | object
line_itemsnull | array

Meta

Field NameTypeDescription
next_linknull | string

Estimates Get

Get a single estimate by ID

Python SDK

await harvest.estimates.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "estimates",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesEstimate ID
Response Schema

Records

Field NameTypeDescription
idinteger
client_keynull | string
numbernull | string
purchase_ordernull | string
amountnull | number
taxnull | number
tax_amountnull | number
tax2null | number
tax2_amountnull | number
discountnull | number
discount_amountnull | number
subjectnull | string
notesnull | string
currencynull | string
statenull | string
issue_datenull | string
sent_atnull | string
accepted_atnull | string
declined_atnull | string
created_atnull | string
updated_atnull | string
clientnull | object
creatornull | object
line_itemsnull | array

Search and filter estimates records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.estimates.search(
query={"filter": {"eq": {"amount": 0.0}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "estimates",
"action": "search",
"params": {
"query": {"filter": {"eq": {"amount": 0.0}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
amountnumberTotal amount
clientobjectClient details
created_atstringWhen created
currencystringCurrency
idintegerUnique identifier
issue_datestringIssue date
numberstringEstimate number
statestringCurrent state
subjectstringSubject
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].amountnumberTotal amount
data[].clientobjectClient details
data[].created_atstringWhen created
data[].currencystringCurrency
data[].idintegerUnique identifier
data[].issue_datestringIssue date
data[].numberstringEstimate number
data[].statestringCurrent state
data[].subjectstringSubject
data[].updated_atstringWhen last updated

Estimate Item Categories

Estimate Item Categories List

Returns a paginated list of estimate item categories

Python SDK

await harvest.estimate_item_categories.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "estimate_item_categories",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
created_atnull | string
updated_atnull | string

Meta

Field NameTypeDescription
next_linknull | string

Estimate Item Categories Get

Get a single estimate item category by ID

Python SDK

await harvest.estimate_item_categories.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "estimate_item_categories",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesEstimate item category ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
created_atnull | string
updated_atnull | string

Search and filter estimate item categories records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.estimate_item_categories.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "estimate_item_categories",
"action": "search",
"params": {
"query": {"filter": {"eq": {"created_at": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
created_atstringWhen created
idintegerUnique identifier
namestringCategory name
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].created_atstringWhen created
data[].idintegerUnique identifier
data[].namestringCategory name
data[].updated_atstringWhen last updated

Expenses

Expenses List

Returns a paginated list of expenses

Python SDK

await harvest.expenses.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "expenses",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
notesnull | string
total_costnull | number
unitsnull | number
is_closednull | boolean
is_lockednull | boolean
is_billednull | boolean
locked_reasonnull | string
spent_datenull | string
created_atnull | string
updated_atnull | string
billablenull | boolean
approval_statusnull | string
is_explicitly_lockednull | boolean
receiptnull | object
usernull | object
user_assignmentnull | object
projectnull | object
expense_categorynull | object
clientnull | object
invoicenull | object

Meta

Field NameTypeDescription
next_linknull | string

Expenses Get

Get a single expense by ID

Python SDK

await harvest.expenses.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "expenses",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesExpense ID
Response Schema

Records

Field NameTypeDescription
idinteger
notesnull | string
total_costnull | number
unitsnull | number
is_closednull | boolean
is_lockednull | boolean
is_billednull | boolean
locked_reasonnull | string
spent_datenull | string
created_atnull | string
updated_atnull | string
billablenull | boolean
approval_statusnull | string
is_explicitly_lockednull | boolean
receiptnull | object
usernull | object
user_assignmentnull | object
projectnull | object
expense_categorynull | object
clientnull | object
invoicenull | object

Search and filter expenses records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.expenses.search(
query={"filter": {"eq": {"billable": True}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "expenses",
"action": "search",
"params": {
"query": {"filter": {"eq": {"billable": True}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
billablebooleanWhether billable
clientobjectAssociated client
created_atstringWhen created
expense_categoryobjectExpense category
idintegerUnique identifier
is_billedbooleanWhether billed
notesstringNotes
projectobjectAssociated project
spent_datestringDate spent
total_costnumberTotal cost
updated_atstringWhen last updated
userobjectAssociated user
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].billablebooleanWhether billable
data[].clientobjectAssociated client
data[].created_atstringWhen created
data[].expense_categoryobjectExpense category
data[].idintegerUnique identifier
data[].is_billedbooleanWhether billed
data[].notesstringNotes
data[].projectobjectAssociated project
data[].spent_datestringDate spent
data[].total_costnumberTotal cost
data[].updated_atstringWhen last updated
data[].userobjectAssociated user

Expense Categories

Expense Categories List

Returns a paginated list of expense categories

Python SDK

await harvest.expense_categories.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "expense_categories",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
unit_namenull | string
unit_pricenull | number
is_activenull | boolean
created_atnull | string
updated_atnull | string

Meta

Field NameTypeDescription
next_linknull | string

Expense Categories Get

Get a single expense category by ID

Python SDK

await harvest.expense_categories.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "expense_categories",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesExpense category ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
unit_namenull | string
unit_pricenull | number
is_activenull | boolean
created_atnull | string
updated_atnull | string

Search and filter expense categories records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.expense_categories.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "expense_categories",
"action": "search",
"params": {
"query": {"filter": {"eq": {"created_at": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
created_atstringWhen created
idintegerUnique identifier
is_activebooleanWhether active
namestringCategory name
unit_namestringUnit name
unit_pricenumberUnit price
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].created_atstringWhen created
data[].idintegerUnique identifier
data[].is_activebooleanWhether active
data[].namestringCategory name
data[].unit_namestringUnit name
data[].unit_pricenumberUnit price
data[].updated_atstringWhen last updated

Roles

Roles List

Returns a paginated list of roles

Python SDK

await harvest.roles.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "roles",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
user_idsnull | array
created_atnull | string
updated_atnull | string

Meta

Field NameTypeDescription
next_linknull | string

Roles Get

Get a single role by ID

Python SDK

await harvest.roles.get(
id=0
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "roles",
"action": "get",
"params": {
"id": 0
}
}'

Parameters

Parameter NameTypeRequiredDescription
idintegerYesRole ID
Response Schema

Records

Field NameTypeDescription
idinteger
namenull | string
user_idsnull | array
created_atnull | string
updated_atnull | string

Search and filter roles records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.roles.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "roles",
"action": "search",
"params": {
"query": {"filter": {"eq": {"created_at": "<str>"}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
created_atstringWhen created
idintegerUnique identifier
namestringRole name
updated_atstringWhen last updated
user_idsarrayUser IDs with this role
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].created_atstringWhen created
data[].idintegerUnique identifier
data[].namestringRole name
data[].updated_atstringWhen last updated
data[].user_idsarrayUser IDs with this role

User Assignments

User Assignments List

Returns a paginated list of user assignments across all projects

Python SDK

await harvest.user_assignments.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "user_assignments",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
is_project_managernull | boolean
is_activenull | boolean
budgetnull | number
created_atnull | string
updated_atnull | string
hourly_ratenull | number
use_default_ratesnull | boolean
projectnull | object
usernull | object

Meta

Field NameTypeDescription
next_linknull | string

Search and filter user assignments records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.user_assignments.search(
query={"filter": {"eq": {"budget": 0.0}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "user_assignments",
"action": "search",
"params": {
"query": {"filter": {"eq": {"budget": 0.0}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
budgetnumberBudget
created_atstringWhen created
hourly_ratenumberHourly rate
idintegerUnique identifier
is_activebooleanWhether active
is_project_managerbooleanWhether project manager
projectobjectAssociated project
updated_atstringWhen last updated
userobjectAssociated user
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].budgetnumberBudget
data[].created_atstringWhen created
data[].hourly_ratenumberHourly rate
data[].idintegerUnique identifier
data[].is_activebooleanWhether active
data[].is_project_managerbooleanWhether project manager
data[].projectobjectAssociated project
data[].updated_atstringWhen last updated
data[].userobjectAssociated user

Task Assignments

Task Assignments List

Returns a paginated list of task assignments across all projects

Python SDK

await harvest.task_assignments.list()

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "task_assignments",
"action": "list"
}'

Parameters

Parameter NameTypeRequiredDescription
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
idinteger
billablenull | boolean
is_activenull | boolean
created_atnull | string
updated_atnull | string
hourly_ratenull | number
budgetnull | number
projectnull | object
tasknull | object

Meta

Field NameTypeDescription
next_linknull | string

Search and filter task assignments records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.task_assignments.search(
query={"filter": {"eq": {"billable": True}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "task_assignments",
"action": "search",
"params": {
"query": {"filter": {"eq": {"billable": True}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
billablebooleanWhether billable
created_atstringWhen created
hourly_ratenumberHourly rate
idintegerUnique identifier
is_activebooleanWhether active
projectobjectAssociated project
taskobjectAssociated task
updated_atstringWhen last updated
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].billablebooleanWhether billable
data[].created_atstringWhen created
data[].hourly_ratenumberHourly rate
data[].idintegerUnique identifier
data[].is_activebooleanWhether active
data[].projectobjectAssociated project
data[].taskobjectAssociated task
data[].updated_atstringWhen last updated

Time Projects

Time Projects List

Returns time report data grouped by project for a given date range

Python SDK

await harvest.time_projects.list(
from_="<str>",
to="<str>"
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_projects",
"action": "list",
"params": {
"from": "<str>",
"to": "<str>"
}
}'

Parameters

Parameter NameTypeRequiredDescription
fromstringYesStart date for the report in YYYYMMDD format
tostringYesEnd date for the report in YYYYMMDD format
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
project_idnull | integer
project_namenull | string
client_idnull | integer
client_namenull | string
total_hoursnull | number
billable_hoursnull | number
currencynull | string
billable_amountnull | number

Meta

Field NameTypeDescription
next_linknull | string

Search and filter time projects records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.time_projects.search(
query={"filter": {"eq": {"billable_amount": 0.0}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_projects",
"action": "search",
"params": {
"query": {"filter": {"eq": {"billable_amount": 0.0}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
billable_amountnumberTotal billable amount
billable_hoursnumberNumber of billable hours
client_idintegerClient identifier
client_namestringClient name
currencystringCurrency code
project_idintegerProject identifier
project_namestringProject name
total_hoursnumberTotal hours spent
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].billable_amountnumberTotal billable amount
data[].billable_hoursnumberNumber of billable hours
data[].client_idintegerClient identifier
data[].client_namestringClient name
data[].currencystringCurrency code
data[].project_idintegerProject identifier
data[].project_namestringProject name
data[].total_hoursnumberTotal hours spent

Time Tasks

Time Tasks List

Returns time report data grouped by task for a given date range

Python SDK

await harvest.time_tasks.list(
from_="<str>",
to="<str>"
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_tasks",
"action": "list",
"params": {
"from": "<str>",
"to": "<str>"
}
}'

Parameters

Parameter NameTypeRequiredDescription
fromstringYesStart date for the report in YYYYMMDD format
tostringYesEnd date for the report in YYYYMMDD format
per_pageintegerNoNumber of records per page (max 2000)
Response Schema

Records

Field NameTypeDescription
task_idnull | integer
task_namenull | string
total_hoursnull | number
billable_hoursnull | number
currencynull | string
billable_amountnull | number

Meta

Field NameTypeDescription
next_linknull | string

Search and filter time tasks records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.

Python SDK

await harvest.time_tasks.search(
query={"filter": {"eq": {"billable_amount": 0.0}}}
)

API

curl --location 'https://api.airbyte.ai/api/v1/integrations/connectors/{your_connector_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {your_auth_token}' \
--data '{
"entity": "time_tasks",
"action": "search",
"params": {
"query": {"filter": {"eq": {"billable_amount": 0.0}}}
}
}'

Parameters

Parameter NameTypeRequiredDescription
queryobjectYesFilter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or
query.filterobjectNoFilter conditions
query.sortarrayNoSort conditions
limitintegerNoMaximum results to return (default 1000)
cursorstringNoPagination cursor from previous response's meta.cursor
fieldsarrayNoField paths to include in results

Searchable Fields

Field NameTypeDescription
billable_amountnumberTotal billable amount
billable_hoursnumberNumber of billable hours
currencystringCurrency code
task_idintegerTask identifier
task_namestringTask name
total_hoursnumberTotal hours spent
Response Schema
Field NameTypeDescription
dataarrayList of matching records
metaobjectPagination metadata
meta.has_morebooleanWhether additional pages are available
meta.cursorstring | nullCursor for next page of results
meta.took_msnumber | nullQuery execution time in milliseconds
data[].billable_amountnumberTotal billable amount
data[].billable_hoursnumberNumber of billable hours
data[].currencystringCurrency code
data[].task_idintegerTask identifier
data[].task_namestringTask name
data[].total_hoursnumberTotal hours spent