harvest.api.* operation is listed below with parameter shapes and return types from the plugin Zod schemas.
Clients
create
clients.create
Create a client
Risk: write
await corsair.harvest.api.clients.create({});
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | — |
is_active | boolean | No | — |
address | string | No | — |
currency | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
is_active | boolean | No | — |
address | string | No | — |
statement_key | string | No | — |
currency | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
delete
clients.delete
Delete a client
Risk: destructive
await corsair.harvest.api.clients.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
clients.get
Get a client by id
Risk: read
await corsair.harvest.api.clients.get({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
is_active | boolean | No | — |
address | string | No | — |
statement_key | string | No | — |
currency | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
list
clients.list
List clients
Risk: read
await corsair.harvest.api.clients.list({});
| Name | Type | Required | Description |
|---|---|---|---|
is_active | boolean | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
clients | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
clients full type
clients full type
{
id: number,
name?: string | null,
is_active?: boolean | null,
address?: string | null,
statement_key?: string | null,
currency?: string | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
clients.update
Update a client
Risk: write
await corsair.harvest.api.clients.update({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
name | string | No | — |
is_active | boolean | No | — |
address | string | No | — |
currency | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
is_active | boolean | No | — |
address | string | No | — |
statement_key | string | No | — |
currency | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
Company
get
company.get
Get company settings
Risk: read
await corsair.harvest.api.company.get({});
| Name | Type | Required | Description |
|---|---|---|---|
full_domain | string | Yes | — |
base_uri | string | No | — |
name | string | No | — |
is_active | boolean | No | — |
week_start_day | string | No | — |
wants_timestamp_timers | boolean | No | — |
time_format | string | No | — |
date_format | string | No | — |
plan_type | string | No | — |
clock | string | No | — |
currency_code_display | string | No | — |
currency_symbol_display | string | No | — |
decimal_symbol | string | No | — |
thousands_separator | string | No | — |
color_scheme | string | No | — |
weekly_capacity | number | No | — |
expense_feature | boolean | No | — |
invoice_feature | boolean | No | — |
estimate_feature | boolean | No | — |
approval_feature | boolean | No | — |
team_feature | boolean | No | — |
currency | string | No | — |
saml_sign_in_required | boolean | No | — |
day_entry_notes_required | boolean | No | — |
update
company.update
Update the writable company settings
Risk: write
await corsair.harvest.api.company.update({});
| Name | Type | Required | Description |
|---|---|---|---|
wants_timestamp_timers | boolean | No | — |
weekly_capacity | number | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
full_domain | string | Yes | — |
base_uri | string | No | — |
name | string | No | — |
is_active | boolean | No | — |
week_start_day | string | No | — |
wants_timestamp_timers | boolean | No | — |
time_format | string | No | — |
date_format | string | No | — |
plan_type | string | No | — |
clock | string | No | — |
currency_code_display | string | No | — |
currency_symbol_display | string | No | — |
decimal_symbol | string | No | — |
thousands_separator | string | No | — |
color_scheme | string | No | — |
weekly_capacity | number | No | — |
expense_feature | boolean | No | — |
invoice_feature | boolean | No | — |
estimate_feature | boolean | No | — |
approval_feature | boolean | No | — |
team_feature | boolean | No | — |
currency | string | No | — |
saml_sign_in_required | boolean | No | — |
day_entry_notes_required | boolean | No | — |
Contacts
create
contacts.create
Create a client contact
Risk: write
await corsair.harvest.api.contacts.create({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
first_name | string | Yes | — |
last_name | string | No | — |
title | string | No | — |
email | string | No | — |
phone_office | string | No | — |
phone_mobile | string | No | — |
fax | string | No | — |
invoice_recipient_status | none | recipient | cc | bcc | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
title | string | No | — |
first_name | string | No | — |
last_name | string | No | — |
email | string | No | — |
phone_office | string | No | — |
phone_mobile | string | No | — |
fax | string | No | — |
invoice_recipient_status | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
delete
contacts.delete
Delete a client contact
Risk: destructive
await corsair.harvest.api.contacts.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
contact_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
list
contacts.list
List client contacts
Risk: read
await corsair.harvest.api.contacts.list({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
contacts | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
contacts full type
contacts full type
{
id: number,
client?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
title?: string | null,
first_name?: string | null,
last_name?: string | null,
email?: string | null,
phone_office?: string | null,
phone_mobile?: string | null,
fax?: string | null,
invoice_recipient_status?: string | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
contacts.update
Update a client contact
Risk: write
await corsair.harvest.api.contacts.update({});
| Name | Type | Required | Description |
|---|---|---|---|
contact_id | number | Yes | — |
client_id | number | No | — |
first_name | string | No | — |
last_name | string | No | — |
title | string | No | — |
email | string | No | — |
phone_office | string | No | — |
phone_mobile | string | No | — |
fax | string | No | — |
invoice_recipient_status | none | recipient | cc | bcc | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
title | string | No | — |
first_name | string | No | — |
last_name | string | No | — |
email | string | No | — |
phone_office | string | No | — |
phone_mobile | string | No | — |
fax | string | No | — |
invoice_recipient_status | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
Estimates
create
estimates.create
Create a draft estimate
Risk: write
await corsair.harvest.api.estimates.create({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
subject | string | No | — |
notes | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
currency | string | No | — |
issue_date | string | No | — |
tax | number | No | — |
tax2 | number | No | — |
discount | number | No | — |
line_items | object[] | No | — |
line_items full type
line_items full type
{
id?: number,
kind: string,
description?: string,
quantity?: number,
unit_price: number,
taxed?: boolean,
taxed2?: boolean,
project_id?: number
}[]
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
line_items | object[] | No | — |
creator | object | No | — |
client_key | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
amount | number | No | — |
tax | number | No | — |
tax_amount | number | No | — |
tax2 | number | No | — |
tax2_amount | number | No | — |
discount | number | No | — |
discount_amount | number | No | — |
subject | string | No | — |
notes | string | No | — |
currency | string | No | — |
state | string | No | — |
issue_date | string | No | — |
sent_at | string | No | — |
accepted_at | string | No | — |
declined_at | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
line_items full type
line_items full type
{
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[]
creator full type
creator full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
createItemCategory
estimates.createItemCategory
Create an estimate item category
Risk: write
await corsair.harvest.api.estimates.createItemCategory({});
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
createMessage
estimates.createMessage
Create an estimate message; event_type “send” emails the client
Risk: write
await corsair.harvest.api.estimates.createMessage({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_id | number | Yes | — |
event_type | send | accept | decline | re-open | No | — |
subject | string | No | — |
body | string | No | — |
send_me_a_copy | boolean | No | — |
recipients | object[] | No | — |
recipients full type
recipients full type
{
name?: string,
email: string
}[]
| Name | Type | Required | Description |
|---|---|---|---|
id | number | No | — |
sent_by | string | No | — |
sent_by_email | string | No | — |
sent_from | string | No | — |
sent_from_email | string | No | — |
send_me_a_copy | boolean | No | — |
subject | string | No | — |
body | string | No | — |
event_type | string | No | — |
recipients | object[] | No | — |
created_at | string | No | — |
updated_at | string | No | — |
recipients full type
recipients full type
{
name?: string | null,
email?: string | null
}[]
delete
estimates.delete
Delete an estimate
Risk: destructive
await corsair.harvest.api.estimates.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
deleteMessage
estimates.deleteMessage
Delete an estimate message
Risk: destructive
await corsair.harvest.api.estimates.deleteMessage({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_id | number | Yes | — |
message_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
estimates.get
Get an estimate by id
Risk: read
await corsair.harvest.api.estimates.get({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
line_items | object[] | No | — |
creator | object | No | — |
client_key | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
amount | number | No | — |
tax | number | No | — |
tax_amount | number | No | — |
tax2 | number | No | — |
tax2_amount | number | No | — |
discount | number | No | — |
discount_amount | number | No | — |
subject | string | No | — |
notes | string | No | — |
currency | string | No | — |
state | string | No | — |
issue_date | string | No | — |
sent_at | string | No | — |
accepted_at | string | No | — |
declined_at | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
line_items full type
line_items full type
{
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[]
creator full type
creator full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
listMessages
estimates.listMessages
List the messages recorded against an estimate
Risk: read
await corsair.harvest.api.estimates.listMessages({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_id | number | Yes | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
estimate_messages | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
estimate_messages full type
estimate_messages full type
{
id?: number | null,
sent_by?: string | null,
sent_by_email?: string | null,
sent_from?: string | null,
sent_from_email?: string | null,
send_me_a_copy?: boolean | null,
subject?: string | null,
body?: string | null,
event_type?: string | null,
recipients?: {
name?: string | null,
email?: string | null
}[] | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
estimates.update
Update an estimate
Risk: write
await corsair.harvest.api.estimates.update({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_id | number | Yes | — |
client_id | number | No | — |
subject | string | No | — |
notes | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
currency | string | No | — |
issue_date | string | No | — |
tax | number | No | — |
tax2 | number | No | — |
discount | number | No | — |
line_items | object[] | No | — |
line_items full type
line_items full type
{
id?: number,
kind: string,
description?: string,
quantity?: number,
unit_price: number,
taxed?: boolean,
taxed2?: boolean,
project_id?: number
}[]
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
line_items | object[] | No | — |
creator | object | No | — |
client_key | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
amount | number | No | — |
tax | number | No | — |
tax_amount | number | No | — |
tax2 | number | No | — |
tax2_amount | number | No | — |
discount | number | No | — |
discount_amount | number | No | — |
subject | string | No | — |
notes | string | No | — |
currency | string | No | — |
state | string | No | — |
issue_date | string | No | — |
sent_at | string | No | — |
accepted_at | string | No | — |
declined_at | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
line_items full type
line_items full type
{
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[]
creator full type
creator full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
updateItemCategory
estimates.updateItemCategory
Rename an estimate item category
Risk: write
await corsair.harvest.api.estimates.updateItemCategory({});
| Name | Type | Required | Description |
|---|---|---|---|
estimate_item_category_id | number | Yes | — |
name | string | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
Expenses
create
expenses.create
Record an expense against a project
Risk: write
await corsair.harvest.api.expenses.create({});
| Name | Type | Required | Description |
|---|---|---|---|
project_id | number | Yes | — |
expense_category_id | number | Yes | — |
spent_date | string | Yes | — |
user_id | number | No | — |
units | number | No | — |
total_cost | number | No | — |
notes | string | No | — |
billable | boolean | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
spent_date | string | No | — |
notes | string | No | — |
total_cost | number | No | — |
units | number | No | — |
billable | boolean | No | — |
receipt | object | No | — |
approval_status | string | No | — |
is_closed | boolean | No | — |
is_locked | boolean | No | — |
is_explicitly_locked | boolean | No | — |
is_billed | boolean | No | — |
locked_reason | string | No | — |
reimbursement | boolean | No | — |
user | object | No | — |
client | object | No | — |
project | object | No | — |
expense_category | object | No | — |
user_assignment | object | No | — |
invoice | object | No | — |
created_at | string | No | — |
updated_at | string | No | — |
receipt full type
receipt full type
{
url?: string | null,
file_name?: string | null,
file_size?: number | null,
content_type?: string | null
}
user full type
user full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
project full type
project full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
expense_category full type
expense_category full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
user_assignment full type
user_assignment full type
{
id?: number | null,
is_project_manager?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
use_default_rates?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}
invoice full type
invoice full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
listCategories
expenses.listCategories
List expense categories
Risk: read
await corsair.harvest.api.expenses.listCategories({});
| Name | Type | Required | Description |
|---|---|---|---|
is_active | boolean | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
expense_categories | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
expense_categories full type
expense_categories full type
{
id: number,
name?: string | null,
unit_name?: string | null,
unit_price?: number | null,
is_active?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
expenses.update
Update an expense
Risk: write
await corsair.harvest.api.expenses.update({});
| Name | Type | Required | Description |
|---|---|---|---|
expense_id | number | Yes | — |
project_id | number | No | — |
expense_category_id | number | No | — |
spent_date | string | No | — |
units | number | No | — |
total_cost | number | No | — |
notes | string | No | — |
billable | boolean | No | — |
delete_receipt | boolean | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
spent_date | string | No | — |
notes | string | No | — |
total_cost | number | No | — |
units | number | No | — |
billable | boolean | No | — |
receipt | object | No | — |
approval_status | string | No | — |
is_closed | boolean | No | — |
is_locked | boolean | No | — |
is_explicitly_locked | boolean | No | — |
is_billed | boolean | No | — |
locked_reason | string | No | — |
reimbursement | boolean | No | — |
user | object | No | — |
client | object | No | — |
project | object | No | — |
expense_category | object | No | — |
user_assignment | object | No | — |
invoice | object | No | — |
created_at | string | No | — |
updated_at | string | No | — |
receipt full type
receipt full type
{
url?: string | null,
file_name?: string | null,
file_size?: number | null,
content_type?: string | null
}
user full type
user full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
project full type
project full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
expense_category full type
expense_category full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
user_assignment full type
user_assignment full type
{
id?: number | null,
is_project_manager?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
use_default_rates?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}
invoice full type
invoice full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
Invoices
create
invoices.create
Create a draft invoice
Risk: write
await corsair.harvest.api.invoices.create({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
retainer_id | number | No | — |
estimate_id | number | No | — |
subject | string | No | — |
notes | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
currency | string | No | — |
issue_date | string | No | — |
due_date | string | No | — |
payment_term | string | No | — |
payment_options | ach | credit_card | paypal[] | No | — |
tax | number | No | — |
tax2 | number | No | — |
discount | number | No | — |
line_items | object[] | No | — |
line_items full type
line_items full type
{
id?: number,
kind: string,
description?: string,
quantity?: number,
unit_price: number,
taxed?: boolean,
taxed2?: boolean,
project_id?: number
}[]
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
line_items | object[] | No | — |
estimate | object | No | — |
retainer | object | No | — |
creator | object | No | — |
client_key | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
amount | number | No | — |
due_amount | number | No | — |
tax | number | No | — |
tax_amount | number | No | — |
tax2 | number | No | — |
tax2_amount | number | No | — |
discount | number | No | — |
discount_amount | number | No | — |
subject | string | No | — |
notes | string | No | — |
currency | string | No | — |
state | string | No | — |
period_start | string | No | — |
period_end | string | No | — |
issue_date | string | No | — |
due_date | string | No | — |
payment_term | string | No | — |
payment_options | string[] | No | — |
sent_at | string | No | — |
paid_at | string | No | — |
paid_date | string | No | — |
closed_at | string | No | — |
recurring_invoice_id | number | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
line_items full type
line_items full type
{
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[]
estimate full type
estimate full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
retainer full type
retainer full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
creator full type
creator full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
createItemCategory
invoices.createItemCategory
Create an invoice item category
Risk: write
await corsair.harvest.api.invoices.createItemCategory({});
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
use_as_service | boolean | No | — |
use_as_expense | boolean | No | — |
created_at | string | No | — |
updated_at | string | No | — |
createMessage
invoices.createMessage
Create an invoice message; event_type “send” emails the client
Risk: write
await corsair.harvest.api.invoices.createMessage({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
event_type | send | close | re-open | draft | No | — |
subject | string | No | — |
body | string | No | — |
include_link_to_client_invoice | boolean | No | — |
attach_pdf | boolean | No | — |
send_me_a_copy | boolean | No | — |
thank_you | boolean | No | — |
recipients | object[] | No | — |
recipients full type
recipients full type
{
name?: string,
email: string
}[]
| Name | Type | Required | Description |
|---|---|---|---|
id | number | No | — |
sent_by | string | No | — |
sent_by_email | string | No | — |
sent_from | string | No | — |
sent_from_email | string | No | — |
include_link_to_client_invoice | boolean | No | — |
send_me_a_copy | boolean | No | — |
thank_you | boolean | No | — |
reminder | boolean | No | — |
send_reminder_on | string | No | — |
attach_pdf | boolean | No | — |
subject | string | No | — |
body | string | No | — |
event_type | string | No | — |
recipients | object[] | No | — |
created_at | string | No | — |
updated_at | string | No | — |
recipients full type
recipients full type
{
name?: string | null,
email?: string | null
}[]
createPayment
invoices.createPayment
Record a payment against an invoice
Risk: write
await corsair.harvest.api.invoices.createPayment({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
amount | number | Yes | — |
paid_at | string | No | — |
paid_date | string | No | — |
notes | string | No | — |
send_thank_you | boolean | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | No | — |
amount | number | No | — |
paid_at | string | No | — |
paid_date | string | No | — |
recorded_by | string | No | — |
recorded_by_email | string | No | — |
notes | string | No | — |
transaction_id | string | No | — |
payment_gateway | object | No | — |
created_at | string | No | — |
updated_at | string | No | — |
payment_gateway full type
payment_gateway full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
delete
invoices.delete
Delete an invoice
Risk: destructive
await corsair.harvest.api.invoices.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
deleteItemCategory
invoices.deleteItemCategory
Delete an unused invoice item category
Risk: destructive
await corsair.harvest.api.invoices.deleteItemCategory({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_item_category_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
deleteMessage
invoices.deleteMessage
Delete an invoice message
Risk: destructive
await corsair.harvest.api.invoices.deleteMessage({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
message_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
deletePayment
invoices.deletePayment
Delete a recorded payment
Risk: destructive
await corsair.harvest.api.invoices.deletePayment({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
payment_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
invoices.get
Get an invoice by id
Risk: read
await corsair.harvest.api.invoices.get({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
line_items | object[] | No | — |
estimate | object | No | — |
retainer | object | No | — |
creator | object | No | — |
client_key | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
amount | number | No | — |
due_amount | number | No | — |
tax | number | No | — |
tax_amount | number | No | — |
tax2 | number | No | — |
tax2_amount | number | No | — |
discount | number | No | — |
discount_amount | number | No | — |
subject | string | No | — |
notes | string | No | — |
currency | string | No | — |
state | string | No | — |
period_start | string | No | — |
period_end | string | No | — |
issue_date | string | No | — |
due_date | string | No | — |
payment_term | string | No | — |
payment_options | string[] | No | — |
sent_at | string | No | — |
paid_at | string | No | — |
paid_date | string | No | — |
closed_at | string | No | — |
recurring_invoice_id | number | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
line_items full type
line_items full type
{
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[]
estimate full type
estimate full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
retainer full type
retainer full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
creator full type
creator full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
list
invoices.list
List invoices
Risk: read
await corsair.harvest.api.invoices.list({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | No | — |
project_id | number | No | — |
state | draft | open | paid | closed | No | — |
from | string | No | — |
to | string | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
invoices | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
invoices full type
invoices full type
{
id: number,
client?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
line_items?: {
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[] | null,
estimate?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
retainer?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
creator?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
client_key?: string | null,
number?: string | null,
purchase_order?: string | null,
amount?: number | null,
due_amount?: number | null,
tax?: number | null,
tax_amount?: number | null,
tax2?: number | null,
tax2_amount?: number | null,
discount?: number | null,
discount_amount?: number | null,
subject?: string | null,
notes?: string | null,
currency?: string | null,
state?: string | null,
period_start?: string | null,
period_end?: string | null,
issue_date?: string | null,
due_date?: string | null,
payment_term?: string | null,
payment_options?: string[] | null,
sent_at?: string | null,
paid_at?: string | null,
paid_date?: string | null,
closed_at?: string | null,
recurring_invoice_id?: number | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
listItemCategories
invoices.listItemCategories
List invoice item categories
Risk: read
await corsair.harvest.api.invoices.listItemCategories({});
| Name | Type | Required | Description |
|---|---|---|---|
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
invoice_item_categories | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
invoice_item_categories full type
invoice_item_categories full type
{
id: number,
name?: string | null,
use_as_service?: boolean | null,
use_as_expense?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
listMessages
invoices.listMessages
List the messages recorded against an invoice
Risk: read
await corsair.harvest.api.invoices.listMessages({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
invoice_messages | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
invoice_messages full type
invoice_messages full type
{
id?: number | null,
sent_by?: string | null,
sent_by_email?: string | null,
sent_from?: string | null,
sent_from_email?: string | null,
include_link_to_client_invoice?: boolean | null,
send_me_a_copy?: boolean | null,
thank_you?: boolean | null,
reminder?: boolean | null,
send_reminder_on?: string | null,
attach_pdf?: boolean | null,
subject?: string | null,
body?: string | null,
event_type?: string | null,
recipients?: {
name?: string | null,
email?: string | null
}[] | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
listPayments
invoices.listPayments
List payments recorded against an invoice
Risk: read
await corsair.harvest.api.invoices.listPayments({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
invoice_payments | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
invoice_payments full type
invoice_payments full type
{
id?: number | null,
amount?: number | null,
paid_at?: string | null,
paid_date?: string | null,
recorded_by?: string | null,
recorded_by_email?: string | null,
notes?: string | null,
transaction_id?: string | null,
payment_gateway?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
invoices.update
Update an invoice
Risk: write
await corsair.harvest.api.invoices.update({});
| Name | Type | Required | Description |
|---|---|---|---|
invoice_id | number | Yes | — |
client_id | number | No | — |
retainer_id | number | No | — |
estimate_id | number | No | — |
subject | string | No | — |
notes | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
currency | string | No | — |
issue_date | string | No | — |
due_date | string | No | — |
payment_term | string | No | — |
payment_options | ach | credit_card | paypal[] | No | — |
tax | number | No | — |
tax2 | number | No | — |
discount | number | No | — |
line_items | object[] | No | — |
line_items full type
line_items full type
{
id?: number,
kind: string,
description?: string,
quantity?: number,
unit_price: number,
taxed?: boolean,
taxed2?: boolean,
project_id?: number
}[]
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
line_items | object[] | No | — |
estimate | object | No | — |
retainer | object | No | — |
creator | object | No | — |
client_key | string | No | — |
number | string | No | — |
purchase_order | string | No | — |
amount | number | No | — |
due_amount | number | No | — |
tax | number | No | — |
tax_amount | number | No | — |
tax2 | number | No | — |
tax2_amount | number | No | — |
discount | number | No | — |
discount_amount | number | No | — |
subject | string | No | — |
notes | string | No | — |
currency | string | No | — |
state | string | No | — |
period_start | string | No | — |
period_end | string | No | — |
issue_date | string | No | — |
due_date | string | No | — |
payment_term | string | No | — |
payment_options | string[] | No | — |
sent_at | string | No | — |
paid_at | string | No | — |
paid_date | string | No | — |
closed_at | string | No | — |
recurring_invoice_id | number | No | — |
created_at | string | No | — |
updated_at | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
line_items full type
line_items full type
{
id?: number | null,
kind?: string | null,
description?: string | null,
quantity?: number | null,
unit_price?: number | null,
amount?: number | null,
taxed?: boolean | null,
taxed2?: boolean | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null
}[]
estimate full type
estimate full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
retainer full type
retainer full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
creator full type
creator full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
Projects
create
projects.create
Create a project
Risk: write
await corsair.harvest.api.projects.create({});
| Name | Type | Required | Description |
|---|---|---|---|
client_id | number | Yes | — |
name | string | Yes | — |
is_billable | boolean | Yes | — |
bill_by | Project | Tasks | People | none | Yes | — |
budget_by | project | project_cost | task | task_fees | person | none | Yes | — |
code | string | No | — |
is_active | boolean | No | — |
is_fixed_fee | boolean | No | — |
hourly_rate | number | No | — |
budget | number | No | — |
budget_is_monthly | boolean | No | — |
notify_when_over_budget | boolean | No | — |
over_budget_notification_percentage | number | No | — |
show_budget_to_all | boolean | No | — |
cost_budget | number | No | — |
cost_budget_include_expenses | boolean | No | — |
fee | number | No | — |
notes | string | No | — |
starts_on | string | No | — |
ends_on | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
name | string | No | — |
code | string | No | — |
is_active | boolean | No | — |
is_billable | boolean | No | — |
is_fixed_fee | boolean | No | — |
bill_by | string | No | — |
hourly_rate | number | No | — |
budget_by | string | No | — |
budget_is_monthly | boolean | No | — |
budget | number | No | — |
cost_budget | number | No | — |
cost_budget_include_expenses | boolean | No | — |
notify_when_over_budget | boolean | No | — |
over_budget_notification_percentage | number | No | — |
over_budget_notification_date | string | No | — |
show_budget_to_all | boolean | No | — |
fee | number | No | — |
notes | string | No | — |
starts_on | string | No | — |
ends_on | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
currency | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
delete
projects.delete
Delete a project and its time entries and expenses
Risk: destructive
await corsair.harvest.api.projects.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
project_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
projects.get
Get a project by id
Risk: read
await corsair.harvest.api.projects.get({});
| Name | Type | Required | Description |
|---|---|---|---|
project_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
name | string | No | — |
code | string | No | — |
is_active | boolean | No | — |
is_billable | boolean | No | — |
is_fixed_fee | boolean | No | — |
bill_by | string | No | — |
hourly_rate | number | No | — |
budget_by | string | No | — |
budget_is_monthly | boolean | No | — |
budget | number | No | — |
cost_budget | number | No | — |
cost_budget_include_expenses | boolean | No | — |
notify_when_over_budget | boolean | No | — |
over_budget_notification_percentage | number | No | — |
over_budget_notification_date | string | No | — |
show_budget_to_all | boolean | No | — |
fee | number | No | — |
notes | string | No | — |
starts_on | string | No | — |
ends_on | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
currency | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
list
projects.list
List projects
Risk: read
await corsair.harvest.api.projects.list({});
| Name | Type | Required | Description |
|---|---|---|---|
is_active | boolean | No | — |
client_id | number | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
projects | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
projects full type
projects full type
{
id: number,
client?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
name?: string | null,
code?: string | null,
is_active?: boolean | null,
is_billable?: boolean | null,
is_fixed_fee?: boolean | null,
bill_by?: string | null,
hourly_rate?: number | null,
budget_by?: string | null,
budget_is_monthly?: boolean | null,
budget?: number | null,
cost_budget?: number | null,
cost_budget_include_expenses?: boolean | null,
notify_when_over_budget?: boolean | null,
over_budget_notification_percentage?: number | null,
over_budget_notification_date?: string | null,
show_budget_to_all?: boolean | null,
fee?: number | null,
notes?: string | null,
starts_on?: string | null,
ends_on?: string | null,
created_at?: string | null,
updated_at?: string | null,
currency?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
projects.update
Update a project
Risk: write
await corsair.harvest.api.projects.update({});
| Name | Type | Required | Description |
|---|---|---|---|
project_id | number | Yes | — |
client_id | number | No | — |
name | string | No | — |
code | string | No | — |
is_active | boolean | No | — |
is_billable | boolean | No | — |
is_fixed_fee | boolean | No | — |
bill_by | Project | Tasks | People | none | No | — |
budget_by | project | project_cost | task | task_fees | person | none | No | — |
hourly_rate | number | No | — |
budget | number | No | — |
budget_is_monthly | boolean | No | — |
notify_when_over_budget | boolean | No | — |
over_budget_notification_percentage | number | No | — |
show_budget_to_all | boolean | No | — |
cost_budget | number | No | — |
cost_budget_include_expenses | boolean | No | — |
fee | number | No | — |
notes | string | No | — |
starts_on | string | No | — |
ends_on | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
client | object | No | — |
name | string | No | — |
code | string | No | — |
is_active | boolean | No | — |
is_billable | boolean | No | — |
is_fixed_fee | boolean | No | — |
bill_by | string | No | — |
hourly_rate | number | No | — |
budget_by | string | No | — |
budget_is_monthly | boolean | No | — |
budget | number | No | — |
cost_budget | number | No | — |
cost_budget_include_expenses | boolean | No | — |
notify_when_over_budget | boolean | No | — |
over_budget_notification_percentage | number | No | — |
over_budget_notification_date | string | No | — |
show_budget_to_all | boolean | No | — |
fee | number | No | — |
notes | string | No | — |
starts_on | string | No | — |
ends_on | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
currency | string | No | — |
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
Tasks
create
tasks.create
Create a task
Risk: write
await corsair.harvest.api.tasks.create({});
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | — |
billable_by_default | boolean | No | — |
default_hourly_rate | number | No | — |
is_default | boolean | No | — |
is_active | boolean | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
billable_by_default | boolean | No | — |
default_hourly_rate | number | No | — |
is_default | boolean | No | — |
is_active | boolean | No | — |
created_at | string | No | — |
updated_at | string | No | — |
delete
tasks.delete
Delete a task
Risk: destructive
await corsair.harvest.api.tasks.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
task_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
tasks.get
Get a task by id
Risk: read
await corsair.harvest.api.tasks.get({});
| Name | Type | Required | Description |
|---|---|---|---|
task_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
billable_by_default | boolean | No | — |
default_hourly_rate | number | No | — |
is_default | boolean | No | — |
is_active | boolean | No | — |
created_at | string | No | — |
updated_at | string | No | — |
list
tasks.list
List tasks
Risk: read
await corsair.harvest.api.tasks.list({});
| Name | Type | Required | Description |
|---|---|---|---|
is_active | boolean | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
tasks | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
tasks full type
tasks full type
{
id: number,
name?: string | null,
billable_by_default?: boolean | null,
default_hourly_rate?: number | null,
is_default?: boolean | null,
is_active?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
tasks.update
Update a task
Risk: write
await corsair.harvest.api.tasks.update({});
| Name | Type | Required | Description |
|---|---|---|---|
task_id | number | Yes | — |
name | string | No | — |
billable_by_default | boolean | No | — |
default_hourly_rate | number | No | — |
is_default | boolean | No | — |
is_active | boolean | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
name | string | No | — |
billable_by_default | boolean | No | — |
default_hourly_rate | number | No | — |
is_default | boolean | No | — |
is_active | boolean | No | — |
created_at | string | No | — |
updated_at | string | No | — |
Time Entries
create
timeEntries.create
Log time against a project and task
Risk: write
await corsair.harvest.api.timeEntries.create({});
| Name | Type | Required | Description |
|---|---|---|---|
project_id | number | Yes | — |
task_id | number | Yes | — |
spent_date | string | Yes | — |
user_id | number | No | — |
hours | number | No | — |
started_time | string | No | — |
ended_time | string | No | — |
notes | string | No | — |
external_reference | object | No | — |
external_reference full type
external_reference full type
{
id?: string,
group_id?: string,
account_id?: string,
permalink?: string
}
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
spent_date | string | No | — |
hours | number | No | — |
hours_without_timer | number | No | — |
rounded_hours | number | No | — |
notes | string | No | — |
is_locked | boolean | No | — |
is_explicitly_locked | boolean | No | — |
locked_reason | string | No | — |
approval_status | string | No | — |
is_closed | boolean | No | — |
is_billed | boolean | No | — |
timer_started_at | string | No | — |
started_time | string | No | — |
ended_time | string | No | — |
is_running | boolean | No | — |
billable | boolean | No | — |
budgeted | boolean | No | — |
billable_rate | number | No | — |
cost_rate | number | No | — |
user | object | No | — |
client | object | No | — |
project | object | No | — |
task | object | No | — |
user_assignment | object | No | — |
task_assignment | object | No | — |
invoice | object | No | — |
external_reference | object | No | — |
created_at | string | No | — |
updated_at | string | No | — |
user full type
user full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
project full type
project full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
task full type
task full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
user_assignment full type
user_assignment full type
{
id?: number | null,
is_project_manager?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
use_default_rates?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}
task_assignment full type
task_assignment full type
{
id?: number | null,
billable?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
created_at?: string | null,
updated_at?: string | null
}
invoice full type
invoice full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
external_reference full type
external_reference full type
{
id?: string | null,
group_id?: string | null,
account_id?: string | null,
permalink?: string | null,
service?: string | null,
service_icon_url?: string | null
}
delete
timeEntries.delete
Delete a time entry
Risk: destructive
await corsair.harvest.api.timeEntries.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
time_entry_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
timeEntries.get
Get a time entry by id
Risk: read
await corsair.harvest.api.timeEntries.get({});
| Name | Type | Required | Description |
|---|---|---|---|
time_entry_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
spent_date | string | No | — |
hours | number | No | — |
hours_without_timer | number | No | — |
rounded_hours | number | No | — |
notes | string | No | — |
is_locked | boolean | No | — |
is_explicitly_locked | boolean | No | — |
locked_reason | string | No | — |
approval_status | string | No | — |
is_closed | boolean | No | — |
is_billed | boolean | No | — |
timer_started_at | string | No | — |
started_time | string | No | — |
ended_time | string | No | — |
is_running | boolean | No | — |
billable | boolean | No | — |
budgeted | boolean | No | — |
billable_rate | number | No | — |
cost_rate | number | No | — |
user | object | No | — |
client | object | No | — |
project | object | No | — |
task | object | No | — |
user_assignment | object | No | — |
task_assignment | object | No | — |
invoice | object | No | — |
external_reference | object | No | — |
created_at | string | No | — |
updated_at | string | No | — |
user full type
user full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
project full type
project full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
task full type
task full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
user_assignment full type
user_assignment full type
{
id?: number | null,
is_project_manager?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
use_default_rates?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}
task_assignment full type
task_assignment full type
{
id?: number | null,
billable?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
created_at?: string | null,
updated_at?: string | null
}
invoice full type
invoice full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
external_reference full type
external_reference full type
{
id?: string | null,
group_id?: string | null,
account_id?: string | null,
permalink?: string | null,
service?: string | null,
service_icon_url?: string | null
}
list
timeEntries.list
List time entries
Risk: read
await corsair.harvest.api.timeEntries.list({});
| Name | Type | Required | Description |
|---|---|---|---|
user_id | number | No | — |
client_id | number | No | — |
project_id | number | No | — |
task_id | number | No | — |
external_reference_id | string | No | — |
is_billed | boolean | No | — |
is_running | boolean | No | — |
approval_status | unsubmitted | submitted | approved | No | — |
from | string | No | — |
to | string | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
time_entries | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
time_entries full type
time_entries full type
{
id: number,
spent_date?: string | null,
hours?: number | null,
hours_without_timer?: number | null,
rounded_hours?: number | null,
notes?: string | null,
is_locked?: boolean | null,
is_explicitly_locked?: boolean | null,
locked_reason?: string | null,
approval_status?: string | null,
is_closed?: boolean | null,
is_billed?: boolean | null,
timer_started_at?: string | null,
started_time?: string | null,
ended_time?: string | null,
is_running?: boolean | null,
billable?: boolean | null,
budgeted?: boolean | null,
billable_rate?: number | null,
cost_rate?: number | null,
user?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
client?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
project?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
task?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
user_assignment?: {
id?: number | null,
is_project_manager?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
use_default_rates?: boolean | null,
created_at?: string | null,
updated_at?: string | null
} | null,
task_assignment?: {
id?: number | null,
billable?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
created_at?: string | null,
updated_at?: string | null
} | null,
invoice?: {
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
} | null,
external_reference?: {
id?: string | null,
group_id?: string | null,
account_id?: string | null,
permalink?: string | null,
service?: string | null,
service_icon_url?: string | null
} | null,
created_at?: string | null,
updated_at?: string | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
timeEntries.update
Update a time entry
Risk: write
await corsair.harvest.api.timeEntries.update({});
| Name | Type | Required | Description |
|---|---|---|---|
time_entry_id | number | Yes | — |
project_id | number | No | — |
task_id | number | No | — |
spent_date | string | No | — |
hours | number | No | — |
started_time | string | No | — |
ended_time | string | No | — |
notes | string | No | — |
external_reference | object | No | — |
external_reference full type
external_reference full type
{
id?: string,
group_id?: string,
account_id?: string,
permalink?: string
}
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
spent_date | string | No | — |
hours | number | No | — |
hours_without_timer | number | No | — |
rounded_hours | number | No | — |
notes | string | No | — |
is_locked | boolean | No | — |
is_explicitly_locked | boolean | No | — |
locked_reason | string | No | — |
approval_status | string | No | — |
is_closed | boolean | No | — |
is_billed | boolean | No | — |
timer_started_at | string | No | — |
started_time | string | No | — |
ended_time | string | No | — |
is_running | boolean | No | — |
billable | boolean | No | — |
budgeted | boolean | No | — |
billable_rate | number | No | — |
cost_rate | number | No | — |
user | object | No | — |
client | object | No | — |
project | object | No | — |
task | object | No | — |
user_assignment | object | No | — |
task_assignment | object | No | — |
invoice | object | No | — |
external_reference | object | No | — |
created_at | string | No | — |
updated_at | string | No | — |
user full type
user full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
client full type
client full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
project full type
project full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
task full type
task full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
user_assignment full type
user_assignment full type
{
id?: number | null,
is_project_manager?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
use_default_rates?: boolean | null,
created_at?: string | null,
updated_at?: string | null
}
task_assignment full type
task_assignment full type
{
id?: number | null,
billable?: boolean | null,
is_active?: boolean | null,
budget?: number | null,
hourly_rate?: number | null,
created_at?: string | null,
updated_at?: string | null
}
invoice full type
invoice full type
{
id?: number | null,
name?: string | null,
code?: string | null,
currency?: string | null
}
external_reference full type
external_reference full type
{
id?: string | null,
group_id?: string | null,
account_id?: string | null,
permalink?: string | null,
service?: string | null,
service_icon_url?: string | null
}
Users
create
users.create
Create a team member and email them an invitation
Risk: write
await corsair.harvest.api.users.create({});
| Name | Type | Required | Description |
|---|---|---|---|
first_name | string | Yes | — |
last_name | string | Yes | — |
email | string | Yes | — |
timezone | string | No | — |
is_contractor | boolean | No | — |
is_active | boolean | No | — |
weekly_capacity | number | No | — |
default_hourly_rate | number | No | — |
cost_rate | number | No | — |
has_access_to_all_future_projects | boolean | No | — |
saml_exempt | boolean | No | — |
roles | string[] | No | — |
access_roles | string[] | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
first_name | string | No | — |
last_name | string | No | — |
email | string | No | — |
telephone | string | No | — |
timezone | string | No | — |
has_access_to_all_future_projects | boolean | No | — |
is_contractor | boolean | No | — |
is_active | boolean | No | — |
saml_exempt | boolean | No | — |
weekly_capacity | number | No | — |
default_hourly_rate | number | No | — |
cost_rate | number | No | — |
roles | string[] | No | — |
access_roles | string[] | No | — |
avatar_url | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
employee_id | string | No | — |
calendar_integration_enabled | boolean | No | — |
calendar_integration_source | string | No | — |
can_create_projects | boolean | No | — |
permissions_claims | string[] | No | — |
delete
users.delete
Delete a team member
Risk: destructive
await corsair.harvest.api.users.delete({});
| Name | Type | Required | Description |
|---|---|---|---|
user_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
success | boolean | Yes | — |
id | number | No | — |
get
users.get
Get a team member by id
Risk: read
await corsair.harvest.api.users.get({});
| Name | Type | Required | Description |
|---|---|---|---|
user_id | number | Yes | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
first_name | string | No | — |
last_name | string | No | — |
email | string | No | — |
telephone | string | No | — |
timezone | string | No | — |
has_access_to_all_future_projects | boolean | No | — |
is_contractor | boolean | No | — |
is_active | boolean | No | — |
saml_exempt | boolean | No | — |
weekly_capacity | number | No | — |
default_hourly_rate | number | No | — |
cost_rate | number | No | — |
roles | string[] | No | — |
access_roles | string[] | No | — |
avatar_url | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
employee_id | string | No | — |
calendar_integration_enabled | boolean | No | — |
calendar_integration_source | string | No | — |
can_create_projects | boolean | No | — |
permissions_claims | string[] | No | — |
list
users.list
List team members
Risk: read
await corsair.harvest.api.users.list({});
| Name | Type | Required | Description |
|---|---|---|---|
is_active | boolean | No | — |
page | number | No | — |
per_page | number | No | — |
updated_since | string | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
users | object[] | Yes | — |
per_page | number | No | — |
total_pages | number | No | — |
total_entries | number | No | — |
next_page | number | No | — |
previous_page | number | No | — |
page | number | No | — |
links | object | No | — |
users full type
users full type
{
id: number,
first_name?: string | null,
last_name?: string | null,
email?: string | null,
telephone?: string | null,
timezone?: string | null,
has_access_to_all_future_projects?: boolean | null,
is_contractor?: boolean | null,
is_active?: boolean | null,
saml_exempt?: boolean | null,
weekly_capacity?: number | null,
default_hourly_rate?: number | null,
cost_rate?: number | null,
roles?: string[] | null,
access_roles?: string[] | null,
avatar_url?: string | null,
created_at?: string | null,
updated_at?: string | null,
employee_id?: string | null,
calendar_integration_enabled?: boolean | null,
calendar_integration_source?: string | null,
can_create_projects?: boolean | null,
permissions_claims?: string[] | null
}[]
links full type
links full type
{
first?: string | null,
next?: string | null,
previous?: string | null,
last?: string | null
}
update
users.update
Update a team member
Risk: write
await corsair.harvest.api.users.update({});
| Name | Type | Required | Description |
|---|---|---|---|
user_id | number | Yes | — |
first_name | string | No | — |
last_name | string | No | — |
email | string | No | — |
timezone | string | No | — |
is_contractor | boolean | No | — |
is_active | boolean | No | — |
weekly_capacity | number | No | — |
default_hourly_rate | number | No | — |
cost_rate | number | No | — |
has_access_to_all_future_projects | boolean | No | — |
saml_exempt | boolean | No | — |
roles | string[] | No | — |
access_roles | string[] | No | — |
| Name | Type | Required | Description |
|---|---|---|---|
id | number | Yes | — |
first_name | string | No | — |
last_name | string | No | — |
email | string | No | — |
telephone | string | No | — |
timezone | string | No | — |
has_access_to_all_future_projects | boolean | No | — |
is_contractor | boolean | No | — |
is_active | boolean | No | — |
saml_exempt | boolean | No | — |
weekly_capacity | number | No | — |
default_hourly_rate | number | No | — |
cost_rate | number | No | — |
roles | string[] | No | — |
access_roles | string[] | No | — |
avatar_url | string | No | — |
created_at | string | No | — |
updated_at | string | No | — |
employee_id | string | No | — |
calendar_integration_enabled | boolean | No | — |
calendar_integration_source | string | No | — |
can_create_projects | boolean | No | — |
permissions_claims | string[] | No | — |