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
Metadata
Release files for things-api 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| things_api-0.3.2.tar.gz | 71.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| things_api-0.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 89.2 kB
Release files / things_api-0.3.2.tar.gz
| Download URL | things_api-0.3.2.tar.gz |
|---|---|
| Size | 71.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e07d412a16dee91fe244598c821153e3fea9414552b209bc7251ac06554234b4
|
|
BLAKE2b-256 checksum How to use checksums |
1a6d9097d55016e473b95f04b0f1030e2a7def0c70d13af3c0e288f3a5f67f78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 5, 2026.
Transparency logRelease files / things_api-0.3.2-py3-none-any.whl
| Download URL | things_api-0.3.2-py3-none-any.whl |
|---|---|
| Size | 17.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d46d1627423569ba03c3c212ea06c427f5ab1b467e8222414f603d0b3becb73f
|
|
BLAKE2b-256 checksum How to use checksums |
65ccb48f7f16111da723bb6862ff2eb1ab54254ed1ba912d14560ffffaaea845
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 5, 2026.
Transparency log