API Documentation
Overview
Time Tracking
Extended REST API
Clients
Client Contacts
Projects
Tasks
People
Expenses
Expense Tracking
User Assignment
Task Assignment
Reports
Invoices
Invoice Messages
Invoice Payments
Invoice Categories
Questions? Contact support
Overview
Time Tracking
Extended REST API
Clients
Client Contacts
Projects
Tasks
People
Expenses
Expense Tracking
User Assignment
Task Assignment
Reports
Invoices
Invoice Messages
Invoice Payments
Invoice Categories
Questions? Contact support
Projects
Show a project
GET /projects/#{project_id}
HTTP Response: 200 Success
<project> <id type="integer">1</id> <name>SuprGlu</name> <!-- True if hours can be recorded against this project. False if project is archived/inactive --> <active type="boolean">true</active> <billable type="boolean">false</billable> <!-- Shows if the project is billed by task hourly rate or person hourly rate Options: Tasks, People, none --> <bill-by>none</bill-by> <client-id type="integer">2</client-id> <!-- Optional project code --> <code></code> <notes></notes> <!-- Shows if the budget provided by total project hours, total project cost, by tasks, by people or none provided. Options: project, project_cost, task, person, none --> <budget-by>none</budget-by> <!-- Optional total budget in hours --> <budget type="decimal"></budget> <!-- FOR FUTURE USE --> <fees></fees> </project>
Show all projects
GET /projects
HTTP Response: 200 Success
<projects> <project> <id type="integer">1</id> <name>SuprGlu</name> <!-- True if hours can be recorded against this project. False if project is archived/inactive --> <active type="boolean">true</active> <billable type="boolean">false</billable> <!-- Shows if the project is billed by task hourly rate or person hourly rate Options: Tasks, People, Project, none --> <bill-by>none</bill-by> <!-- The hourly rate for the project, when bill-by is set to "Project" --> <hourly-rate type="decimal">150.0</hourly-rate> <client-id type="integer">2</client-id> <!-- Optional project code --> <code></code> <notes></notes> <!-- Shows if the budget provided by total project hours, total project cost, by tasks, by people or none provided. Options: project, project_cost, task, person, none --> <budget-by>none</budget-by> <!-- Optional total budget in hours --> <budget type="decimal"></budget> <!-- FOR FUTURE USE --> <fees></fees> </project> <project> ... </project> </projects>
Create new project
POST /projects
HTTP Response: 201 Created
Location: /projects/#{new_project_id}
You will have to post the following:
<project> <name>SuprGlu</name> <active type="boolean">true</active> <bill-by>none</bill-by> <!-- Valid and existing client id --> <client-id type="integer">2</client-id> <code></code> <notes></notes> <budget type="decimal"></budget> <budget-by>none</budget-by> </project>
An error is returned if you've hit the limit in number of projects for the account's plan.
Update existing project
PUT /projects/#{project_id}
HTTP Response: 200 OK
Location: /projects/#{project_id}
Post similar XML as with create a new project, but include client-id as part of the project. For
activating a project a separate method needs to be used.
(De)Activate an existing project
POST /projects/#{project_id}/toggle
HTTP Response: 200 Success
Location: /projects/#{project_id}
Note that if your account goes over the allowed project limit,
Harvest will return HTTP Response: 400 Bad Request,
with a Hint header.
Delete a project
DELETE /project/#{project_id}
If the project does not have any associated hours, it is deleted withHTTP Response: 200 OK.
If the project has hours, the project is not deleted and HTTP Response: 400 Bad Request is returned.