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

Endpoints

GET /clients

Clients, by name.

Inputs

NameTypeWhat it is
limit, offsetwhole numbersPaging: limit 1 to 100 (default 50); offset from next_offset.

Answer: clients (a list) and next_offset

NameTypeWhat it is
id, nametextUse id as client_id when filtering projects.
contact_name, email, phone, notestext or null
created_at, updated_attextUTC time, like 2026-11-03 07:09:01.

GET /projects

Projects (not archived), by name.

Inputs

NameTypeWhat it is
client_idtextOnly this client's projects.
statustextOnly projects with this status, for example active.
limit, offsetwhole numbersPaging.

Answer: projects (a list) and next_offset

NameTypeWhat it is
id, nametext
client_id, descriptiontext or null
billing_modeinternal, fixed_price, time_and_material or retainerHow the project is billed.
budget_amount, hourly_rate, retainer_amountwhole number or null, minor unitsContract value (fixed price), hourly rate (time and material) and monthly fee (retainer).
retainer_hoursnumber or nullThe monthly hours allowance; null means uncapped.
currency3 lettersOne currency per project.
statustextDefaults are planning, active, on_hold, completed and archived; an organization can rename them.
start_date, target_end_datedate or null
created_at, updated_attextUTC time.

GET /projects/{id}

One project.

Inputs

NameTypeWhat it is
id*textThe project's id.

Answer: project

NameTypeWhat 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

NameTypeWhat it is
project_idtextOnly this project's tasks.
statustextFor example in_progress.
assigned_totextOnly tasks assigned to this user id.
limit, offsetwhole numbersPaging.

Answer: tasks (a list) and next_offset

NameTypeWhat it is
id, project_id, titletext
parent_task_idtext or nullSet on a subtask.
descriptiontext or null
statustextDefaults are todo, in_progress, in_review and done; an organization can rename them.
prioritylow, medium or high
estimatenumber or nullStory points or planned hours or days; the unit is a label the team chooses.
assigned_totext or nullThe assignee's user id.
due_datedate or null
created_at, updated_attextUTC time.

GET /time-entries

Logged time, newest first.

Your own, unless your role can view everyone's.

Inputs

NameTypeWhat it is
project_idtextOnly this project.
fromdate, YYYY-MM-DDEarliest entry date.
todate, YYYY-MM-DDLatest entry date.
limit, offsetwhole numbersPaging.

Answer: time_entries (a list) and next_offset

NameTypeWhat it is
id, project_idtext
task_idtext or null
user_idtextWho logged the time.
entry_datedate
minuteswhole numberTime logged, in minutes.
is_billable0 or 1
sourcemanual, timer, pomodoro or timesheetHow it was logged.
notetext or null
created_attextUTC 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.