Clockify Export
Export your Clockify time entries to CSV files, even on the Free plan.
In April/May 2026, Clockify restricted the Free plan: CSV/Excel exports and reports longer than 31 days now require a paid plan. The API itself, however, is still available on the Free plan (30 requests/hour/workspace).
This tool uses the time entries API (not the reports API), so it is not subject to the 31-day reporting window. It paginates through all your entries and writes one CSV per calendar month.
Features
- ✅ Multi-workspace — exports all your workspaces (or select with
-w) - ✅ Incremental — remembers what was exported and only fetches new entries
- ✅ Monthly CSVs — one file per calendar month, current month gets re-exported/overwritten
- ✅ Per-workspace stat — state is tracked in
~/.config/clockify-export/state.json - ✅ Zero dependencies — stdlib only (
urllib,csv,json), Python ≥ 3.11 - ✅ Config file — API key + export path in
~/.config/clockify-export/config.toml
Installation
Requires uv (or any Python 3.11+ + pip).
Global install (recommended, adds clockify-export to your PATH)
uv tool install clockify-export # from PyPI
# or from a local checkout:
uv tool install .
Updates: uv tool upgrade clockify-export.
Development (from a checkout)
uv sync
Setup
1. API key
Generate an API key in Clockify: Profile → Preferences → API → Manage API Keys → Generate.
Provide it via one of (highest priority first):
# a) Config file (recommended)
clockify-export --init-config
# then edit ~/.config/clockify-export/config.toml:
#
# # Clockify export configuration
# api_key = "YOUR_KEY"
# export_dir = "export"
# b) Environment variable
export CLOCKIFY_API_KEY=YOUR_KEY
# c) .env file in the project directory
echo "CLOCKIFY_API_KEY=YOUR_KEY" > .env
# d) Command line flag
clockify-export --api-key YOUR_KEY
Note: TOML is parsed with Python's stdlib
tomllib— no extra dependency.
2. Export directory
Defaults to ./export. Override via config file or -o flag:
clockify-export -o /data/clockify
Usage
# Full export of all workspaces (everything since the beginning)
clockify-export --full
# Incremental export (default — only fetches entries after last run)
clockify-export
# Export only specific workspace(s)
clockify-export -w "Peter's workspace"
# Export since a specific date (ignores incremental state)
clockify-export --from 2026-01-01
# Show export state
clockify-export --status
Output structure
export/
└── <workspace name>/
└── <year>/
└── <workspace name>_<year>-<month>.csv
Each filename carries the workspace and year, so files stay identifiable even if you copy or move them out of the directory tree:
export/etalytics workspace/2026/etalytics workspace_2026-09.csv
CSV columns
| Column | Description |
|---|---|
Date |
Entry date (YYYY-MM-DD) |
Start |
Start time (HH:MM, UTC) |
End |
End time (HH:MM, UTC) |
Duration (h) |
Duration in decimal hours (e.g. 1.5 = 1h 30m) |
Project |
Project name |
Customer |
Client/customer name |
Task |
Task name |
Description |
Entry description |
Tags |
Comma-separated tags |
Billable |
True/False |
Hourly Rate |
Billable rate (e.g. 13.00) |
Currency |
Currency code (e.g. EUR) |
Type |
Entry type (REGULAR, BREAK, …) |
Timezone |
Timezone of the entry (e.g. Europe/Berlin) |
How incremental export works
The tool stores the last exported date per workspace in
~/.config/clockify-export/state.json:
{
"5e9d613a265d3c117c6f3aeb": {
"last_exported": "2026-09-30T00:00:00+00:00",
"updated_at": "2026-09-10T10:20:38.530213+00:00"
}
}
On the next run, entries are fetched starting the day after last_exported.
Monthly CSVs are overwritten entirely, so a partially written current month is
always consistent.
Free plan considerations
- Rate limit: 30 API requests/hour/workspace on Free plan. Each page of
200 entries = 1 request. A full export of thousands of entries can exhaust
the quota — that's why
--fromand--fullexist, and why the tool fetches tasks only for projects that actually have entries. - If you hit the rate limit (HTTP 429), wait an hour and run again — the incremental state means you won't re-fetch everything.
Related projects
- Clockify API docs
- damirarh/ClockifyExport — C# tool using shared reports (paid-only on Free plan now)
- apet97/clockify-ts-sdk — community TypeScript SDK/CLI
License
MIT
Release files for clockify-export 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| clockify_export-0.1.1.tar.gz | 10.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| clockify_export-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.0 kB
Release files / clockify_export-0.1.1.tar.gz
| Download URL | clockify_export-0.1.1.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c78f757192f35134a8fe3f5e061a7ed6b5d1cb951e827b8109ab123382a71103
|
|
BLAKE2b-256 checksum How to use checksums |
166d6344221601f8010c6fc88fcf1dfdd1edec6c157eb25d5a47f4d10e6dae1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / clockify_export-0.1.1-py3-none-any.whl
| Download URL | clockify_export-0.1.1-py3-none-any.whl |
|---|---|
| Size | 12.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
93f062f34740e8a2c15c8491f77f1df6f2df82ea7da21bb98285b227409c8a5b
|
|
BLAKE2b-256 checksum How to use checksums |
e28eeba439eb95f7e723a125f1e1c658128d411df3660f5b10939e9d3317d400
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|