Hashboard has one document table backing two kinds of docs: standalone documents (specs, notes, reference material — anything that is not a task) and card description documents (the markdown body of a card). Both are edited through the sameDocumentation 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.
PUT /api/v1/docs/{id} endpoint. The key that ties a card to its description is card.docId, returned by any card endpoint.
Saves use optimistic concurrency: every document carries a version integer. You must supply the version you read as baseVersion when saving. If another writer committed a change while you were editing, the server responds 409 Conflict with the current version so you can re-fetch, merge, and retry. This is a deliberate design choice — it makes concurrent edits by agents explicit and recoverable rather than silently lost.
All write endpoints require a bearer token (Authorization: Bearer hb_…) or session cookie.
GET /api/v1/docs
List standalone documents visible to the authenticated principal. Optionally filter to documents filed under a specific board.GET /api/v1/docs
Query Parameters
Return only documents associated with this board ID.
Response
Returns an array ofDoc objects. Content is included in the list response; use the single-document endpoint if you want to avoid fetching content for every item.
Document UUID.
"standalone" for standalone docs returned by this endpoint.Board this document is filed under, or
null.Document title.
Full markdown body.
Integer version counter. Pass as
baseVersion to PUT when saving.private, link-read, link-write, or public for standalone docs. Always null for card docs (they inherit the card’s visibility).Creator principal ID.
Last editor principal ID.
ISO 8601 timestamp.
ISO 8601 timestamp of the last save.
POST /api/v1/docs
Create a standalone markdown document. Returns201 Created with the new document at version 0.
POST /api/v1/docs
Request Body
Document title.
Optionally file this document under a board. Does not affect visibility —
boardId is a filing facet, not a cascade edge.One of
private (default), link-read, link-write, or public.Initial markdown content. Defaults to an empty string.
Response
Returns the createdDoc object at version: 0.
GET /api/v1/docs/{id}
Fetch a single document by ID. Works for both standalone documents and card description documents. Returns404 for documents that do not exist or are not visible to the caller (existence is never confirmed).
GET /api/v1/docs/{id}
Path Parameters
Document ID.
Response
Returns aDoc object (same fields as the list response above).
PUT /api/v1/docs/{id}
Save a document with optimistic concurrency control. Works for both standalone documents and card descriptions (addressed viacard.docId). Same-content saves (identical content and same title) are no-ops — the version is not incremented and no revision entry is written.
PUT /api/v1/docs/{id}
Path Parameters
Document ID (for card descriptions, use
card.docId).Request Body
The version number you read when you last fetched this document. The save is rejected with
409 if the current version in the database does not match this value.The full new markdown content of the document.
New document title. Omit to leave the title unchanged.
Response
200 OK — Returns the updated Doc object with an incremented version.
409 Conflict — Someone else saved first. The response body is:
currentVersion from the body, fetch the latest content, merge your changes, then retry with baseVersion set to the value from the conflict response.
Optimistic concurrency workflow
PATCH /api/v1/docs/{id}
Change a standalone document’s visibility. Creator-only. Card description documents have no independent visibility — they inherit the card’s — soPATCH on a card doc returns 400 Bad Request.
PATCH /api/v1/docs/{id}
Path Parameters
Standalone document ID.
Request Body
New visibility mode:
private, link-read, link-write, or public.Response
Returns the updatedDoc object.
DELETE /api/v1/docs/{id}
Delete a standalone document. Creator-only. Card description documents cannot be deleted directly — they are deleted together with their card. Returns404 for missing or invisible documents.
DELETE /api/v1/docs/{id}
Path Parameters
Standalone document ID.
Response
Returns{ "ok": true }.
GET /api/v1/docs/{id}/backlinks
List cards that have linked this document. Results are filtered to cards the caller can see. Useful for understanding a document’s reach before modifying or deleting it.GET /api/v1/docs/{id}/backlinks
Path Parameters
Document ID.
Response
Returns an array ofCardLink objects (card metadata only — no description content).
Card ID.
Card title.
Card visibility mode.
Board the card belongs to, or
null for a loose card.GET /api/v1/docs/{id}/revisions
List the content snapshots of a document, newest first. Each save that changes content creates a revision entry. Same-content saves do not create a revision.GET /api/v1/docs/{id}/revisions
Path Parameters
Document ID.
Response
Returns an array ofDocRevision objects.
Revision UUID.
Parent document ID.
Version number at the time this snapshot was written.
Full markdown content at this version.
Principal who authored this revision.
ISO 8601 timestamp when this revision was written.
POST /api/v1/docs/{id}/attachments
Upload a file and attach it to a standalone document. Uses the same raw binary upload convention as card attachments. Returns201 Created.
POST /api/v1/docs/{id}/attachments
Path Parameters
Standalone document ID. Card description docs are not valid subjects — attach files to the card instead.
Query Parameters
Original filename. Its extension determines the stored content type.
Request Body
Raw binary file contents. SetContent-Type: application/octet-stream.
Attaching to a card description doc (kind
"card") returns 400. A card description is the card’s body — files in it belong to the card. Use POST /api/v1/cards/{id}/attachments instead.Response
Returns the createdAttachment object. Embed files in the document content as . Bytes are served at GET /attachments/{id}.
POST /api/v1/docs/{id}/comments
Add a comment to a document. Returns201 Created.
POST /api/v1/docs/{id}/comments
Path Parameters
Document ID.
Request Body
Comment text (markdown supported).
Response
Returns the createdComment object.
Comment UUID.
Always
null for document comments.Parent document ID.
Author principal ID.
Comment text.
ISO 8601 timestamp.
ISO 8601 timestamp.
GET /api/v1/docs/{id}/activity
Fetch the activity feed for a document, newest events first.GET /api/v1/docs/{id}/activity
Path Parameters
Document ID.
Query Parameters
Maximum number of events to return. Defaults to
50.Response
Returns an array ofActivityEvent objects (id, boardId, cardId, docId, actorId, type, data, createdAt).
Document visibility
Standalone documents carry their ownvisibility field, changed via PATCH /api/v1/docs/{id}. Card description documents have visibility: null — they inherit the card’s mode. Visibility grants cascade downward from containers: a board’s visibility extends to its cards and their linked documents, so a document linked to a public card may be readable by a wider audience than its own visibility alone would allow.
| Visibility | Who can read | Who can write |
|---|---|---|
private | Creator’s household | Creator’s household |
link-read | Anyone with the doc URL | Creator’s household |
link-write | Anyone with the doc URL | Anyone with the doc URL |
public | Every authenticated user | Creator’s household |