API Documentation

Time Tracking

Extended REST API
Clients
Projects
Tasks
People
Expenses
Expense Tracking
User Assignment
Task Assignment
Reports
Invoices
Invoice Messages
Invoice Payments
Invoice Categories


Questions?
Email support@getharvest.com

Projects

Show a project

GET /projects/#{project_id}

HTTP Response: 200 Success
<project>
  <id>1</id>
  <name>SuprGlu</name>
  <!-- True if hours can be recorded against this project. False if
  project is archived/inactive -->
  <active>true</active>
  <bill-by>none</bill-by>
  <client-id>2</client-id>
  <!-- Optional project code -->
  <code></code>
  <!-- Shows if the estimate provided by total project hours, by tasks, or none provided -->
  <estimate-by>none</estimate-by>  
  <!-- Optional total estimate in hours -->
  <estimate></estimate>
  <!-- FOR FUTURE USE -->
  <fees></fees>
</project>

Show all projects

GET /projects

HTTP Response: 200 Success
<projects>
  <project>
    <id>1</id>
    <name>SuprGlu</name>
    <!-- True if hours can be recorded against this project. False if
    project is archived/inactive -->
    <active>true</active>
    <bill-by>none</bill-by>
    <client-id>2</client-id>
    <!-- Optional project code -->
    <code></code>
    <!-- Shows if the estimate provided by total project hours, by tasks, or none provided -->
    <estimate-by>none</estimate-by>  
    <!-- Optional total estimate in hours -->
    <estimate></estimate>
    <!-- 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>true</active>
   <bill-by>none</bill-by>
   <!-- Valid and existing client id -->
   <client-id>2</client-id>
   <code></code>
   <estimate></estimate>
   <estimate-by>none</estimate-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 with HTTP Response: 200 OK. If the project has hours, the project is note deleted and HTTP Response: 400 Bad Request is returned.