REST API, 20 MCP tools, and hook integrations — everything you need to wire ClockMe into any AI coding tool or automation.
Three curl commands to get a timer running.
1. Start a timer
curl -X POST https://clockme.co/api/timer/start \
-H "Authorization: Bearer ck_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"projectName":"my-project","fallbackProjectId":"PROJECT_ID"}'2. Check status
curl https://clockme.co/api/timer/current \
-H "Authorization: Bearer ck_live_YOUR_KEY"3. Stop the timer
curl -X POST https://clockme.co/api/timer/stop \
-H "Authorization: Bearer ck_live_YOUR_KEY" \
-H "Content-Length: 0"All requests use a Bearer token. Generate keys in Setup or Settings → API Keys.
Authorization: Bearer ck_live_YOUR_KEYScopes
read | GET requests only |
write | Create entries, start/stop timers |
full | Unrestricted access |
Rate limits
| Free | 60 req / min |
| Pro | 300 req / min |
| Team | 1,000 req / min |
Base URL: https://clockme.co. Full schema at /api/openapi.
| Method | Path | Description |
|---|---|---|
| GET | /api/projects | List all active projects |
| POST | /api/projects | Create a new project |
| POST | /api/tasks | Create a task in a project |
| GET | /api/timer/current | Get the currently running timer |
| POST | /api/timer/start | Start a timer (projectId or projectName) |
| POST | /api/timer/stop | Stop the running timer |
| POST | /api/entries | Log a completed time entry |
| PATCH | /api/entries/{id} | Edit a time entry |
| DELETE | /api/entries/{id} | Delete a time entry |
| GET | /api/reports | Billing summary grouped by project |
| GET | /api/workspaces | List workspaces you belong to |
| POST | /api/workspaces/join | Join a workspace by invite code |
| GET | /api/workspaces/{id}/summary | Team hours by member and project |
Pick an endpoint, paste your API key, edit the request, and run it against the live API. Destructive verbs require confirmation. All calls go to https://clockme.co and read/write your real account.
20 tools exposed via Model Context Protocol at https://clockme.co/api/mcp. Compatible with Claude Code, Cursor, Windsurf, GitHub Copilot, and Gemini CLI.
// ~/.claude/settings.json (Claude Code)
{
"mcpServers": {
"clockme": {
"type": "http",
"url": "https://clockme.co/api/mcp",
"headers": { "Authorization": "Bearer ck_live_YOUR_KEY" }
}
}
}| Tool | Key params | Description |
|---|---|---|
clockme_start_timer | projectId | projectName, autoCreate?, description?, taskId? | Start a timer; fuzzy-matches projectName — autoCreate makes the project if it's new |
clockme_stop_timer | projectId? | Stop running timer, records duration |
clockme_pause_timer | projectId? | Pause a running timer |
clockme_resume_timer | projectId? | Resume a paused timer |
clockme_status | — | All running timers with elapsed time |
clockme_update_timer | currentProjectId, description?, projectId? | Edit description or move timer to a different project |
clockme_log_time | projectId, startTime, durationMinutes | endTime | Log a completed time block; supports idempotencyKey |
clockme_edit_entry | entryId, description?, projectId?, billable? | Edit any field of a completed entry |
clockme_list_projects | — | List active projects with IDs, rates, and budgets |
clockme_get_project | projectId | Full project details: tasks, budget, all-time hours |
clockme_create_project | name, hourlyRate?, budgetHours?, ... | Create a project, returns ID |
clockme_update_project | projectId, name?, hourlyRate?, ... | Update any project field |
clockme_list_tasks | projectId, status? | List tasks (active / complete / all) |
clockme_create_task | projectId, name, estimatedHours?, hourlyRate? | Create a task in a project |
clockme_complete_task | taskId | Mark a task as complete |
clockme_list_entries | projectId?, from?, to?, limit? | List time entries with date filters |
clockme_get_report | from, to | Billing summary by project for a date range |
clockme_get_budget | projectId | Budget burn: hours used vs limit, spend vs cap |
clockme_get_dashboard | — | Workspace overview: running timers, week totals, alerts |
clockme_get_team_summary | from?, to? | Team hours by member and by project for the active workspace |
Three hook events wire ClockMe into Claude Code's session lifecycle: SessionStart auto-starts a timer — the folder name ($CLAUDE_PROJECT_DIR) fuzzy-matches a ClockMe project, and autoCreate makes a project named after the folder if there's no match, so the hook never fails. UserPromptSubmit sends a heartbeat each turn, and SessionEnd stops the timer on clean exit. A server-side watchdog auto-stops idle MCP/hook timers after 30 min by default. Install once globally — every repo is tracked with zero per-project setup.
Do not use the Stop event for stopping — it fires after every assistant response, not at session end. Use SessionEnd.
// ~/.claude/settings.json
{
"mcpServers": {
"clockme": {
"type": "http",
"url": "https://clockme.co/api/mcp",
"headers": {
"Authorization": "Bearer ck_live_YOUR_KEY"
}
}
},
"hooks": {
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "curl -sf --max-time 10 -X POST https://clockme.co/api/timer/start -H 'Authorization: Bearer ck_live_YOUR_KEY' -H 'Content-Type: application/json' -d \"{\\\"projectName\\\":\\\"$(basename \"$CLAUDE_PROJECT_DIR\")\\\",\\\"autoCreate\\\":true,\\\"source\\\":\\\"hook\\\",\\\"description\\\":\\\"Claude Code session\\\"}\" > /dev/null",
"shell": "bash"
}
]
}
],
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "curl -sf --max-time 10 -X POST https://clockme.co/api/timer/stop -H 'Authorization: Bearer ck_live_YOUR_KEY' -H 'Content-Type: application/json' -d \"{\\\"projectName\\\":\\\"$(basename \"$CLAUDE_PROJECT_DIR\")\\\"}\" > /dev/null",
"shell": "bash"
}
]
}
],
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "curl -sf --max-time 10 -X POST https://clockme.co/api/timer/heartbeat -H 'Authorization: Bearer ck_live_YOUR_KEY' -H 'Content-Type: application/json' -d '{}' > /dev/null",
"shell": "bash"
}
]
}
]
}
}Requires curl — pre-installed on macOS and Linux; winget install curl on Windows. Prefer routing unmatched folders to one pinned project instead of creating new ones? Swap "autoCreate":true for "fallbackProjectId":"YOUR_PROJECT_ID" in the start command. Use the Setup wizard to generate either variant with your key pre-filled.
Hooks not firing on Windows? Claude Code runs these commands through Git Bash, which it looks for in C:\Program Files\Git. If Git is installed anywhere else, hooks die silently with "Git Bash was not found". Fix: set the CLAUDE_CODE_GIT_BASH_PATH environment variable to your bash.exe (e.g. setx CLAUDE_CODE_GIT_BASH_PATH "D:\Tools\Git\bin\bash.exe"). To see what your hooks are actually doing, run claude --debug-file hooks.log and check the log for hook errors.
Every account has a personal workspace; you can create shared ones and invite teammates with a link. Projects, tasks, and budgets belong to a workspace — every member sees them. Time entries stay personally authored: members can readeach other's entries, but an entry can only be created or edited by its author. Two roles: owner (manages invites and members) and member.
API calls are scoped to your active workspace: project and task lists are workspace-wide, while timer control and "my hours" reports stay personal. The clockme_get_team_summary MCP tool and GET /api/workspaces/{id}/summaryaggregate hours by member and by project — in a solo workspace that's just your own hours.
# Who's logged what this month?
curl https://clockme.co/api/workspaces/WORKSPACE_ID/summary?from=2026-06-01&to=2026-06-30 \
-H 'Authorization: Bearer ck_live_YOUR_KEY'
# List workspaces you belong to (IDs, roles, member counts)
curl https://clockme.co/api/workspaces \
-H 'Authorization: Bearer ck_live_YOUR_KEY'Manage your team — invites, members, switching workspaces — from the Team page in the dashboard.
Step-by-step setup for each AI coding tool.
Also see: all integrations (GitHub, Linear, Notion, Zapier, Slack).
Can't find your answer? Email us.