Keep your Harvest API integrations — change one URL
Updated 2026-10-21 · Written by the Feestead team
Many teams built scripts, dashboards and invoicing jobs on the Harvest v2 API. Feestead speaks the same API for time tracking data, so moving off Harvest doesn't mean rewriting them.
What changes
- https://api.harvestapp.com/v2/time_entries + https://feestead.com/v2/time_entries Authorization: Bearer <Feestead token from Settings> Harvest-Account-Id: <your Feestead account ID>
The Harvest-Account-Id header, access_token/account_id query parameters, pagination envelope (per_page, total_pages, next_page, links.next) and object shapes match Harvest's. The API is also available under /api/v2/.
Supported endpoints
| Endpoint | Methods |
|---|---|
/users/me, /users, /users/{id}, /company | GET |
/clients, /tasks, /projects | GET, POST |
/clients/{id}, /tasks/{id}, /projects/{id} | GET, PATCH, DELETE |
/projects/{id}/task_assignments, /task_assignments, /users/me/project_assignments | GET |
/time_entries | GET (user_id, client_id, project_id, task_id, from, to, is_running, is_billed, updated_since), POST |
/time_entries/{id} | GET, PATCH, DELETE |
/time_entries/{id}/restart, /stop | PATCH |
Creating time entries works with hours (duration), started_time/ended_time, or neither (starts a timer) — like Harvest.
Not supported (yet)
Invoices, estimates, expenses, roles and user assignments endpoints. If your integration needs one of these, tell us — real use cases decide what we build next.
Example: weekly hours by project in Python
import requests
BASE = "https://feestead.com/v2" # was https://api.harvestapp.com/v2
H = {"Authorization": "Bearer hw_...", "Harvest-Account-Id": "1"}
url, totals = f"{BASE}/time_entries?from=2026-10-12&to=2026-10-18", {}
while url:
page = requests.get(url, headers=H).json()
for e in page["time_entries"]:
totals[e["project"]["name"]] = totals.get(e["project"]["name"], 0) + e["hours"]
url = page["links"]["next"]
print(totals)
Migrating an integration safely
- Import your Harvest account so IDs and data exist in Feestead.
- Create a token in Settings → API access.
- Run your script against Feestead in read-only mode and compare output with Harvest.
- Switch writes once totals match.
Note: record IDs differ between Harvest and Feestead. If your script stores Harvest IDs, map them by name or re-fetch after import.
Move from Harvest without losing a minute
Paste a Harvest token, import everything, and check every project against Harvest's numbers before you cancel. Free for one person; $11 per person per month for teams, with no usage fees.