You can think of a project as a contract you have with a client. It usually ends with a deliverable of some sort or as a line item on an invoice and can have custom billing details that override category. A valid project is required when creating an activity.

Project Model

  "id": "5b85933b1984af0c1bdf0174",
  "created_at": "2018-08-28T18:23:55.734Z",
  "name": "Excursion Tunnel – Order: 0001",
  "description": "Manufacture and delivery of 3 units.",
  "client": {
    "id": "5b85951bb7d8cf5cf9cc3b18",
    "name": "Black Mesa"
  "code": "0001",
  "location": "Upper Michigan Facility",
  "is_billable": true,
  "bill_rate": 100000000000000, // pennies
  "bill_unit": "fixed"

Create Project

POST /api/v2/projects HTTP/1.1
  "name": "Excursion Tunnel – Order: 0001", // Required
  "description": "Manufacture and delivery of 3 units.",
  "client_id": "5b85951bb7d8cf5cf9cc3b18",
  "code": "0001",
  "location": "Upper Michigan Facility",
  "is_billable": true,
  "bill_rate": 100000000000000,
  "bill_unit": "fixed"

Update Project

PUT /api/v2/projects/{id} HTTP/1.1

List Projects

GET /api/v2/projects HTTP/1.1

Optional Query Parameters

  "per_page": 25,
  "page": 1,
  "start_date": "2018-01-01",
  "end_date": "2018-02-01",
  "filter": "status:inactive",
  "order_by": "name",
  "search": "block mayonnaise",
  "list": true

Tali uses fuzzy matching to find the nearest results for your search term. It will match against the name and description of each project, weighted heavier against name.

Tali will only return results that are above a 30% confidence value and the response will return a lighter payload of only id, name, description, and confidence.

List View

By setting this query parameter, the results are returned as only the id and name of each project, and are not paginated. This is useful if you want to retrieve a light payload of EVERY project.

Single Project

GET /api/v2/projects/{id} HTTP/1.1

Delete/ Recover Project

DELETE /api/v2/projects/{id} HTTP/1.1
POST /api/v2/projects/{id}/recover HTTP/1.1