Expensicat
API Reference

Projects

GET
/v1/projects

List projects with search and pagination

Authorization

bearerAuth
AuthorizationBearer <token>

Session JWT or OAuth2 access token

In: header

Query Parameters

cursor?string

Pagination cursor

limit?integer

Number of items per page (1-100; higher values cap at 100)

Range1 <= value
Default20
q?string

Search by name

status?string

Only active or only archived projects

Value in

  • "active"
  • "archived"

Response Body

application/json

application/json

curl -X GET "https://example.com/v1/projects"
{  "data": [    {      "id": "string",      "organization_id": "string",      "name": "string",      "customer_id": "string",      "hourly_rate": "string",      "currency": "string",      "active": true,      "estimate_minutes": 0,      "created_at": "string",      "updated_at": "string",      "customer": {        "id": "string",        "name": "string",        "email": "string",        "website": "string"      },      "tracked_seconds": 0,      "invoiced_seconds": 0,      "unbilled": {        "seconds": 0,        "amount": 0      },      "last_tracked_at": "string",      "running": [        {          "user_id": "string",          "start_time": "string"        }      ]    }  ],  "meta": {    "count": 0,    "next_cursor": "string"  }}
POST
/v1/projects

Create a new project

Authorization

bearerAuth
AuthorizationBearer <token>

Session JWT or OAuth2 access token

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X POST "https://example.com/v1/projects" \  -H "Content-Type: application/json" \  -d '{    "name": "string"  }'
{  "data": {    "id": "string",    "organization_id": "string",    "name": "string",    "customer_id": "string",    "hourly_rate": "string",    "currency": "string",    "active": true,    "estimate_minutes": 0,    "created_at": "string",    "updated_at": "string",    "customer": {      "id": "string",      "name": "string",      "email": "string",      "website": "string"    },    "tracked_seconds": 0,    "invoiced_seconds": 0,    "unbilled": {      "seconds": 0,      "amount": 0    },    "last_tracked_at": "string",    "running": [      {        "user_id": "string",        "start_time": "string"      }    ]  }}
GET
/v1/projects/{id}

Get a single project by ID

Authorization

bearerAuth
AuthorizationBearer <token>

Session JWT or OAuth2 access token

In: header

Path Parameters

id*string
Formatuuid

Response Body

application/json

application/json

application/json

curl -X GET "https://example.com/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08"
{  "data": {    "id": "string",    "organization_id": "string",    "name": "string",    "customer_id": "string",    "hourly_rate": "string",    "currency": "string",    "active": true,    "estimate_minutes": 0,    "created_at": "string",    "updated_at": "string",    "customer": {      "id": "string",      "name": "string",      "email": "string",      "website": "string"    },    "tracked_seconds": 0,    "invoiced_seconds": 0,    "unbilled": {      "seconds": 0,      "amount": 0    },    "last_tracked_at": "string",    "running": [      {        "user_id": "string",        "start_time": "string"      }    ]  }}
PATCH
/v1/projects/{id}

Update project fields

Authorization

bearerAuth
AuthorizationBearer <token>

Session JWT or OAuth2 access token

In: header

Path Parameters

id*string
Formatuuid

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X PATCH "https://example.com/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08" \  -H "Content-Type: application/json" \  -d '{}'
{  "data": {    "id": "string",    "organization_id": "string",    "name": "string",    "customer_id": "string",    "hourly_rate": "string",    "currency": "string",    "active": true,    "estimate_minutes": 0,    "created_at": "string",    "updated_at": "string",    "customer": {      "id": "string",      "name": "string",      "email": "string",      "website": "string"    },    "tracked_seconds": 0,    "invoiced_seconds": 0,    "unbilled": {      "seconds": 0,      "amount": 0    },    "last_tracked_at": "string",    "running": [      {        "user_id": "string",        "start_time": "string"      }    ]  }}
DELETE
/v1/projects/{id}

Delete a project by ID. Its time entries stay, without a project.

Authorization

bearerAuth
AuthorizationBearer <token>

Session JWT or OAuth2 access token

In: header

Path Parameters

id*string
Formatuuid

Response Body

application/json

application/json

curl -X DELETE "https://example.com/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08"
Empty