Show All Users

GET https://YOURACCOUNT.harvestapp.com/people

You may also use the user’s email address in place of a User ID

HTTP Response: 200 OK

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <id type="integer">508343</id>
    <email>user@example.com</email>
    <created-at type="dateTime">2013-04-30T20:28:12Z</created-at>
    <is-admin type="boolean">true</is-admin>
    <is-project-manager type="boolean">false</is-project-manager>
    <first-name>Harvest</first-name>
    <last-name>User</last-name>
    <timezone>Eastern Time (US &amp; Canada)</timezone>
    <is-contractor type="boolean">false</is-contractor>
    <telephone></telephone>
    <is-active type="boolean">true</is-active>
    <has-access-to-all-future-projects type="boolean">true</has-access-to-all-future-projects>
    <default-hourly-rate type="decimal">0</default-hourly-rate>
    <department></department>
    <wants-newsletter type="boolean">true</wants-newsletter>
    <updated-at type="dateTime">2015-04-29T14:54:19Z</updated-at>
    <cost-rate type="decimal" nil="true"/>
    <identity-account-id type="integer">302900</identity-account-id>
    <identity-user-id type="integer">20725</identity-user-id>
</user>
{
    "user": {
        "id": 508343,
        "email": "user@example.com",
        "created_at": "2013-04-30T20:28:12Z",
        "is_admin": true,
        "is_project_manager": false,
        "first_name": "Harvest",
        "last_name": "User",
        "timezone": "Eastern Time (US & Canada)",
        "is_contractor": false,
        "telephone": "",
        "is_active": true,
        "has_access_to_all_future_projects": true,
        "default_hourly_rate": 0,
        "department": "",
        "wants_newsletter": true,
        "updated_at": "2015-04-29T14:54:19Z",
        "cost_rate": null,
        "identity_account_id": 302900,
        "identity_user_id": 20725
    }
}

To return a single user, you’ll want to use the request:

GET https://YOURACCOUNT.harvestapp.com/people/{USERID}

You can also filter by updated_since to only show people that have been updated since the date you pass:

GET https://YOURACCOUNT.harvestapp.com/people?updated_since=2015-04-25+18%3A30

Create A New User

POST https://YOURACCOUNT.harvestapp.com/people

HTTP Response: 201 Created

Upon creation, we’ll send an email to the user with instructions for setting a password.

At minimum, you’ll need to include values for email, first-name, and last-name

Optionally, you can include the following values:

  • is-admin - To create a new admin user.
  • is-project-manager - If true this user will automatically be marked as a project manager when assigned to a project.
  • timezone - To set a timezone other than the account default.
  • is-contractor - To create a new contractor user.
  • telephone - Telephone number for user.
  • is-active - If the user is active, or archived (true, false)
  • has-access-to-all-future-projects - If true this user will automatically be assigned to all new projects.
  • default-hourly-rate - Default rate for the user in new projects, if no rate is specified.
  • department - Department for user.
  • cost-rate - Cost (internal) rate for user.
Example request in Postman

<user>
    <email>user@example.com</email>
    <is-admin type="boolean">true</is-admin>
    <is-project-manager type="boolean">false</is-project-manager>
    <first-name>New</first-name>
    <last-name>User</last-name>
    <timezone>Eastern Time (US &amp; Canada)</timezone>
    <is-contractor type="boolean">false</is-contractor>
    <telephone></telephone>
    <is-active type="boolean">true</is-active>
    <has-access-to-all-future-projects type="boolean">true</has-access-to-all-future-projects>
    <default-hourly-rate type="decimal">0</default-hourly-rate>
    <department></department>
    <cost-rate type="decimal" nil="true"/>
</user>
{
    "user": {
        "email": "user@example.com",
        "is_admin": true,
        "is_project_manager": false,
        "first_name": "Harvest",
        "last_name": "User",
        "timezone": "Eastern Time (US & Canada)",
        "is_contractor": false,
        "telephone": "",
        "is_active": true,
        "has_access_to_all_future_projects": true,
        "default_hourly_rate": 0,
        "department": "",
        "cost_rate": null
    }
}

Update A User

PUT https://YOURACCOUNT.harvestapp.com/people/{USERID}

HTTP Response: 200 OK

You can update selected attributes for a user with this request. Note, updates to password are disregarded.

Upon a successful request, we’ll return Location: /people/{USERID}.

<user>
    <email>user@example.com</email>
    <is-admin type="boolean">true</is-admin>
    <is-project-manager type="boolean">false</is-project-manager>
    <first-name>New</first-name>
    <last-name>User</last-name>
    <timezone>Eastern Time (US &amp; Canada)</timezone>
    <is-contractor type="boolean">false</is-contractor>
    <telephone></telephone>
    <is-active type="boolean">true</is-active>
    <has-access-to-all-future-projects type="boolean">true</has-access-to-all-future-projects>
    <default-hourly-rate type="decimal">0</default-hourly-rate>
    <department></department>
    <cost-rate type="decimal" nil="true"/>
</user>
  {
    "user": {
        "email": "user@example.com",
        "is_admin": true,
        "is_project_manager": false,
        "first_name": "Harvest",
        "last_name": "User",
        "timezone": "Eastern Time (US & Canada)",
        "is_contractor": false,
        "telephone": "",
        "is_active": true,
        "has_access_to_all_future_projects": true,
        "default_hourly_rate": 0,
        "department": "",
        "cost_rate": null
    }
}

Delete A User

DELETE https://YOURACCOUNT.harvestapp.com/people/{USERID}

If the user has no hours or expenses, we’ll return HTTP Response: 200 OK, otherwise, we’ll return HTTP Response: 400 Bad Request. For users with time and expenses, please archive them instead.

Toggle An Existing User

POST https://YOURACCOUNT.harvestapp.com/people/{USERID}/toggle

Use this request archive, or re-activate a user. Upon a successful request, we’ll return HTTP Response: 200 OK. If you don’t have space for the user within your plan limits, we’ll return HTTP Response: 400 Bad Request.