description: Operate Jotty Notes self-hosted instances via REST API. Three instances — Rob (10.0.0.235), Zoe (10.0.0.212), Jennifer (10.0.0.213). Use for checklists, notes, tasks (Kanban), categories, user info, exports, or audit logs.
Covers all three self-hosted Jotty instances. All run Jotty v1.25.1. The API is identical across instances — only the base URL, API key, and owner name differ.
**Instance selection rule:** When the user says "jotty" or "my notes" without specifying, use the instance matching the active profile. When the user names a person ("Zoe's jotty", "Jennifer's checklist"), use that person's instance.
Rob and Jennifer have admin/superadmin access, so admin-only endpoints (logs stats, rebuild-index, export-all, querying other users' summary) are available on their instances. Zoe's key is user-tier — admin endpoints will 403.
Note that real items include `id`, `createdBy`, `lastModifiedBy`, `lastModifiedAt` beyond what the docs show — when presenting data to Jennifer, use these extra fields.
## Conventions to follow when talking to the user
- 0-based item indices everywhere (first item is `0`).
- Item references in URLs use dot-paths for nesting: `0`, `0.1`, `2.0.1`.
- Timestamps are ISO 8601 UTC (`createdAt`, `updatedAt`, etc.).
-`createdAt` for some seed data is the epoch (`1970-01-01T00:00:00.000Z`) — that's an upstream quirk, not an error. Prefer `updatedAt` for "last touched" answers.
- Default category for new items is `Uncategorized` if not specified.
- Default checklist `type` is `simple`; use `task` for Kanban with statuses + time tracking.
curl -X POST -H "x-api-key: $JOTTY_API_KEY" -H "Content-Type: application/json" \
-d '{"title":"Recipes","content":"# Family recipes\n- ..."}' \
"$JOTTY_BASE_URL/api/notes"
```
### Update a note
```bash
curl -X PUT -H "x-api-key: $JOTTY_API_KEY" -H "Content-Type: application/json" \
-d '{"title":"Recipes v2","content":"# Family recipes\n- ...","category":"Kitchen","originalCategory":"Uncategorized"}' \
"$JOTTY_BASE_URL/api/notes/<noteId>"
```
### Search
```bash
curl -s -H "x-api-key: $JOTTY_API_KEY" \
"$JOTTY_BASE_URL/api/checklists?q=meeting"
curl -s -H "x-api-key: $JOTTY_API_KEY" \
"$JOTTY_BASE_URL/api/notes?q=recipe"
```
## Decision rules for the agent
When Jennifer asks to:
- "add X to my list" / "put X on my to-do" → find a matching checklist (or the default `Jennifer-to-do-list`) and POST to `/api/checklists/{listId}/items`. If no obvious list exists, ask which list or create a new one.
- "check off X" / "mark X done" → `GET /api/checklists` to find the list, then `PUT .../items/{idx}/check`. Use search (`?q=`) if needed.
- "show my notes" / "what notes do I have" → `GET /api/notes` and pretty-print titles.
- "create a new board for X" / "kanban for X" → `POST /api/tasks` with custom statuses.
- "move X to doing" → `PUT /api/tasks/{taskId}/items/{idx}/status` with `{"status":"doing"}`.
- "what's on my plate" / "summary" → `GET /api/summary` and summarize.
- "delete X" → confirm with Jennifer first; then DELETE the appropriate resource.
## Pitfalls
- Item indices shift after delete. Always re-fetch the list before acting on an index if anything might have changed.
-`PUT /api/notes/{noteId}` requires `originalCategory` to locate the note when categories differ from the requested `category` — supply it whenever the note is not in `Uncategorized`.
-`createdAt` is the epoch (`1970-01-01T00:00:00.000Z`) for many existing items; never claim an item is "from 1970" — use `updatedAt` or `lastModifiedAt`.
- Status IDs on task boards are user-defined (default: `todo`/`in_progress`/`completed`). When in doubt, `GET /api/tasks/{id}/statuses` first to learn the actual column IDs.
- Custom statuses are only available on the `POST /api/tasks` creation call; you can't change the column set of a `simple` checklist, you have to make a `task`-type board.
-`DELETE /api/tasks/{taskId}/statuses/{statusId}` auto-reassigns items in that column to the first available status — safe but irreversible.
- Jennifer is `isSuperAdmin: true`, so admin endpoints work, but still scope queries to her own data when possible (`/api/summary` without `?username=`) to avoid leaking other users' totals in chat.
- The web UI (`/api`, `/docs`) at `10.0.0.213:3000` returns the login HTML — those paths are for the browser, not API clients. Stick to `/api/*` paths.
- "Audit log" queries can be heavy. Default `limit=50`; cap to ≤100 unless explicitly asked for more.
## Verification
Run these in order to confirm the skill is wired up:
If either fails with HTTP 307 → `/auth/login`, the key is wrong or the server is misconfigured. Re-check `JOTTY_API_KEY`.
## Source
API behavior verified against Jotty v1.25.1 on 2026-07-04 from this profile. Docs mirrored from https://github.com/fccview/jotty/blob/main/howto/API.md (last commit `3307091`, Jun 14 2026). If the server upgrades past v1.25.1, re-run the two verification curls and update the `version` field.