---
title: "Stop the running timer"
method: POST
path: "/api/v1/timer/stop"
---

# Stop the running timer

`POST /api/v1/timer/stop`

## Request

- Base URL: `https://tallymeter.com`
- URL: `https://tallymeter.com/api/v1/timer/stop`
- Auth: HTTP bearer

Stops the running timer and returns the stopped entry. Idempotent: when no timer is running this still returns 200 with `stopped: null`, so retries are safe. Requires the `timer` scope.

## Response `200`

Timer stopped, or nothing was running

- object
  - `running` false, required
  - `stopped` TimeEntry, required
    - `id` integer, required
    - `description` string, nullable, required
    - `project_id` integer, nullable, required
    - `project_name` string, nullable, required
    - `started_at` string, date-time, required: ISO-8601 UTC
    - `ended_at` string, date-time, nullable, required: ISO-8601 UTC; null while running
    - `duration_seconds` integer, required
    - `is_running` boolean, required
    - `source` 'web' | 'api' | 'mcp', required: Surface that created the entry
    - `agent` string, nullable, required: Name of the API token (= agent) that created the entry; null for web-created entries
  - `message` string: Only present when no timer was running.

## Other responses

- `401`: Missing or invalid token
- `403`: Token lacks the required scope, or the account has no active plan

---

[API](https://skmtc.dev/tallymeter/apis/tallymeter-api.md) · [All operations](https://skmtc.dev/tallymeter/apis/tallymeter-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tallymeter/apis/tallymeter-api/revisions/50044367b64e?raw)
