Hashboard exposes a complete REST API underDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/cryguy/hashboard/llms.txt
Use this file to discover all available pages before exploring further.
/api/v1 for agents, scripts, and integrations. Every endpoint accepts and returns JSON. Request schemas are defined in Zod and shared with the OpenAPI builder, so documentation cannot drift from what the routes actually validate. Response schemas are pinned at compile time to the types the service layer returns — a schema that falls behind its row type breaks npm run check, not a consumer.
Base URL
All endpoints are relative to your Hashboard instance origin. There is no subdomain or version prefix beyond/api/v1.
Content Types
| Direction | Content-Type |
|---|---|
| JSON request bodies | application/json |
| JSON responses | application/json |
| Binary attachment uploads | application/octet-stream |
API Documentation Endpoints
These three endpoints are deliberately unauthenticated — they expose schema, never data.| Endpoint | Description |
|---|---|
GET /api/v1/openapi.json | The full OpenAPI 3.1 specification |
GET /api/docs | Interactive Scalar UI (bundle vendored to static/vendor/scalar.js, self-hosted) |
GET /llms.txt | Agent-oriented overview of all endpoints, generated from the same operations registry |
/api/docs, not /docs. The /docs path is reserved for Hashboard’s own document workspace UI.Request and Response Conventions
Successful creates return201. Use the Location-equivalent docId / id from the response body to address the new resource.
Void operations return {ok: true}. Any mutation that has no meaningful return payload — revokes, unlinks, assignments — responds with {"ok":true} and a 200 status.
Pagination. There is no cursor- or page-based pagination in v1. Activity feed endpoints (*/activity) accept a ?limit= query parameter (default 50) to cap the result set. All other list endpoints return their full result filtered to what the caller can see.
Optimistic concurrency on doc saves. PUT /api/v1/docs/:id requires a baseVersion matching the version you read. A stale version yields a 409 Conflict with currentVersion in the body. See the Errors page for the retry flow.
Markdown renditions. Every resource URL — /boards/:id, /cards/:id, /docs/:id — also serves a markdown rendition. Append .md to the URL, or send Accept: text/markdown. The YAML frontmatter carries ids and the doc version needed to round-trip edits. Accept: application/json on those same URLs returns the same composite payload as this API.
Resource Groups
The API is organized into the following tag groups. Each group maps to a logical resource or capability area.auth — local login, register, logout
auth — local login, register, logout
/auth/* as browser redirects and is not part of the JSON API. Login and register are rate-limited and unauthenticated.POST /api/v1/auth/register— Register a local account (username + password)POST /api/v1/auth/login— Log in and receive anhb_sessioncookiePOST /api/v1/auth/logout— Revoke the current session
identity — /me, password, credentials, OIDC, principals, agents, tokens
identity — /me, password, credentials, OIDC, principals, agents, tokens
GET /api/v1/me— The authenticated principalPOST /api/v1/me/password— Change your password (revokes all sessions, re-issues the current one)POST /api/v1/me/credentials— Add a local username/password to an OIDC-provisioned accountDELETE /api/v1/me/credentials— Remove local credentials (refused unless OIDC remains)DELETE /api/v1/me/oidc— Unlink OIDC identity (refused unless local credentials remain)GET /api/v1/principals— Workspace directory (all humans and agents)POST /api/v1/agents— Create an agent principal owned by your householdPOST /api/v1/agents/:id/disable— Deactivate an agent; its tokens stop working and it leaves every cardPOST /api/v1/agents/:id/enable— Reactivate an agent (prior card assignments do not return)GET /api/v1/tokens— List your household’s API tokens (hashes only — raw values are never stored)POST /api/v1/tokens— Issue a bearer token for yourself or an owned agentDELETE /api/v1/tokens/:id— Revoke a token
meta — health
meta — health
GET /api/v1/health— Liveness check (unauthenticated)
boards — CRUD, archive, columns, cards, activity
boards — CRUD, archive, columns, cards, activity
GET /api/v1/boards— List boards visible to you (?archived=truefor archived)POST /api/v1/boards— Create a boardGET /api/v1/boards/:id— Composite view:{board, columns, cards}PATCH /api/v1/boards/:id— Update board fieldsPOST /api/v1/boards/:id/archive— Archive a board (creator-only)POST /api/v1/boards/:id/unarchive— Unarchive a board (creator-only)GET /api/v1/boards/:id/archived— Archived columns and cards available for restoreGET /api/v1/boards/:id/columns— Columns in orderPOST /api/v1/boards/:id/columns— Add a column at the endGET /api/v1/boards/:id/cards— Cards on a board, ordered by positionGET /api/v1/boards/:id/activity— Board activity feed, newest first (?limit=)
columns — rename, move, archive
columns — rename, move, archive
PATCH /api/v1/columns/:id— Rename a columnPOST /api/v1/columns/:id/move— Reorder betweenprevId/nextIdneighborsPOST /api/v1/columns/:id/archive— Archive a column (board-creator-only)POST /api/v1/columns/:id/unarchive— Unarchive a column
cards — CRUD, move, detach, archive, assignees, labels, links, attachments, comments, activity
cards — CRUD, move, detach, archive, assignees, labels, links, attachments, comments, activity
card.docId.POST /api/v1/cards— Create a card (omitcolumnIdfor a loose/inbox card)GET /api/v1/cards/:id— Composite view:{card, doc, assignees, labelIds, linkedDocs, attachments}PATCH /api/v1/cards/:id— Update card fieldsPOST /api/v1/cards/:id/move— Place in a column betweenprevId/nextIdPOST /api/v1/cards/:id/detach— Remove from board; card becomes loose (inbox)POST /api/v1/cards/:id/archive/unarchive— Archive lifecycle (creator-only)GET /api/v1/cards/:id/assignees— List assigned principal idsPUT /api/v1/cards/:id/assignees/:principalId— Assign a principal (also shares the card durably)DELETE /api/v1/cards/:id/assignees/:principalId— UnassignGET /api/v1/cards/:id/links— Documents linked to this cardPUT /api/v1/cards/:id/links/:docId— Link a standalone doc (idempotent)DELETE /api/v1/cards/:id/links/:docId— UnlinkGET /api/v1/cards/:id/attachments— Attached files, oldest firstPOST /api/v1/cards/:id/attachments— Upload a file (application/octet-stream,?filename=)PUT /api/v1/cards/:id/labels/:labelId/DELETE— Attach or detach a labelGET /api/v1/cards/:id/comments— Comments, oldest firstPOST /api/v1/cards/:id/comments— Post a commentGET /api/v1/cards/:id/activity— Card activity feed, newest first (?limit=)GET /api/v1/inbox— Your household’s loose cards (created by or assigned to you or your agents;?archived=truefor archived loose cards)
docs — CRUD, save, backlinks, revisions, attachments, comments, activity
docs — CRUD, save, backlinks, revisions, attachments, comments, activity
card.docId.GET /api/v1/docs— List standalone documents visible to you (?boardId=to filter)POST /api/v1/docs— Create a standalone documentGET /api/v1/docs/:id— Fetch a documentPUT /api/v1/docs/:id— Save content with optimistic concurrency (baseVersionrequired)PATCH /api/v1/docs/:id— Change visibility (standalone docs only; creator-only)DELETE /api/v1/docs/:id— Delete a standalone document (creator-only)GET /api/v1/docs/:id/backlinks— Cards that link to this document (visibility-filtered)GET /api/v1/docs/:id/revisions— Content snapshots, newest firstGET /api/v1/docs/:id/attachments— Attached files, oldest firstPOST /api/v1/docs/:id/attachments— Upload a fileGET /api/v1/docs/:id/comments— Comments, oldest firstPOST /api/v1/docs/:id/comments— Post a commentGET /api/v1/docs/:id/activity— Doc activity feed, newest first (?limit=)
attachments — get, delete
attachments — get, delete
GET /attachments/:id— Serve the file bytes (no.md-suffix support — path is intentionally bare)DELETE /api/v1/attachments/:id— Delete a file (uploader’s household or subject’s creator)
comments — delete
comments — delete
labels — CRUD
labels — CRUD
GET /api/v1/labels— The full label palettePOST /api/v1/labels— Create a label (name + color; name must be globally unique)PATCH /api/v1/labels/:id— Update a labelDELETE /api/v1/labels/:id— Delete a label
search — full-text search
search — full-text search
GET /api/v1/search?q=— Case-insensitive substring search over board names/descriptions, card titles, and document titles/content. Results are visibility-filtered. Queries under 2 characters return empty groups.
admin — users, settings, invites
admin — users, settings, invites
admin or super role. The superadmin cannot be modified by anyone, including other admins.GET /api/v1/admin/users— All principals with sign-in methods and rolesPATCH /api/v1/admin/users/:id— Set a human’s role (useroradmin)POST /api/v1/admin/users/:id/reset-password— Reset a user’s local password (revokes their sessions)GET /api/v1/admin/settings— Instance settings (registration toggles)PATCH /api/v1/admin/settings— Toggle local registration and invite-only modeGET /api/v1/admin/invites— List invites (hashes and usage only — raw codes are never stored)POST /api/v1/admin/invites— Create a single-use invite code (raw code returned once)DELETE /api/v1/admin/invites/:id— Revoke an unused invite
DELETE /api/v1/comments/:id— Delete a comment (author-household-only)