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

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 with HTTP Response: 200 OK. If the project has hours, the project is not deleted and HTTP Response: 400 Bad Request is returned.