Install
openclaw skills install harvest-time-reporting-apiIntegrate with the Harvest API to manage time entries, projects, tasks, clients, and user assignments for detailed time tracking and reporting.
openclaw skills install harvest-time-reporting-apiIntegration with Harvest time tracking software (API v2).
HARVEST_ACCESS_TOKEN - Get from https://id.getharvest.com/developersHARVEST_ACCOUNT_ID - Your Harvest account IDAll requests require these headers:
Authorization: Bearer $HARVEST_ACCESS_TOKEN
Harvest-Account-Id: $HARVEST_ACCOUNT_ID
User-Agent: YourApp (your@email.com)
Base URL: https://api.harvestapp.com/v2
curl "https://api.harvestapp.com/v2/time_entries" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: user_id, client_id, project_id, task_id, external_reference_id, is_billed, is_running, updated_since, from, to, page, per_page
curl "https://api.harvestapp.com/v2/time_entries" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"project_id":12345,"task_id":67890,"spent_date":"2024-01-15","hours":2.5}'
curl "https://api.harvestapp.com/v2/time_entries" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"project_id":12345,"task_id":67890,"spent_date":"2024-01-15","started_time":"9:00am","ended_time":"11:30am"}'
curl "https://api.harvestapp.com/v2/time_entries/{TIME_ENTRY_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/time_entries/{TIME_ENTRY_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"hours":3.0,"notes":"Updated notes"}'
curl "https://api.harvestapp.com/v2/time_entries/{TIME_ENTRY_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/time_entries/{TIME_ENTRY_ID}/restart" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X PATCH
curl "https://api.harvestapp.com/v2/time_entries/{TIME_ENTRY_ID}/stop" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X PATCH
curl "https://api.harvestapp.com/v2/projects" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: is_active, client_id, updated_since, page, per_page
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/projects" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"client_id":12345,"name":"New Project","is_billable":true,"bill_by":"Project","budget_by":"project"}'
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"name":"Updated Project Name"}'
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}/user_assignments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}/user_assignments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"user_id":12345}'
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}/task_assignments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/projects/{PROJECT_ID}/task_assignments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"task_id":12345}'
curl "https://api.harvestapp.com/v2/tasks" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: is_active, updated_since, page, per_page
curl "https://api.harvestapp.com/v2/tasks/{TASK_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/tasks" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name":"New Task","default_hourly_rate":100.0}'
curl "https://api.harvestapp.com/v2/tasks/{TASK_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"name":"Updated Task Name"}'
curl "https://api.harvestapp.com/v2/tasks/{TASK_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/clients" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: is_active, updated_since, page, per_page
curl "https://api.harvestapp.com/v2/clients/{CLIENT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/clients" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name":"New Client","currency":"USD"}'
curl "https://api.harvestapp.com/v2/clients/{CLIENT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"name":"Updated Client Name"}'
curl "https://api.harvestapp.com/v2/clients/{CLIENT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/contacts" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: client_id, updated_since, page, per_page
curl "https://api.harvestapp.com/v2/contacts/{CONTACT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/contacts" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"client_id":12345,"first_name":"John","last_name":"Doe","email":"john@example.com"}'
curl "https://api.harvestapp.com/v2/contacts/{CONTACT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"email":"newemail@example.com"}'
curl "https://api.harvestapp.com/v2/contacts/{CONTACT_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/users" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: is_active, updated_since, page, per_page
curl "https://api.harvestapp.com/v2/users/me" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/users/{USER_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/users" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"first_name":"Jane","last_name":"Doe","email":"jane@example.com"}'
curl "https://api.harvestapp.com/v2/users/{USER_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"first_name":"Janet"}'
curl "https://api.harvestapp.com/v2/users/{USER_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/users/me/project_assignments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/users/{USER_ID}/project_assignments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/users/{USER_ID}/billable_rates" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/users/{USER_ID}/billable_rates" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"amount":150.0,"start_date":"2024-01-01"}'
curl "https://api.harvestapp.com/v2/users/{USER_ID}/cost_rates" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/users/{USER_ID}/cost_rates" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"amount":75.0,"start_date":"2024-01-01"}'
curl "https://api.harvestapp.com/v2/invoices" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: client_id, project_id, updated_since, from, to, state, page, per_page
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/invoices" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"client_id":12345,"subject":"Invoice for January","due_date":"2024-02-15","line_items":[{"kind":"Service","description":"Consulting","unit_price":150,"quantity":10}]}'
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"subject":"Updated Invoice Subject"}'
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}/line_items" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"line_items":[{"kind":"Service","description":"Additional work","unit_price":100,"quantity":5}]}'
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}/payments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}/payments" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"amount":500.0,"paid_at":"2024-01-20T00:00:00Z"}'
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}/messages" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/invoices/{INVOICE_ID}/messages" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"recipients":[{"email":"client@example.com"}],"subject":"Invoice #123","body":"Please find attached invoice."}'
curl "https://api.harvestapp.com/v2/invoice_item_categories" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/estimates" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: client_id, updated_since, from, to, state, page, per_page
curl "https://api.harvestapp.com/v2/estimates/{ESTIMATE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/estimates" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"client_id":12345,"subject":"Project Estimate","line_items":[{"kind":"Service","description":"Development","unit_price":150,"quantity":40}]}'
curl "https://api.harvestapp.com/v2/expenses" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: user_id, client_id, project_id, is_billed, updated_since, from, to, page, per_page
curl "https://api.harvestapp.com/v2/expenses/{EXPENSE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/expenses" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"project_id":12345,"expense_category_id":67890,"spent_date":"2024-01-15","total_cost":50.00,"notes":"Office supplies"}'
curl "https://api.harvestapp.com/v2/expenses/{EXPENSE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"notes":"Updated expense notes"}'
curl "https://api.harvestapp.com/v2/expenses/{EXPENSE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-X DELETE
curl "https://api.harvestapp.com/v2/expense_categories" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
Query parameters: is_active, updated_since, page, per_page
curl "https://api.harvestapp.com/v2/expense_categories/{EXPENSE_CATEGORY_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/expense_categories" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name":"Travel"}'
curl "https://api.harvestapp.com/v2/reports/time/clients" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/time/projects" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/time/tasks" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/time/team" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/uninvoiced" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/expenses/clients" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/expenses/projects" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/expenses/categories" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/expenses/team" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-G \
-d "from=2024-01-01" \
-d "to=2024-01-31"
curl "https://api.harvestapp.com/v2/reports/project_budget" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/company" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/company" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"wants_timestamp_timers":true}'
curl "https://api.harvestapp.com/v2/roles" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/roles/{ROLE_ID}" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)"
curl "https://api.harvestapp.com/v2/roles" \
-H "Authorization: Bearer $HARVEST_ACCESS_TOKEN" \
-H "Harvest-Account-Id: $HARVEST_ACCOUNT_ID" \
-H "User-Agent: MyApp (me@example.com)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name":"Developer","user_ids":[12345,67890]}'
All list endpoints support pagination with page and per_page parameters. Responses include:
page: Current page numbertotal_pages: Total number of pagestotal_entries: Total number of recordsnext_page: Next page number (null if last page)previous_page: Previous page number (null if first page)Harvest API has a rate limit of 100 requests per 15 seconds. Response headers include:
X-Rate-Limit-Limit: Request limitX-Rate-Limit-Remaining: Remaining requestsX-Rate-Limit-Reset: Seconds until limit resets