Core Resources

Projects

Manage projects, their tasks and the time tracked on them.

Overview

Projects group the work you do for a customer: tasks with status and priority, and time entries that you can bill. They belong to the Projects module of the company. All responses are wrapped in data.

MethodPathPermissionDescription
GET/v1/projectsreadList projects with filters (limit/offset pagination)
POST/v1/projectswriteCreate a project
GET/v1/projects/{id}readRetrieve a project
PATCH/v1/projects/{id}writeUpdate a project (status, dates, budget, archive...)
DELETE/v1/projects/{id}writeDelete a project
GET/v1/projects/{id}/tasksreadList the tasks of a project
POST/v1/projects/{id}/taskswriteCreate a task
GET PATCH DELETE/v1/projects/{id}/tasks/{taskId}read / writeRetrieve, update or delete a task
GET/v1/projects/{id}/time-entriesreadList time entries
POST/v1/projects/{id}/time-entrieswriteLog time
GET PATCH DELETE/v1/projects/{id}/time-entries/{entryId}read / writeRetrieve, update or delete a time entry
GET/v1/projects/{id}/time-entries/summaryreadHours, revenue, cost and profit of the project

Creating, updating or deleting projects and tasks emits the project.* and task.* webhook events, the same as in the dashboard.

List Projects

1curl "https://api.corebill.io/v1/projects?status=in_progress,review&limit=20" \
2 -H "Authorization: Bearer sk_live_your_api_key"
Query paramDescription
statusComma separated: draft, in_progress, on_hold, review, completed, cancelled
priorityComma separated: low, medium, high, urgent
customer_idProjects of one customer
assigned_toProjects assigned to a user id
is_archivedtrue or false
searchText search on the title
start_date_from / start_date_toStart date range (YYYY-MM-DD)
due_date_from / due_date_toDue date range (YYYY-MM-DD)
limit / offsetPage size (default 50) and offset

Create a Project

Bash
1curl -X POST "https://api.corebill.io/v1/projects" \
2 -H "Authorization: Bearer sk_live_your_api_key" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "title": "Website redesign",
6 "customer_id": "cus_abc123",
7 "status": "in_progress",
8 "priority": "high",
9 "billing_type": "time_based",
10 "hourly_rate": 80,
11 "budget_hours": 120,
12 "due_date": "2026-12-15"
13 }'
FieldTypeRequiredDescription
titlestringYesProject name
descriptionstringNoDescription
customer_idstringNoCustomer of the project
assigned_tostring[]NoUser ids of the organization
statusstringNoDefault draft
prioritystringNoDefault medium
start_date / due_datedateNoYYYY-MM-DD
billing_typestringNotime_based, fixed_price or mixed
budget_hours / budget_amountnumberNoBudget
hourly_ratenumberNoDefault rate for time entries
metadataobjectNoFree key/value data

PATCH /v1/projects/{id} accepts the same fields plus progress_percentage, completed_at and is_archived. Only the fields you send change.

Tasks

Bash
1curl -X POST "https://api.corebill.io/v1/projects/pro_abc123/tasks" \
2 -H "Authorization: Bearer sk_live_your_api_key" \
3 -H "Content-Type: application/json" \
4 -d '{ "title": "Design the home page", "priority": "high", "due_date": "2026-10-20", "estimated_hours": 6 }'
FieldTypeDescription
titlestringRequired
statusstringbacklog, todo, in_progress, in_review, completed, cancelled
prioritystringlow, medium, high, urgent
assigned_tostringUser id
parent_task_idstringMakes it a subtask
depends_onstring[]Task ids this task depends on
estimated_hoursnumberEstimate
start_date / due_datedateYYYY-MM-DD
is_billable / hourly_rateboolean / numberBilling of the task
tagsstring[]Labels

List filters for GET /v1/projects/{id}/tasks: status, priority, assigned_to, parent_task_id, search, limit, offset.

Time Entries

Bash
1curl -X POST "https://api.corebill.io/v1/projects/pro_abc123/time-entries" \
2 -H "Authorization: Bearer sk_live_your_api_key" \
3 -H "Content-Type: application/json" \
4 -d '{ "entry_date": "2026-10-11", "duration_minutes": 90, "hourly_rate": 80, "description": "Wireframes", "task_id": "tsk_abc123" }'
FieldTypeDescription
entry_datedateRequired. YYYY-MM-DD
duration_minutesnumberRequired. Greater than 0
hourly_ratenumberRequired. 0 or more
task_idstringTask the time belongs to
user_idstringWho worked (defaults to the key owner)
start_time / end_timestringOptional times
is_billablebooleanDefault true
internal_cost_ratenumberYour cost per hour (for profit)
descriptionstringWhat was done

List filters: user_id, task_id, is_billable, is_invoiced, entry_date_from, entry_date_to, search, limit, offset.

GET /v1/projects/{id}/time-entries/summary
1{
2 "data": {
3 "totalHours": 42.5,
4 "totalRevenue": 3400,
5 "totalCost": 1700,
6 "profit": 1700,
7 "billableHours": 40,
8 "nonBillableHours": 2.5,
9 "invoicedHours": 24,
10 "uninvoicedHours": 16
11 }
12}