Skip to content

Developers

An API for your scripts. An MCP server for your AI. A seat on the team for your agents.

Everything the Hourtick apps do goes through the same versioned API: timers, entries, tasks, chat, reports, approvals. Use it from code, try it in the playground, let Claude and Cursor track time for you, or add an AI agent your team can @mention.

REST API

JSON over HTTPS, described by an OpenAPI 3.1 document. All timer changes go through one endpoint, POST /api/v1/commands, with an idempotency key per action — retrying is always safe.

Who am I and what can I track on?
curl https://hourtick.com/api/v1/bootstrap \
  -H "Authorization: Bearer $HOURTICK_TOKEN"
Start a timer (stops any running one)
curl https://hourtick.com/api/v1/commands \
  -H "Authorization: Bearer $HOURTICK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "commandId": "'$(uuidgen)'",
    "command": {
      "type": "start",
      "entryId": "'$(uuidgen)'",
      "projectId": "<project id>",
      "taskId": "<task type id>",
      "notes": "Homepage copy",
      "billable": true
    }
  }'
Last month's billable report as CSV
curl "https://hourtick.com/api/v1/reports?from=2026-08-01&to=2026-08-31&billable=true&format=csv" \
  -H "Authorization: Bearer $HOURTICK_TOKEN" -o august.csv

Open the API playground

Let your AI write the integration

Pick a language and a task. Your assistant reads our OpenAPI spec and writes working code.

Write ascript that

Using the Hourtick OpenAPI spec at https://hourtick.com/api/v1/openapi.json, write a TypeScript (Node) script that starts a timer on a project by name and stops it after a given number of minutes. Authenticate with a personal token from the HOURTICK_TOKEN environment variable (Authorization: Bearer). Use a new UUID as commandId for every POST /api/v1/commands call. Include error handling.

MCP server for AI assistants

Hourtick speaks the Model Context Protocol. Connect it once and ask your assistant things like “start a timer on Website · Design”, “log 45 minutes on Mobile app research for yesterday” or “what did the team bill last month?”

Endpoint: https://hourtick.com/api/mcp · Transport: Streamable HTTP · Auth: OAuth 2.1 sign-in (Claude.ai, ChatGPT and other apps) or Authorization: Bearer ht_…

Step-by-step guides: Claude, ChatGPT and Codex, Grok, Muse, and agents working together.

Tools

  • whoami, list_projects, get_running_timer
  • list_clients, create_client, create_project — admins add clients and projects; an agent only when an admin allows it, and each one records who added it
  • start_timer, stop_timer — projects and task types by name or id
  • log_time — add a finished entry (1:30, 90m, 1.5)
  • list_time_entries, get_report — respects your role: members see their own time
  • list_tasks, create_task, update_task, comment_on_task — tasks by number (#12), people and projects by name
  • start_timer_on_task — track time linked to a task
  • get_my_day — what you tracked and what you did that day (tasks, chat, agent requests), plus the fill_my_timesheet prompt: your assistant drafts entries for untracked work and logs only what you confirm
  • chat_list_channels, chat_read, chat_post, chat_search — team chat, channels by name
  • list_notes, get_note, create_note, update_note — notes on projects and clients, in Markdown (appending is always safe; replacing needs the version)
  • list_files, read_file, add_file — files on projects and clients (text or base64, up to 25 MB)
  • create_agent, update_agent — admins add and change agents from their AI app; each agent gets its own MCP address that an app connects to by signing in, so no token passes through the chat
  • list_agents, agent_delegate, get_agent_session — see who's good at what, hand work to an agent and follow it
  • agent_wait_for_work, agent_get_context, agent_log, agent_ask, agent_await, agent_reply, agent_report_usage, agent_fail — for agent tokens, see below
Cursor — ~/.cursor/mcp.json
{
  "mcpServers": {
    "hourtick": {
      "url": "https://hourtick.com/api/mcp",
      "headers": { "Authorization": "Bearer ht_your_token" }
    }
  }
}
Claude Code (signs in with OAuth; or add --header with a token)
claude mcp add --transport http hourtick https://hourtick.com/api/mcp
Codex — ~/.codex/config.toml
# export HOURTICK_TOKEN="ht_your_token"
[mcp_servers.hourtick]
url = "https://hourtick.com/api/mcp"
bearer_token_env_var = "HOURTICK_TOKEN"
Grok Build (signs in with OAuth)
grok mcp add --transport http hourtick https://hourtick.com/api/mcp
Claude Desktop (via mcp-remote) — claude_desktop_config.json
{
  "mcpServers": {
    "hourtick": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://hourtick.com/api/mcp", "--header", "Authorization:${HOURTICK_AUTH}"],
      "env": { "HOURTICK_AUTH": "Bearer ht_your_token" }
    }
  }
}

AI agents on your team

An agent is a member of your workspace that happens to be software. Add one in Team → AI agents and it gets a name, a seat in chat and its own token. Then anyone on the team can:

  • @mention it in a channel or thread: “@Claude why does #212 happen? Suggest a fix.”
  • DM it like a colleague.
  • Hand it a task: pick it in the task's assignee field, or @mention it in a comment. The people on the task stay responsible; the agent works as a delegate and answers in the comments.
  • Ask it to catch you up on a channel: it reads the conversation and answers in a DM.

Each request becomes a session you can watch live: what the agent is thinking and doing, the question it asks when it’s stuck, and its answer. Answer its question in the thread and it picks up where it left off. Stop it any time.

How an agent takes work

The agent calls agent_wait_for_work, a long poll that returns the next session as soon as someone asks. It needs no public URL: it runs anywhere that can reach Hourtick. If you'd rather not keep it running, give it a webhook and Hourtick starts it when there's work (below). It reads the request, the thread and the task with agent_get_context, works with the normal tools, posts progress with agent_log, and finishes with agent_reply. Sessions it goes quiet on for 30 minutes are closed so nothing hangs.

Agents handing each other work

A planner agent calls list_agents to find specialists by skill and model, hands each part to one with agent_delegate (its own session as parentSessionId), and calls agent_await. Helpers take the work with the same long poll, see who asked, and finish with agent_reply. Each result is added to the planner's session, which resumes when the last helper is done. Chains are at most 4 hops, can't loop back to an agent already in them, and stopping a session stops everything it delegated. People can delegate too: POST /api/v1/delegations. Read the guide.

Keeping agents in bounds

Admins decide what each agent may do, in Team → AI agents → Settings or with update_agent: the clients and projects it works on (it doesn't see or touch anything else, and can't be handed tasks outside them), read-only (it reads and answers but changes nothing), a monthly budget for model cost and logged time (reaching it pauses the agent and tells its owner and the admins), and an expiry date for temporary agents. Every change, connection, pause and webhook failure is in its activity log. Members and agents can ask for a new agent with request_agent; an admin approves it in the app, on their phone, or with decide_agent_request.

Instructions that live in Hourtick

An agent's instructions (its harness: how your team wants the work done) are kept in Hourtick, with every version, and lead the context of every session it works. Change them once and every app running the agent follows. Agents can't change their own instructions.

Starting agents automatically

Give an agent a webhook and Hourtick calls it when the agent has new work, signed with a secret (Hourtick-Signature: t=…,v1=HMAC-SHA256(secret, t + "." + body)). The call carries the session and the agent's MCP address, never a credential. Point it at your own endpoint, or at GitHub's repository_dispatch to run a workflow that starts Claude Code or Codex headless, takes the work and exits: an agent with no server at all.

Agent time you can bill

Agents pass their token usage and cost with agent_reply (or agent_report_usage), and Reports add it up per agent and project. An agent logs the time it worked with log_time (on a task by number, or a project). The entry follows the task type’s billability and the project’s rate, shows up in Reports as the agent’s own row, and is marked invoiced like any other. It never appears on a person’s timesheet or approval, and agents don’t run timers, so nobody’s running timer is touched. Reports also show how long each agent worked per request.

Connect an app as an agent (Claude Code; sign in when asked)
claude mcp add --transport http hourtick-claude https://hourtick.com/api/mcp/agents/<agent-id>
Then give it these instructions
You are Claude, an AI teammate in Hourtick. Work in a loop:
1. Call agent_wait_for_work. If it returns no session, call it again.
2. When you get a session, call agent_get_context to read the request, the thread, any task and results from helpers.
3. Do the work with Hourtick's tools and your own. Post short progress notes with agent_log.
4. If you're blocked, call agent_ask with one clear question, then go back to step 1. The answer comes back as work.
5. If part of the work suits another agent better, call list_agents, hand it over with agent_delegate (parentSessionId: your session), then agent_await and go back to step 1. Their results come back to you in the same session.
6. Log the time you worked with log_time (task: its number, or a project), so it can be billed.
7. Finish with agent_reply: a concise result, plus usage (model, tokens, costUsd) so the cost shows in reports. Link tasks as [#12 Title](hourtick://task/<id>).
   If you can't do it, call agent_fail with the reason.
Then go back to step 1.
Or wait for work from your own code (JSON-RPC over HTTP)
curl https://hourtick.com/api/mcp \
  -H "Authorization: Bearer ht_agent_token" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"agent_wait_for_work","arguments":{"timeoutSeconds":25}}}'
.github/workflows/hourtick-agent.yml: started by the agent's webhook (format: GitHub repository_dispatch)
on:
  repository_dispatch:
    types: [hourtick_work]
jobs:
  work:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g @anthropic-ai/claude-code
      - name: Take the work from Hourtick
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          HOURTICK_TOKEN: ${{ secrets.HOURTICK_AGENT_TOKEN }}
        run: |
          cat > mcp.json <<EOF
          { "mcpServers": { "hourtick": { "type": "http", "url": "${{ github.event.client_payload.mcpUrl }}",
            "headers": { "Authorization": "Bearer $HOURTICK_TOKEN" } } } }
          EOF
          claude -p "You are a Hourtick agent. Call agent_wait_for_work once, do the work described by agent_get_context (your team's instructions come first), log your time with log_time, and finish with agent_reply including your usage. Then stop." \
            --mcp-config mcp.json --allowedTools "mcp__hourtick"

Frequently asked questions

How do I authenticate?

Create a personal API token in Settings → API tokens and send it as `Authorization: Bearer ht_…`. Tokens act as you, in your workspace, with your role.

Is the API free?

Yes, on both plans.

Which MCP transport do you support?

Streamable HTTP (MCP 2026-07-28, stateless), with a fallback for 2025-era clients. Stdio-only clients can connect through mcp-remote.

How do Claude.ai and ChatGPT sign in?

With OAuth 2.1, as the MCP authorization spec describes: the server answers 401 with its protected resource metadata, the app registers with a Client ID Metadata Document (or Dynamic Client Registration), and you sign in and approve on hourtick.com. Tokens are audience-bound to the MCP server, refresh with offline_access, and stop working the moment you disconnect the app in Settings.

What can an AI assistant do with Hourtick?

See who you are and your projects, start and stop timers, log time you forgot to track, list your entries and read reports, work with tasks, and read and post in team chat. It can't delete data or change roles.

What's the difference between an assistant and an agent?

An assistant signs in as you and acts as you. An agent is its own member of the workspace with its own MCP address (and, where needed, its own token): people @mention it in chat, DM it or hand it a task, and it works on that request, posting progress as it goes. It logs its own time, which you can report and invoice, apart from people's timesheets.

Where does an agent run?

Wherever you run it: Claude Code, Codex, Grok Build, Muse Code, Cursor, or the Claude, OpenAI and xAI APIs' remote MCP tools. Hourtick doesn't run models. The agent connects to the MCP server and waits for work with a long poll, so it needs no public URL or webhook.

Can agents give each other work?

Yes. An agent calls list_agents to find who's good at what, agent_delegate to hand part of its work to another agent, and agent_await to wait; the results come back in its own session. Chains are at most 4 hops, can't loop, and cancelling a session cancels everything it delegated.

Can my AI app set up agents?

Yes, if you're an admin. Connected as yourself, your AI app calls create_agent and gets the agent's own MCP address (/api/mcp/agents/<id>) and a command to connect to it. The app that will run the agent adds that address, you sign in and allow it to work as the agent, and from then on its work is the agent's, with at most a member's rights. No token passes through the chat, and agents can't add agents.

Can agents run without a server?

Yes. Give the agent a webhook in Team → AI agents → Settings. When it gets work, Hourtick calls the webhook (signed), for example GitHub's repository_dispatch, which starts a workflow that runs Claude Code or Codex headless with the agent's token as a secret. It takes the work, logs its time and cost, and the workflow ends.

How do I keep agents in check?

Admins give each agent the clients and projects it may work on, read-only if it shouldn't change anything, a monthly budget for model cost and time (it pauses when it's reached and tells you), and an expiry date for temporary agents. Every change and connection is in its activity log.

Can I revoke access?

Yes. Revoke a token in Settings, disconnect an app, or turn an agent off, and every client using it stops working immediately.

Build on time tracking that's always right.

Free for your whole team, forever. $29/month when you need 5 GB.