REST API for Things 3 — expose your tasks over HTTP
Project description
Things API
REST API for Things 3 — expose your tasks over HTTP.
Things API reads directly from the Things SQLite database via things.py and writes back through the Things URL scheme. It runs as a lightweight FastAPI service on any Mac where Things is installed, giving you full programmatic access to your tasks from tools like n8n, curl, or any HTTP client.
Getting started
Requirements: macOS with Things 3 installed and Python 3.12+.
1. Install
Run directly with uvx (no install needed):
uvx things-api
Or install with pip:
pip install things-api
Or clone the repo for development:
git clone https://github.com/jaydenk/things-api.git
cd things-api
uv venv && uv pip install -e .
2. Configure
Run the setup wizard:
things-api init
This generates an API token, checks your Things URL scheme settings, and writes the config to ~/.config/things-api/config. If you skip this step, the wizard runs automatically on first launch.
See docs/configuration.md for all configuration options.
3. Run
things-api
Override settings on the fly:
things-api --token my-token --port 8080
The server starts on http://localhost:5225 by default.
4. Try it
# Health check
curl http://localhost:5225/health \
-H "Authorization: Bearer YOUR_TOKEN"
# List today's tasks
curl http://localhost:5225/today \
-H "Authorization: Bearer YOUR_TOKEN"
# Create a todo (requires THINGS_AUTH_TOKEN)
curl -X POST http://localhost:5225/todos \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Buy milk", "when": "today"}'
To run the server persistently (auto-start at login, auto-restart on crash), see the deployment guide.
Endpoints overview
Every endpoint requires a valid Authorization: Bearer <token> header.
| Resource | Endpoints | Description |
|---|---|---|
| Todos | GET POST PUT DELETE /todos |
Full CRUD for todos |
| Projects | GET POST PUT DELETE /projects |
Full CRUD for projects |
| Smart lists | GET /inbox /today /upcoming /anytime /someday /logbook |
Read-only access to Things smart lists |
| Tags | GET /tags |
List tags and items by tag |
| Areas | GET /areas |
List areas |
| Search | GET /search /search/advanced |
Full-text and filtered search |
| Health | GET /health |
Service status and database connectivity |
Note:
DELETEon todos and projects is irreversible — it completes or cancels the item. Things 3 does not support true deletion.
See docs/api-reference.md for full endpoint details, request/response schemas, and query parameters.
Limitations
- macOS only — Things 3 is a Mac app. The API must run on the same machine.
- GUI session required for writes — Write operations invoke the Things URL scheme, which requires an active GUI session.
- No true deletion —
DELETEendpoints complete or cancel items instead.
Further documentation
- Configuration reference — All environment variables and their defaults
- API reference — Full endpoint documentation with request/response details
- Deployment guide — Running as a launchd service, n8n integration
- Development guide — Setting up a dev environment, running tests
- Changelog — Version history
Licence
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file things_api-0.3.2.tar.gz.
File metadata
- Download URL: things_api-0.3.2.tar.gz
- Upload date:
- Size: 71.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e07d412a16dee91fe244598c821153e3fea9414552b209bc7251ac06554234b4
|
|
| MD5 |
12d7ecb596cad79d78210153869683c5
|
|
| BLAKE2b-256 |
1a6d9097d55016e473b95f04b0f1030e2a7def0c70d13af3c0e288f3a5f67f78
|
Provenance
The following attestation bundles were made for things_api-0.3.2.tar.gz:
Publisher:
publish.yml on jaydenk/things-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
things_api-0.3.2.tar.gz -
Subject digest:
e07d412a16dee91fe244598c821153e3fea9414552b209bc7251ac06554234b4 - Sigstore transparency entry: 1238658215
- Sigstore integration time:
-
Permalink:
jaydenk/things-api@e00f67fa280bfa2245b45891fa1225dbf4bd82d1 -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/jaydenk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e00f67fa280bfa2245b45891fa1225dbf4bd82d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file things_api-0.3.2-py3-none-any.whl.
File metadata
- Download URL: things_api-0.3.2-py3-none-any.whl
- Upload date:
- Size: 17.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d46d1627423569ba03c3c212ea06c427f5ab1b467e8222414f603d0b3becb73f
|
|
| MD5 |
2a9f7887d04594d884a04f9f4293cbd7
|
|
| BLAKE2b-256 |
65ccb48f7f16111da723bb6862ff2eb1ab54254ed1ba912d14560ffffaaea845
|
Provenance
The following attestation bundles were made for things_api-0.3.2-py3-none-any.whl:
Publisher:
publish.yml on jaydenk/things-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
things_api-0.3.2-py3-none-any.whl -
Subject digest:
d46d1627423569ba03c3c212ea06c427f5ab1b467e8222414f603d0b3becb73f - Sigstore transparency entry: 1238658219
- Sigstore integration time:
-
Permalink:
jaydenk/things-api@e00f67fa280bfa2245b45891fa1225dbf4bd82d1 -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/jaydenk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e00f67fa280bfa2245b45891fa1225dbf4bd82d1 -
Trigger Event:
push
-
Statement type: