Sparky Projects API
Clients, projects, tasks and logged time. Read only.
- Address
- https://projects.sparkyli.com/api/v1
- Plan
- Plus and Max, with API access switched on for the organization
- Specification
- https://projects.sparkyli.com/api/v1/openapi.yaml
Endpoints
GET /clients
Clients, by name.
Inputs
| Name | Type | What it is |
|---|---|---|
| limit, offset | whole numbers | Paging: limit 1 to 100 (default 50); offset from next_offset. |
Answer: clients (a list) and next_offset
| Name | Type | What it is |
|---|---|---|
| id, name | text | Use id as client_id when filtering projects. |
| contact_name, email, phone, notes | text or null | |
| created_at, updated_at | text | UTC time, like 2026-11-03 07:09:01. |
GET /projects
Projects (not archived), by name.
Inputs
| Name | Type | What it is |
|---|---|---|
| client_id | text | Only this client's projects. |
| status | text | Only projects with this status, for example active. |
| limit, offset | whole numbers | Paging. |
Answer: projects (a list) and next_offset
| Name | Type | What it is |
|---|---|---|
| id, name | text | |
| client_id, description | text or null | |
| billing_mode | internal, fixed_price, time_and_material or retainer | How the project is billed. |
| budget_amount, hourly_rate, retainer_amount | whole number or null, minor units | Contract value (fixed price), hourly rate (time and material) and monthly fee (retainer). |
| retainer_hours | number or null | The monthly hours allowance; null means uncapped. |
| currency | 3 letters | One currency per project. |
| status | text | Defaults are planning, active, on_hold, completed and archived; an organization can rename them. |
| start_date, target_end_date | date or null | |
| created_at, updated_at | text | UTC time. |
GET /projects/{id}
One project.
Inputs
| Name | Type | What it is |
|---|---|---|
| id* | text | The project's id. |
Answer: project
| Name | Type | What it is |
|---|---|---|
| (all the list fields, and these) | The same fields as the list. |
Errors (besides the common ones)
- 404 not_found: No such project, or it is archived.
GET /tasks
Tasks, by due date.
Inputs
| Name | Type | What it is |
|---|---|---|
| project_id | text | Only this project's tasks. |
| status | text | For example in_progress. |
| assigned_to | text | Only tasks assigned to this user id. |
| limit, offset | whole numbers | Paging. |
Answer: tasks (a list) and next_offset
| Name | Type | What it is |
|---|---|---|
| id, project_id, title | text | |
| parent_task_id | text or null | Set on a subtask. |
| description | text or null | |
| status | text | Defaults are todo, in_progress, in_review and done; an organization can rename them. |
| priority | low, medium or high | |
| estimate | number or null | Story points or planned hours or days; the unit is a label the team chooses. |
| assigned_to | text or null | The assignee's user id. |
| due_date | date or null | |
| created_at, updated_at | text | UTC time. |
GET /time-entries
Logged time, newest first.
Your own, unless your role can view everyone's.
Inputs
| Name | Type | What it is |
|---|---|---|
| project_id | text | Only this project. |
| from | date, YYYY-MM-DD | Earliest entry date. |
| to | date, YYYY-MM-DD | Latest entry date. |
| limit, offset | whole numbers | Paging. |
Answer: time_entries (a list) and next_offset
| Name | Type | What it is |
|---|---|---|
| id, project_id | text | |
| task_id | text or null | |
| user_id | text | Who logged the time. |
| entry_date | date | |
| minutes | whole number | Time logged, in minutes. |
| is_billable | 0 or 1 | |
| source | manual, timer, pomodoro or timesheet | How it was logged. |
| note | text or null | |
| created_at | text | UTC time. |
Example
curl -s -H "authorization: Bearer $TOKEN" "https://projects.sparkyli.com/api/v1/tasks?status=open" New here? Start with the three things first, then sign in. Errors are explained under errors and limits.