Tracker Projects API
Create, filter, update, categorize, and remove team-scoped time tracking projects through public API v1.
Tracker projects group time entries, billing defaults, customers, categories, and assigned users. Eigenn scopes every operation to the authenticated team.
Endpoints
| Method | Endpoint | Scope | Purpose |
|---|---|---|---|
GET | /tracker-projects | tracker-projects.read | List and filter projects |
POST | /tracker-projects | tracker-projects.write | Create a project |
GET | /tracker-projects/{id} | tracker-projects.read | Retrieve one project |
PATCH | /tracker-projects/{id} | tracker-projects.write | Update the fields that you send |
DELETE | /tracker-projects/{id} | tracker-projects.write | Delete a project and its time entries |
Prefix each endpoint with the environment base URL, such as https://api.eigenn.io/v1.
Create a Project
POST /tracker-projects needs name. All other fields are optional.
| Field | Type | Rules |
|---|---|---|
name | string | 1–255 characters after the whitespace trim |
description | string or null | Up to 2,000 characters |
estimate | integer or null | Non-negative estimated hours |
billable | boolean or null | Defaults to false when omitted |
rate | number or null | Non-negative hourly rate |
currency | string or null | Three uppercase ISO 4217 letters, such as USD |
status | enum | in_progress or completed |
customerId | UUID or null | Customer must belong to the authenticated team |
tags | array or null | Up to 50 team tags that already exist, each with id and value |
curl --request POST \
--url https://api.eigenn.io/v1/tracker-projects \
--header "Authorization: Bearer $EIGENN_API_TOKEN" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: project-website-redesign" \
--data '{
"name": "Website redesign",
"description": "Customer portal and billing experience",
"billable": true,
"rate": 175,
"currency": "USD",
"estimate": 120,
"status": "in_progress"
}'Creation returns 201 with the complete project.
Project Response
Project responses include:
- identity, name, description, status, and creation timestamp
- billing defaults:
billable,rate, andcurrency estimate,totalDurationin seconds, and calculatedtotalAmountcustomerIdand the linked customer summary- reusable category tags as
{ id, name } - assigned users as
{ id, fullName, avatarUrl }
customer, nullable customer fields, and user avatar URLs can be null. Do not assume a customer or profile image is always present.
List and Filter Projects
GET /tracker-projects accepts:
| Parameter | Rules |
|---|---|
cursor | Opaque offset cursor returned by the prior page |
pageSize | Integer from 1 to 100 |
q | Project name or description search |
start, end | YYYY-MM-DD creation-date bounds |
status | in_progress or completed |
customers | Up to 100 customer UUIDs |
tags | Up to 100 tag UUIDs. Eigenn returns the projects that match at least one tag |
sort | Two-item tuple: supported field and asc or desc |
Supported sort fields are time, amount, assigned, customer, tags, created_at, and name.
The response has data and pagination metadata with hasNextPage and hasPreviousPage. Keep the same filters and the same sort when you follow a cursor.
Update a Project
PATCH /tracker-projects/{id} accepts any non-empty subset of the create fields. Omitted fields keep their current values. Send null only for the fields that permit it in the schema. Send it only when you want to clear the field.
When you replace tags, you replace the project's complete category set. To manage one assignment at a time, use the Tracker Categories API.
Delete a Project
A delete operation removes the project permanently. Tracker entries reference projects with cascade deletion. Thus Eigenn also removes the related time entries. Export or reassign the necessary time records before you delete the project.
Common Errors
| Status | Cause |
|---|---|
401 | Missing or invalid bearer token |
403 | Missing tracker project scope |
404 | Project, customer, or category is outside the team or no longer exists |
409 | Duplicate or idempotency conflict |
422 | Invalid UUID, date, currency, field length, or request shape |