# API Reference All endpoints are JSON over HTTP under `/api`, and require login unless marked **(public)**. Browser sessions authenticate with a cookie; programmatic clients use an `fmcp_` API key as `Authorization: Bearer ` (see [API Keys & MCP](api-keys-and-mcp.md)). Claude reaches the same data through the MCP endpoint at `/mcp`, not these REST routes. ## Health | Method | Path | Description | |--------|------|-------------| | GET | `/api/health` | Health check **(public)** | | GET | `/api/version` | App version **(public)** | ## Auth | Method | Path | Description | |--------|------|-------------| | GET | `/api/auth/status` | `{has_users, registration_open, oauth_enabled, local_auth_enabled}` **(public)** | | POST | `/api/auth/register` | Register (first user becomes admin) | | POST | `/api/auth/login` | Login with username/password | | POST | `/api/auth/logout` | Clear session | | GET | `/api/auth/me` | Current user info | | PUT | `/api/auth/password` | Change password | | PUT | `/api/auth/email` | Change email | | POST | `/api/auth/invalidate-sessions` | Evict all other sessions | | POST | `/api/auth/forgot-password` | Send password-reset email | | POST | `/api/auth/reset-password` | Reset password with token | | GET | `/api/auth/oauth/login` | Begin OIDC (PKCE) flow | | GET | `/api/auth/oauth/callback` | OIDC callback | | GET | `/api/auth/invitation/:token` | Validate an invite **(public)** | | POST | `/api/auth/register-with-invite` | Register with a token **(public)** | ## Notes | Method | Path | Description | |--------|------|-------------| | GET | `/api/notes` | List notes (params: `q`, `tag`, `sort`, `order`, `limit`, `offset`, `project_id`, `milestone_id`, `parent_id`) | | POST | `/api/notes` | Create note | | GET | `/api/notes/tags` | All tags (param: `q`) | | POST | `/api/notes/:id/append-tag` | Add a tag `{tag}` | | POST | `/api/notes/link-suggestions` | Detect note titles as plain text → wikilink candidates | | GET | `/api/notes/by-title` | Resolve note by exact title | | POST | `/api/notes/resolve-title` | Get-or-create by title (wikilink click) | | GET / PUT / PATCH / DELETE | `/api/notes/:id` | Read / replace / patch / delete | | POST | `/api/notes/:id/convert-to-task` | Note → task | | POST | `/api/notes/:id/convert-to-note` | Task → note | | GET | `/api/notes/:id/backlinks` | Notes/tasks with `[[Title]]` references to this note | | GET | `/api/notes/:id/versions` | Version history | | GET | `/api/notes/:id/versions/:vid` | A specific version | | POST | `/api/notes/:id/versions/:vid/pin` | Pin a version | | GET / PUT / DELETE | `/api/notes/:id/draft` | Unsaved-edit draft (restore across page loads) | | GET | `/api/notes/graph` | Knowledge-graph nodes/edges | ## Tasks | Method | Path | Description | |--------|------|-------------| | GET | `/api/tasks` | List tasks (params: `q`, `tag`, `status`, `priority`, `overdue`, `sort`, `order`, `limit`, `offset`) | | POST | `/api/tasks` | Create task (accepts a `project` name string → resolved to `project_id`) | | POST | `/api/tasks/planning` | Start a plan (milestone + steps) | | GET / PUT / PATCH / DELETE | `/api/tasks/:id` | Read / update / delete | | PATCH | `/api/tasks/:id/status` | Quick status update `{status}` | | GET | `/api/tasks/:id/recurrence-preview` | Preview next recurrence occurrences | **Task work logs** | Method | Path | Description | |--------|------|-------------| | GET / POST | `/api/tasks/:id/logs` | List / append a work log `{content, duration_minutes?}` | | PATCH / DELETE | `/api/tasks/:id/logs/:log_id` | Update / delete a log | ## Projects, Milestones, Systems, Issues | Method | Path | Description | |--------|------|-------------| | GET / POST | `/api/projects` | List (owned + shared) / create | | GET / PATCH / DELETE | `/api/projects/:id` | Read (with `milestone_summary`) / update / delete | | GET | `/api/projects/:id/notes` | Notes + tasks in this project | | GET / POST | `/api/projects/:id/milestones` | List / create milestones | | GET / PATCH / DELETE | `/api/projects/:id/milestones/:mid` | Read / update / delete | | GET | `/api/projects/:id/milestones/:mid/tasks` | Tasks in a milestone | | GET / POST | `/api/projects/:id/systems` | List / create systems | | GET / PATCH / DELETE | `/api/projects/:id/systems/:sid` | Read / update / delete | | GET | `/api/projects/:id/systems/:sid/records` | Records linked to a system | | GET | `/api/projects/:id/issues` | Project issues | ## Knowledge browse | Method | Path | Description | |--------|------|-------------| | GET | `/api/knowledge` | Unified note/task/plan/process feed (params: `type`, `tags`, `sort`, `q`, `limit`, `offset`) | | GET | `/api/knowledge/ids` | ID-only page (two-tier pagination) | | GET | `/api/knowledge/batch` | Fetch items by id | | GET | `/api/knowledge/tags` | Tags in scope | | GET | `/api/knowledge/counts` | Per-type counts | ## Search | Method | Path | Description | |--------|------|-------------| | GET | `/api/search` | Semantic + keyword search over notes/tasks (params: `q`, `type`, `limit`) | ## Rulebooks and rules | Method | Path | Description | |--------|------|-------------| | GET / POST | `/api/rulebooks` | List / create rulebooks | | GET / PATCH / DELETE | `/api/rulebooks/:id` | Read / update / delete | | GET / POST | `/api/rulebooks/:id/topics` | List / create topics | | PATCH / DELETE | `/api/rulebook-topics/:tid` | Edit / delete a topic | | GET | `/api/rules` | List rules | | POST | `/api/rulebook-topics/:tid/rules` | Add a rule to a topic | | GET / PATCH / DELETE | `/api/rules/:id` | Read / update / delete a rule | | POST | `/api/projects/:id/rulebook-subscriptions` | Subscribe a project to a rulebook | | GET | `/api/projects/:id/rules` | Applicable rules for a project | | POST | `/api/projects/:id/rules` | Create a project-scoped rule | | POST / DELETE | `/api/projects/:id/suppressions/rules/:rid` | Suppress / unsuppress a rule | | POST / DELETE | `/api/projects/:id/suppressions/topics/:tid` | Suppress / unsuppress a topic | ## Sharing | Method | Path | Description | |--------|------|-------------| | GET / POST | `/api/projects/:id/shares` | List / add project shares `{user_id?, group_id?, permission}` | | PATCH / DELETE | `/api/projects/:id/shares/:sid` | Update permission / remove | | GET / POST | `/api/notes/:id/shares` | List / add note shares | | PATCH / DELETE | `/api/notes/:id/shares/:sid` | Update permission / remove | | GET | `/api/shared-with-me` | All resources shared with the current user | ## Groups | Method | Path | Description | |--------|------|-------------| | GET / POST | `/api/groups` | List / create groups | | GET / PATCH / DELETE | `/api/groups/:id` | Read / update / delete | | GET / POST | `/api/groups/:id/members` | List / add members `{user_id, role}` | | PATCH / DELETE | `/api/groups/:id/members/:uid` | Update role / remove | ## Notifications | Method | Path | Description | |--------|------|-------------| | GET | `/api/notifications` | List in-app notifications | | GET | `/api/notifications/count` | Unread count | | POST | `/api/notifications/:id/read` | Mark one read | | POST | `/api/notifications/read-all` | Mark all read | ## Profile and Settings | Method | Path | Description | |--------|------|-------------| | GET / PUT | `/api/profile` | Read / update the per-user profile | | GET / PUT | `/api/settings` | Read / update key-value settings | | GET | `/api/settings/search` | SearXNG configuration status | ## API keys | Method | Path | Description | |--------|------|-------------| | GET / POST | `/api/api-keys` | List / create `fmcp_` keys (key shown once) | | DELETE | `/api/api-keys/:id` | Revoke a key | ## Plugin (Claude Code) | Method | Path | Description | |--------|------|-------------| | GET | `/api/plugin/context` | SessionStart context payload (rules + active-project) | | GET | `/api/plugin/retrieve` | Title-first knowledge-injection candidates | | GET | `/api/plugin/processes` | Stored Processes for skill-stub sync | | GET / PUT | `/api/plugin/marketplace-url` | Read / set the plugin marketplace URL | ## Dashboard, Export, Trash, Users | Method | Path | Description | |--------|------|-------------| | GET | `/api/dashboard` | Home dashboard payload | | GET | `/api/export` | Personal export (`format=markdown` ZIP or `format=json`) | | GET | `/api/trash` | List trashed items, grouped by delete batch | | POST | `/api/trash/:batch/restore` | Restore a batch | | DELETE | `/api/trash/:batch` | Purge a batch (irreversible) | | GET | `/api/users/search` | Search users by prefix (for sharing) | ## Admin | Method | Path | Description | |--------|------|-------------| | GET | `/api/admin/backup` | Export backup (format v4; `?scope=user` for own data) | | POST | `/api/admin/restore` | Restore from a backup | | GET / DELETE | `/api/admin/users` · `/api/admin/users/:id` | List / delete users | | GET / PUT | `/api/admin/registration` | Get / toggle registration | | GET / PUT | `/api/admin/smtp` · POST `/api/admin/smtp/test` | SMTP config + test email | | GET | `/api/admin/logs` · `/api/admin/logs/stats` | Log entries + category counts | | GET / PUT | `/api/admin/base-url` | Get / set the public base URL | | GET / PUT | `/api/admin/db-maintenance` (+ `/health`, POST `/run`) | VACUUM schedule, health, manual run | | POST / GET / DELETE | `/api/admin/invitations` (+ `/:id`) | Create / list / revoke invite links | ## Scribe MCP Claude clients connect to the built-in MCP server at `POST /mcp` (streamable HTTP, Bearer auth with an `fmcp_` key), served by `src/scribe/mcp/`. It is not a REST surface — it exposes the same data as typed tools (`create_note`, `create_task`, `start_planning`, `search`, `enter_project`, `list_always_on_rules`, …) with server-level usage guidance delivered in the MCP `instructions` block. See [API Keys & MCP](api-keys-and-mcp.md).