docs/ai-agents/connectors/harvest/REFERENCE.md
This is the full reference documentation for the Harvest agent connector.
The Harvest connector supports the following entities and actions.
| Entity | Actions |
|---|---|
| Users | List, Get, Search |
| Clients | List, Get, Search |
| Contacts | List, Get, Search |
| Company | Get, Search |
| Projects | List, Get, Search |
| Tasks | List, Get, Search |
| Time Entries | List, Get, Search |
| Invoices | List, Get, Search |
| Invoice Item Categories | List, Get, Search |
| Estimates | List, Get, Search |
| Estimate Item Categories | List, Get, Search |
| Expenses | List, Get, Search |
| Expense Categories | List, Get, Search |
| Roles | List, Get, Search |
| User Assignments | List, Search |
| Task Assignments | List, Search |
| Time Projects | List, Search |
| Time Tasks | List, Search |
Returns a paginated list of users in the Harvest account
await harvest.users.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
first_name | null | string | |
last_name | null | string | |
email | null | string | |
telephone | null | string | |
timezone | null | string | |
has_access_to_all_future_projects | null | boolean | |
is_contractor | null | boolean | |
is_active | null | boolean | |
weekly_capacity | null | integer | |
default_hourly_rate | null | number | |
cost_rate | null | number | |
roles | null | array | |
access_roles | null | array | |
avatar_url | null | string | |
created_at | null | string | |
updated_at | null | string | |
employee_id | null | string | |
calendar_integration_enabled | null | boolean | |
calendar_integration_source | null | string | |
can_create_projects | null | boolean | |
permissions_claims | null | array |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single user by ID
await harvest.users.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | User ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
first_name | null | string | |
last_name | null | string | |
email | null | string | |
telephone | null | string | |
timezone | null | string | |
has_access_to_all_future_projects | null | boolean | |
is_contractor | null | boolean | |
is_active | null | boolean | |
weekly_capacity | null | integer | |
default_hourly_rate | null | number | |
cost_rate | null | number | |
roles | null | array | |
access_roles | null | array | |
avatar_url | null | string | |
created_at | null | string | |
updated_at | null | string | |
employee_id | null | string | |
calendar_integration_enabled | null | boolean | |
calendar_integration_source | null | string | |
can_create_projects | null | boolean | |
permissions_claims | null | 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.
await harvest.users.search(
query={"filter": {"eq": {"avatar_url": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
avatar_url | string | Avatar URL |
cost_rate | number | Cost rate |
created_at | string | When created |
default_hourly_rate | number | Default hourly rate |
email | string | Email address |
first_name | string | First name |
id | integer | Unique identifier |
is_active | boolean | Whether active |
is_contractor | boolean | Whether contractor |
last_name | string | Last name |
roles | array | Assigned roles |
telephone | string | Phone number |
timezone | string | Timezone |
updated_at | string | When last updated |
weekly_capacity | integer | Weekly capacity in seconds |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].avatar_url | string | Avatar URL |
data[].cost_rate | number | Cost rate |
data[].created_at | string | When created |
data[].default_hourly_rate | number | Default hourly rate |
data[].email | string | Email address |
data[].first_name | string | First name |
data[].id | integer | Unique identifier |
data[].is_active | boolean | Whether active |
data[].is_contractor | boolean | Whether contractor |
data[].last_name | string | Last name |
data[].roles | array | Assigned roles |
data[].telephone | string | Phone number |
data[].timezone | string | Timezone |
data[].updated_at | string | When last updated |
data[].weekly_capacity | integer | Weekly capacity in seconds |
Returns a paginated list of clients
await harvest.clients.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
is_active | null | boolean | |
address | null | string | |
statement_key | null | string | |
currency | null | string | |
created_at | null | string | |
updated_at | null | string |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single client by ID
await harvest.clients.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Client ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
is_active | null | boolean | |
address | null | string | |
statement_key | null | string | |
currency | null | string | |
created_at | null | string | |
updated_at | null | 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.
await harvest.clients.search(
query={"filter": {"eq": {"address": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
address | string | The client's postal address |
created_at | string | When the client record was created |
currency | string | The currency used by the client |
id | integer | Unique identifier for the client |
is_active | boolean | Whether the client is active |
name | string | The client's name |
updated_at | string | When the client record was last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].address | string | The client's postal address |
data[].created_at | string | When the client record was created |
data[].currency | string | The currency used by the client |
data[].id | integer | Unique identifier for the client |
data[].is_active | boolean | Whether the client is active |
data[].name | string | The client's name |
data[].updated_at | string | When the client record was last updated |
Returns a paginated list of contacts
await harvest.contacts.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
title | null | string | |
first_name | null | string | |
last_name | null | string | |
email | null | string | |
phone_office | null | string | |
phone_mobile | null | string | |
fax | null | string | |
created_at | null | string | |
updated_at | null | string | |
client | null | object |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single contact by ID
await harvest.contacts.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Contact ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
title | null | string | |
first_name | null | string | |
last_name | null | string | |
email | null | string | |
phone_office | null | string | |
phone_mobile | null | string | |
fax | null | string | |
created_at | null | string | |
updated_at | null | string | |
client | null | 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.
await harvest.contacts.search(
query={"filter": {"eq": {"client": {}}}}
)
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": {}}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
client | object | Client associated with the contact |
created_at | string | When created |
email | string | Email address |
first_name | string | First name |
id | integer | Unique identifier |
last_name | string | Last name |
title | string | Job title |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].client | object | Client associated with the contact |
data[].created_at | string | When created |
data[].email | string | Email address |
data[].first_name | string | First name |
data[].id | integer | Unique identifier |
data[].last_name | string | Last name |
data[].title | string | Job title |
data[].updated_at | string | When last updated |
Returns the company information for the authenticated account
await harvest.company.get()
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"
}'
| Field Name | Type | Description |
|---|---|---|
base_uri | null | string | |
full_domain | null | string | |
name | null | string | |
is_active | null | boolean | |
week_start_day | null | string | |
wants_timestamp_timers | null | boolean | |
time_format | null | string | |
date_format | null | string | |
plan_type | null | string | |
clock | null | string | |
currency_code_display | null | string | |
currency_symbol_display | null | string | |
decimal_symbol | null | string | |
thousands_separator | null | string | |
color_scheme | null | string | |
weekly_capacity | null | integer | |
expense_feature | null | boolean | |
invoice_feature | null | boolean | |
estimate_feature | null | boolean | |
approval_feature | null | boolean | |
team_feature | null | boolean | |
currency | null | string | |
saml_sign_in_required | null | boolean | |
day_entry_notes_required | null | 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.
await harvest.company.search(
query={"filter": {"eq": {"base_uri": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
base_uri | string | The base URI |
currency | string | Currency used by the company |
full_domain | string | The full domain name |
is_active | boolean | Whether the company is active |
name | string | The name of the company |
plan_type | string | The plan type |
weekly_capacity | integer | Weekly capacity in seconds |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].base_uri | string | The base URI |
data[].currency | string | Currency used by the company |
data[].full_domain | string | The full domain name |
data[].is_active | boolean | Whether the company is active |
data[].name | string | The name of the company |
data[].plan_type | string | The plan type |
data[].weekly_capacity | integer | Weekly capacity in seconds |
Returns a paginated list of projects
await harvest.projects.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
code | null | string | |
is_active | null | boolean | |
is_billable | null | boolean | |
is_fixed_fee | null | boolean | |
bill_by | null | string | |
hourly_rate | null | number | |
budget_by | null | string | |
budget_is_monthly | null | boolean | |
budget | null | number | |
cost_budget | null | number | |
cost_budget_include_expenses | null | boolean | |
notify_when_over_budget | null | boolean | |
over_budget_notification_percentage | null | number | |
over_budget_notification_date | null | string | |
show_budget_to_all | null | boolean | |
fee | null | number | |
notes | null | string | |
starts_on | null | string | |
ends_on | null | string | |
created_at | null | string | |
updated_at | null | string | |
client | null | object |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single project by ID
await harvest.projects.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Project ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
code | null | string | |
is_active | null | boolean | |
is_billable | null | boolean | |
is_fixed_fee | null | boolean | |
bill_by | null | string | |
hourly_rate | null | number | |
budget_by | null | string | |
budget_is_monthly | null | boolean | |
budget | null | number | |
cost_budget | null | number | |
cost_budget_include_expenses | null | boolean | |
notify_when_over_budget | null | boolean | |
over_budget_notification_percentage | null | number | |
over_budget_notification_date | null | string | |
show_budget_to_all | null | boolean | |
fee | null | number | |
notes | null | string | |
starts_on | null | string | |
ends_on | null | string | |
created_at | null | string | |
updated_at | null | string | |
client | null | 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.
await harvest.projects.search(
query={"filter": {"eq": {"budget": 0.0}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
budget | number | Budget amount |
client | object | Client details |
code | string | Project code |
created_at | string | When created |
hourly_rate | number | Hourly rate |
id | integer | Unique identifier |
is_active | boolean | Whether active |
is_billable | boolean | Whether billable |
name | string | Project name |
starts_on | string | Start date |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].budget | number | Budget amount |
data[].client | object | Client details |
data[].code | string | Project code |
data[].created_at | string | When created |
data[].hourly_rate | number | Hourly rate |
data[].id | integer | Unique identifier |
data[].is_active | boolean | Whether active |
data[].is_billable | boolean | Whether billable |
data[].name | string | Project name |
data[].starts_on | string | Start date |
data[].updated_at | string | When last updated |
Returns a paginated list of tasks
await harvest.tasks.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
billable_by_default | null | boolean | |
default_hourly_rate | null | number | |
is_default | null | boolean | |
is_active | null | boolean | |
created_at | null | string | |
updated_at | null | string |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single task by ID
await harvest.tasks.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Task ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
billable_by_default | null | boolean | |
default_hourly_rate | null | number | |
is_default | null | boolean | |
is_active | null | boolean | |
created_at | null | string | |
updated_at | null | 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.
await harvest.tasks.search(
query={"filter": {"eq": {"billable_by_default": True}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
billable_by_default | boolean | Whether billable by default |
created_at | string | When created |
default_hourly_rate | number | Default hourly rate |
id | integer | Unique identifier |
is_active | boolean | Whether active |
name | string | Task name |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].billable_by_default | boolean | Whether billable by default |
data[].created_at | string | When created |
data[].default_hourly_rate | number | Default hourly rate |
data[].id | integer | Unique identifier |
data[].is_active | boolean | Whether active |
data[].name | string | Task name |
data[].updated_at | string | When last updated |
Returns a paginated list of time entries
await harvest.time_entries.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
spent_date | null | string | |
hours | null | number | |
hours_without_timer | null | number | |
rounded_hours | null | number | |
notes | null | string | |
is_locked | null | boolean | |
locked_reason | null | string | |
is_closed | null | boolean | |
is_billed | null | boolean | |
timer_started_at | null | string | |
started_time | null | string | |
ended_time | null | string | |
is_running | null | boolean | |
billable | null | boolean | |
budgeted | null | boolean | |
billable_rate | null | number | |
cost_rate | null | number | |
created_at | null | string | |
updated_at | null | string | |
approval_status | null | string | |
is_explicitly_locked | null | boolean | |
user | null | object | |
client | null | object | |
project | null | object | |
task | null | object | |
user_assignment | null | object | |
task_assignment | null | object | |
external_reference | null | object | |
invoice | null | object |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single time entry by ID
await harvest.time_entries.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Time entry ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
spent_date | null | string | |
hours | null | number | |
hours_without_timer | null | number | |
rounded_hours | null | number | |
notes | null | string | |
is_locked | null | boolean | |
locked_reason | null | string | |
is_closed | null | boolean | |
is_billed | null | boolean | |
timer_started_at | null | string | |
started_time | null | string | |
ended_time | null | string | |
is_running | null | boolean | |
billable | null | boolean | |
budgeted | null | boolean | |
billable_rate | null | number | |
cost_rate | null | number | |
created_at | null | string | |
updated_at | null | string | |
approval_status | null | string | |
is_explicitly_locked | null | boolean | |
user | null | object | |
client | null | object | |
project | null | object | |
task | null | object | |
user_assignment | null | object | |
task_assignment | null | object | |
external_reference | null | object | |
invoice | null | 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.
await harvest.time_entries.search(
query={"filter": {"eq": {"billable": True}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
billable | boolean | Whether billable |
client | object | Associated client |
created_at | string | When created |
hours | number | Hours logged |
id | integer | Unique identifier |
is_billed | boolean | Whether billed |
notes | string | Notes |
project | object | Associated project |
spent_date | string | Date time was spent |
task | object | Associated task |
updated_at | string | When last updated |
user | object | Associated user |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].billable | boolean | Whether billable |
data[].client | object | Associated client |
data[].created_at | string | When created |
data[].hours | number | Hours logged |
data[].id | integer | Unique identifier |
data[].is_billed | boolean | Whether billed |
data[].notes | string | Notes |
data[].project | object | Associated project |
data[].spent_date | string | Date time was spent |
data[].task | object | Associated task |
data[].updated_at | string | When last updated |
data[].user | object | Associated user |
Returns a paginated list of invoices
await harvest.invoices.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
client_key | null | string | |
number | null | string | |
purchase_order | null | string | |
amount | null | number | |
due_amount | null | number | |
tax | null | number | |
tax_amount | null | number | |
tax2 | null | number | |
tax2_amount | null | number | |
discount | null | number | |
discount_amount | null | number | |
subject | null | string | |
notes | null | string | |
currency | null | string | |
state | null | string | |
period_start | null | string | |
period_end | null | string | |
issue_date | null | string | |
due_date | null | string | |
payment_term | null | string | |
payment_options | null | array | |
sent_at | null | string | |
paid_at | null | string | |
paid_date | null | string | |
closed_at | null | string | |
recurring_invoice_id | null | integer | |
created_at | null | string | |
updated_at | null | string | |
client | null | object | |
estimate | null | object | |
retainer | null | object | |
creator | null | object | |
line_items | null | array |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single invoice by ID
await harvest.invoices.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Invoice ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
client_key | null | string | |
number | null | string | |
purchase_order | null | string | |
amount | null | number | |
due_amount | null | number | |
tax | null | number | |
tax_amount | null | number | |
tax2 | null | number | |
tax2_amount | null | number | |
discount | null | number | |
discount_amount | null | number | |
subject | null | string | |
notes | null | string | |
currency | null | string | |
state | null | string | |
period_start | null | string | |
period_end | null | string | |
issue_date | null | string | |
due_date | null | string | |
payment_term | null | string | |
payment_options | null | array | |
sent_at | null | string | |
paid_at | null | string | |
paid_date | null | string | |
closed_at | null | string | |
recurring_invoice_id | null | integer | |
created_at | null | string | |
updated_at | null | string | |
client | null | object | |
estimate | null | object | |
retainer | null | object | |
creator | null | object | |
line_items | null | 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.
await harvest.invoices.search(
query={"filter": {"eq": {"amount": 0.0}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
amount | number | Total amount |
client | object | Client details |
created_at | string | When created |
currency | string | Currency |
due_amount | number | Amount due |
due_date | string | Due date |
id | integer | Unique identifier |
issue_date | string | Issue date |
number | string | Invoice number |
state | string | Current state |
subject | string | Subject |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].amount | number | Total amount |
data[].client | object | Client details |
data[].created_at | string | When created |
data[].currency | string | Currency |
data[].due_amount | number | Amount due |
data[].due_date | string | Due date |
data[].id | integer | Unique identifier |
data[].issue_date | string | Issue date |
data[].number | string | Invoice number |
data[].state | string | Current state |
data[].subject | string | Subject |
data[].updated_at | string | When last updated |
Returns a paginated list of invoice item categories
await harvest.invoice_item_categories.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
use_as_service | null | boolean | |
use_as_expense | null | boolean | |
created_at | null | string | |
updated_at | null | string |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single invoice item category by ID
await harvest.invoice_item_categories.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Invoice item category ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
use_as_service | null | boolean | |
use_as_expense | null | boolean | |
created_at | null | string | |
updated_at | null | 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.
await harvest.invoice_item_categories.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
created_at | string | When created |
id | integer | Unique identifier |
name | string | Category name |
updated_at | string | When last updated |
use_as_expense | boolean | Whether used as expense type |
use_as_service | boolean | Whether used as service type |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].created_at | string | When created |
data[].id | integer | Unique identifier |
data[].name | string | Category name |
data[].updated_at | string | When last updated |
data[].use_as_expense | boolean | Whether used as expense type |
data[].use_as_service | boolean | Whether used as service type |
Returns a paginated list of estimates
await harvest.estimates.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
client_key | null | string | |
number | null | string | |
purchase_order | null | string | |
amount | null | number | |
tax | null | number | |
tax_amount | null | number | |
tax2 | null | number | |
tax2_amount | null | number | |
discount | null | number | |
discount_amount | null | number | |
subject | null | string | |
notes | null | string | |
currency | null | string | |
state | null | string | |
issue_date | null | string | |
sent_at | null | string | |
accepted_at | null | string | |
declined_at | null | string | |
created_at | null | string | |
updated_at | null | string | |
client | null | object | |
creator | null | object | |
line_items | null | array |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single estimate by ID
await harvest.estimates.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Estimate ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
client_key | null | string | |
number | null | string | |
purchase_order | null | string | |
amount | null | number | |
tax | null | number | |
tax_amount | null | number | |
tax2 | null | number | |
tax2_amount | null | number | |
discount | null | number | |
discount_amount | null | number | |
subject | null | string | |
notes | null | string | |
currency | null | string | |
state | null | string | |
issue_date | null | string | |
sent_at | null | string | |
accepted_at | null | string | |
declined_at | null | string | |
created_at | null | string | |
updated_at | null | string | |
client | null | object | |
creator | null | object | |
line_items | null | 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.
await harvest.estimates.search(
query={"filter": {"eq": {"amount": 0.0}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
amount | number | Total amount |
client | object | Client details |
created_at | string | When created |
currency | string | Currency |
id | integer | Unique identifier |
issue_date | string | Issue date |
number | string | Estimate number |
state | string | Current state |
subject | string | Subject |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].amount | number | Total amount |
data[].client | object | Client details |
data[].created_at | string | When created |
data[].currency | string | Currency |
data[].id | integer | Unique identifier |
data[].issue_date | string | Issue date |
data[].number | string | Estimate number |
data[].state | string | Current state |
data[].subject | string | Subject |
data[].updated_at | string | When last updated |
Returns a paginated list of estimate item categories
await harvest.estimate_item_categories.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
created_at | null | string | |
updated_at | null | string |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single estimate item category by ID
await harvest.estimate_item_categories.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Estimate item category ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
created_at | null | string | |
updated_at | null | 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.
await harvest.estimate_item_categories.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
created_at | string | When created |
id | integer | Unique identifier |
name | string | Category name |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].created_at | string | When created |
data[].id | integer | Unique identifier |
data[].name | string | Category name |
data[].updated_at | string | When last updated |
Returns a paginated list of expenses
await harvest.expenses.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
notes | null | string | |
total_cost | null | number | |
units | null | number | |
is_closed | null | boolean | |
is_locked | null | boolean | |
is_billed | null | boolean | |
locked_reason | null | string | |
spent_date | null | string | |
created_at | null | string | |
updated_at | null | string | |
billable | null | boolean | |
approval_status | null | string | |
is_explicitly_locked | null | boolean | |
receipt | null | object | |
user | null | object | |
user_assignment | null | object | |
project | null | object | |
expense_category | null | object | |
client | null | object | |
invoice | null | object |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single expense by ID
await harvest.expenses.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Expense ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
notes | null | string | |
total_cost | null | number | |
units | null | number | |
is_closed | null | boolean | |
is_locked | null | boolean | |
is_billed | null | boolean | |
locked_reason | null | string | |
spent_date | null | string | |
created_at | null | string | |
updated_at | null | string | |
billable | null | boolean | |
approval_status | null | string | |
is_explicitly_locked | null | boolean | |
receipt | null | object | |
user | null | object | |
user_assignment | null | object | |
project | null | object | |
expense_category | null | object | |
client | null | object | |
invoice | null | 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.
await harvest.expenses.search(
query={"filter": {"eq": {"billable": True}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
billable | boolean | Whether billable |
client | object | Associated client |
created_at | string | When created |
expense_category | object | Expense category |
id | integer | Unique identifier |
is_billed | boolean | Whether billed |
notes | string | Notes |
project | object | Associated project |
spent_date | string | Date spent |
total_cost | number | Total cost |
updated_at | string | When last updated |
user | object | Associated user |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].billable | boolean | Whether billable |
data[].client | object | Associated client |
data[].created_at | string | When created |
data[].expense_category | object | Expense category |
data[].id | integer | Unique identifier |
data[].is_billed | boolean | Whether billed |
data[].notes | string | Notes |
data[].project | object | Associated project |
data[].spent_date | string | Date spent |
data[].total_cost | number | Total cost |
data[].updated_at | string | When last updated |
data[].user | object | Associated user |
Returns a paginated list of expense categories
await harvest.expense_categories.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
unit_name | null | string | |
unit_price | null | number | |
is_active | null | boolean | |
created_at | null | string | |
updated_at | null | string |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single expense category by ID
await harvest.expense_categories.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Expense category ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
unit_name | null | string | |
unit_price | null | number | |
is_active | null | boolean | |
created_at | null | string | |
updated_at | null | 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.
await harvest.expense_categories.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
created_at | string | When created |
id | integer | Unique identifier |
is_active | boolean | Whether active |
name | string | Category name |
unit_name | string | Unit name |
unit_price | number | Unit price |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].created_at | string | When created |
data[].id | integer | Unique identifier |
data[].is_active | boolean | Whether active |
data[].name | string | Category name |
data[].unit_name | string | Unit name |
data[].unit_price | number | Unit price |
data[].updated_at | string | When last updated |
Returns a paginated list of roles
await harvest.roles.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
user_ids | null | array | |
created_at | null | string | |
updated_at | null | string |
| Field Name | Type | Description |
|---|---|---|
next_link | null | string |
Get a single role by ID
await harvest.roles.get(
id=0
)
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
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Role ID |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
name | null | string | |
user_ids | null | array | |
created_at | null | string | |
updated_at | null | 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.
await harvest.roles.search(
query={"filter": {"eq": {"created_at": "<str>"}}}
)
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>"}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
created_at | string | When created |
id | integer | Unique identifier |
name | string | Role name |
updated_at | string | When last updated |
user_ids | array | User IDs with this role |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].created_at | string | When created |
data[].id | integer | Unique identifier |
data[].name | string | Role name |
data[].updated_at | string | When last updated |
data[].user_ids | array | User IDs with this role |
Returns a paginated list of user assignments across all projects
await harvest.user_assignments.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
is_project_manager | null | boolean | |
is_active | null | boolean | |
budget | null | number | |
created_at | null | string | |
updated_at | null | string | |
hourly_rate | null | number | |
use_default_rates | null | boolean | |
project | null | object | |
user | null | object |
| Field Name | Type | Description |
|---|---|---|
next_link | null | 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.
await harvest.user_assignments.search(
query={"filter": {"eq": {"budget": 0.0}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
budget | number | Budget |
created_at | string | When created |
hourly_rate | number | Hourly rate |
id | integer | Unique identifier |
is_active | boolean | Whether active |
is_project_manager | boolean | Whether project manager |
project | object | Associated project |
updated_at | string | When last updated |
user | object | Associated user |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].budget | number | Budget |
data[].created_at | string | When created |
data[].hourly_rate | number | Hourly rate |
data[].id | integer | Unique identifier |
data[].is_active | boolean | Whether active |
data[].is_project_manager | boolean | Whether project manager |
data[].project | object | Associated project |
data[].updated_at | string | When last updated |
data[].user | object | Associated user |
Returns a paginated list of task assignments across all projects
await harvest.task_assignments.list()
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"
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
id | integer | |
billable | null | boolean | |
is_active | null | boolean | |
created_at | null | string | |
updated_at | null | string | |
hourly_rate | null | number | |
budget | null | number | |
project | null | object | |
task | null | object |
| Field Name | Type | Description |
|---|---|---|
next_link | null | 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.
await harvest.task_assignments.search(
query={"filter": {"eq": {"billable": True}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
billable | boolean | Whether billable |
created_at | string | When created |
hourly_rate | number | Hourly rate |
id | integer | Unique identifier |
is_active | boolean | Whether active |
project | object | Associated project |
task | object | Associated task |
updated_at | string | When last updated |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].billable | boolean | Whether billable |
data[].created_at | string | When created |
data[].hourly_rate | number | Hourly rate |
data[].id | integer | Unique identifier |
data[].is_active | boolean | Whether active |
data[].project | object | Associated project |
data[].task | object | Associated task |
data[].updated_at | string | When last updated |
Returns time report data grouped by project for a given date range
await harvest.time_projects.list(
from_="<str>",
to="<str>"
)
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>"
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
from | string | Yes | Start date for the report in YYYYMMDD format |
to | string | Yes | End date for the report in YYYYMMDD format |
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
project_id | null | integer | |
project_name | null | string | |
client_id | null | integer | |
client_name | null | string | |
total_hours | null | number | |
billable_hours | null | number | |
currency | null | string | |
billable_amount | null | number |
| Field Name | Type | Description |
|---|---|---|
next_link | null | 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.
await harvest.time_projects.search(
query={"filter": {"eq": {"billable_amount": 0.0}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
billable_amount | number | Total billable amount |
billable_hours | number | Number of billable hours |
client_id | integer | Client identifier |
client_name | string | Client name |
currency | string | Currency code |
project_id | integer | Project identifier |
project_name | string | Project name |
total_hours | number | Total hours spent |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].billable_amount | number | Total billable amount |
data[].billable_hours | number | Number of billable hours |
data[].client_id | integer | Client identifier |
data[].client_name | string | Client name |
data[].currency | string | Currency code |
data[].project_id | integer | Project identifier |
data[].project_name | string | Project name |
data[].total_hours | number | Total hours spent |
Returns time report data grouped by task for a given date range
await harvest.time_tasks.list(
from_="<str>",
to="<str>"
)
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>"
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
from | string | Yes | Start date for the report in YYYYMMDD format |
to | string | Yes | End date for the report in YYYYMMDD format |
per_page | integer | No | Number of records per page (max 2000) |
| Field Name | Type | Description |
|---|---|---|
task_id | null | integer | |
task_name | null | string | |
total_hours | null | number | |
billable_hours | null | number | |
currency | null | string | |
billable_amount | null | number |
| Field Name | Type | Description |
|---|---|---|
next_link | null | 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.
await harvest.time_tasks.search(
query={"filter": {"eq": {"billable_amount": 0.0}}}
)
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}}}
}
}'
| Parameter Name | Type | Required | Description |
|---|---|---|---|
query | object | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
query.filter | object | No | Filter conditions |
query.sort | array | No | Sort conditions |
limit | integer | No | Maximum results to return (default 1000) |
cursor | string | No | Pagination cursor from previous response's meta.cursor |
fields | array | No | Field paths to include in results |
| Field Name | Type | Description |
|---|---|---|
billable_amount | number | Total billable amount |
billable_hours | number | Number of billable hours |
currency | string | Currency code |
task_id | integer | Task identifier |
task_name | string | Task name |
total_hours | number | Total hours spent |
| Field Name | Type | Description |
|---|---|---|
data | array | List of matching records |
meta | object | Pagination metadata |
meta.has_more | boolean | Whether additional pages are available |
meta.cursor | string | null | Cursor for next page of results |
meta.took_ms | number | null | Query execution time in milliseconds |
data[].billable_amount | number | Total billable amount |
data[].billable_hours | number | Number of billable hours |
data[].currency | string | Currency code |
data[].task_id | integer | Task identifier |
data[].task_name | string | Task name |
data[].total_hours | number | Total hours spent |