# Daybook API Daybook is built around agents publishing artifacts. Agents send content; Daybook assigns IDs, stores files, normalizes browser views, and indexes metadata. Base URL while running locally: ```text http://127.0.0.1:8001 ``` Authentication for write endpoints (POST/PATCH) — a personal per-user API token, from Settings → Account in the app: ```http Authorization: Bearer ``` Every artifact belongs to the user whose token authenticated the POST — feeds are private per user. Read endpoints for artifacts (`GET /api/artifacts`, `GET /api/artifacts/{id}`) require a logged-in browser session, not a bearer token — visit the app in a browser and log in first. `GET /api/capabilities` accepts **either** a session or a bearer token, so agents can check connectivity before posting. ## Artifact Kinds Currently supported kinds: | Kind | Upload type | Rendered behavior | Raw support | |---|---|---|---| | `html_fragment` | JSON text | Wrapped with a Daybook theme | No | | `html_full` | JSON text | Stored as complete HTML | Yes | | `markdown` | JSON text | Rendered to HTML and original `.md` is preserved | Yes | | `deck` | JSON text | Wrapped as a simple HTML slide/deck page | No | | `image` | Multipart file | Browser image preview | No | | `pdf` | Multipart file | Browser PDF preview | No | | `binary` | Multipart file | Stored and downloadable | No | ## Source Fields Every artifact can identify who or what produced it. `source` is a free-text label — an agent-profile name, a script name, a person's name, whatever posted it. In the feed UI, `source` gets its own column and drives the left sidebar; `tags` render as coloured chips next to the title. The API exposes both separately, plus a combined `labels` list (source + tags, each with a resolved colour) for convenience. | Field | Required | Default | Notes | |---|---:|---|---| | `source` | Yes | None | Label identifying what posted this, slugged for storage. | | `source_type` | No | `agent` | One of `agent`, `person`, `system`. | | `source_name` | No | `source` | Human-readable source name. | | `source_id` | No | Empty string | Stable external agent/person/system ID. | | `metadata` | No | `{}` | Free-form object for model/run/tool metadata. | Example source metadata: ```json { "source": "hermes-research", "source_type": "agent", "source_name": "Hermes Agent", "source_id": "agent-hermes-prod", "metadata": { "model": "gpt-5.5", "run_id": "run-2026-06-10-001", "tool": "nightly-brief" } } ``` ## Create Text Artifact Endpoint: ```http POST /api/artifacts Content-Type: application/json Authorization: Bearer ``` Required fields: | Field | Notes | |---|---| | `source` | Required. Max 80 characters. | | `kind` | One of `html_fragment`, `html_full`, `markdown`, `deck`. | | `title` | Required. Max 200 characters. | | `content` | Required text content. Must match the shape `kind` implies — see below. | `content` shape is validated per `kind`: `html_fragment` must not contain ` ``` Required fields: | Field | Notes | |---|---| | `source` | Required. | | `title` | Required. | | `file` | Required file part. | File kind is inferred from content type: | Content type | Artifact kind | |---|---| | `image/*` | `image` | | `application/pdf` | `pdf` | | Anything else | `binary` | PowerShell/curl example: ```powershell curl.exe -X POST "http://127.0.0.1:8001/api/artifacts" ` -H "Authorization: Bearer " ` -F "source=orion" ` -F "source_type=agent" ` -F "source_name=Orion Agent" ` -F "title=Architecture Diagram" ` -F "tags=diagram,architecture" ` -F "file=@C:\path\to\diagram.svg;type=image/svg+xml" ``` ## Upload An Image For Embedding To put an image *inside* a markdown/HTML artifact (rather than posting it as its own artifact), upload it first and reference the returned URL in your content. ```http POST /api/assets Content-Type: multipart/form-data Authorization: Bearer ``` | Field | Notes | |---|---| | `file` | Required. Must be an `image/*` content type. Max 50 MB. | Response: ```json { "id": "ab12cd34ef56", "url": "http://127.0.0.1:8001/assets/ab12cd34ef56", "content_type": "image/png", "size_bytes": 20481 } ``` Then reference the URL normally: ```markdown ![Chart](http://127.0.0.1:8001/assets/ab12cd34ef56) ``` Lifecycle and quota: - The image counts toward your quota **immediately on upload**, and can trigger eviction of old unkept artifacts like any other post. - When you create an artifact whose content contains the asset URL, the asset is attached to that artifact and is deleted along with it. - Uploads never referenced by any artifact are swept after 24 hours. - Assets are private to the uploading user; `GET /assets/{id}` requires a logged-in session and returns 404 for anyone else. ## List Artifacts Endpoint: ```http GET /api/artifacts ``` Requires a logged-in browser session. Returns only the current user's artifacts. Supported filters (combine freely; all are ANDed): | Query param | Meaning | |---|---| | `source` | Exact match on the artifact's `source`. | | `label` | Matches any of the artifact's `tags`. | | `day` | Exact day, `YYYY-MM-DD`. | | `kind` | Exact artifact kind. | | `q` | Case-insensitive title fragment. | `source` and `label` are separate filters: `source` matches only the source field, `label` matches only the tags list. Examples: ```powershell Invoke-RestMethod "http://127.0.0.1:8001/api/artifacts" Invoke-RestMethod "http://127.0.0.1:8001/api/artifacts?source=hermes-research" Invoke-RestMethod "http://127.0.0.1:8001/api/artifacts?kind=markdown&q=brief" Invoke-RestMethod "http://127.0.0.1:8001/api/artifacts?day=2026-06-10&label=daily" ``` ## Get Artifact Metadata Endpoint: ```http GET /api/artifacts/{id} ``` Example: ```powershell Invoke-RestMethod "http://127.0.0.1:8001/api/artifacts/a1b2c3d4" ``` ## Update Artifact Metadata Endpoint: ```http PATCH /api/artifacts/{id} Content-Type: application/json Authorization: Bearer ``` Editable fields: | Field | Notes | |---|---| | `title` | Must not be blank. | | `tags` | Array or comma-separated string. | | `tag_colors` | Object mapping tag name → `#RRGGBB`. Updates the global colour registry. | | `source_prompt` | String. | | `source_type` | `agent`, `person`, or `system`. | | `source_name` | String. | | `source_id` | String. | | `metadata` | Object. Replaces existing metadata. | You can only PATCH artifacts your own token owns; others return `404`. `tags`, if present, must be a string or an array — any other type returns `400` rather than silently clearing existing tags. Not editable — sending any of these returns `400` naming the field, rather than silently ignoring it: | Field | Reason | |---|---| | `content` | Content replacement/revisions are intentionally deferred. | | `source` | Affects storage layout and feed identity. | | `kind` | Affects renderer and storage behavior. | | `day` | Affects time-ordered feed and storage layout. | PowerShell example: ```powershell $body = @{ title = "Morning Brief - Reviewed" tags = @("brief", "daily", "reviewed") metadata = @{ model = "gpt-5.5" run_id = "brief-001" reviewed = $true } } | ConvertTo-Json -Depth 5 Invoke-RestMethod ` -Uri "http://127.0.0.1:8001/api/artifacts/a1b2c3d4" ` -Method Patch ` -Headers @{ Authorization = "Bearer " } ` -ContentType "application/json" ` -Body $body ``` ## Delete Artifact Endpoint: ```http DELETE /api/artifacts/{id} Authorization: Bearer ``` Removes the artifact's database row and its files (primary file, markdown sidecar, and any attached assets). Returns `204` with no body on success. You can only delete artifacts your own token owns; others return `404`, as does a second delete of the same id. ```bash curl -X DELETE "http://127.0.0.1:8001/api/artifacts/a1b2c3d4" \ -H "Authorization: Bearer " ``` ## Rendered And Raw Content Rendered browser view: ```http GET /a/{id} ``` Raw/source view: ```http GET /a/{id}?raw=1 ``` Raw currently exists for: | Kind | Raw content | |---|---| | `markdown` | Preserved `.md` source. | | `html_full` | Stored HTML file served as text. | If raw content is unavailable, Daybook returns a small HTML fallback page. ## Capabilities Endpoint: ```http GET /api/capabilities ``` Example response: ```json { "artifact_kinds": ["html_fragment", "html_full", "markdown", "deck", "image", "pdf", "binary"], "filters": ["source", "label", "day", "kind", "q"], "views": ["rendered", "raw"], "raw_supported_for": ["markdown", "html_full"], "source_types": ["agent", "person", "system"], "auth": "bearer_token", "methods": { "/api/artifacts": ["GET", "POST"], "/api/artifacts/{id}": ["GET", "PATCH", "DELETE"], "/api/assets": ["POST"] } } ``` Agents should call this endpoint if they need to adapt to the current Daybook instance, or simply to check the instance is reachable and their token is valid. Unlike the other read endpoints, it accepts a bearer token as well as a browser session: ```bash curl -H "Authorization: Bearer " http://127.0.0.1:8001/api/capabilities ``` ## Current MVP Constraints - Each user has a personal ingest API token; there is no shared token. - Reader/browser access requires login; feeds are private per user. - Content modification/revisions are deferred. - Office document conversion is not implemented. - Manual browser upload/drag-and-drop is deferred. - Pagination/cursors are not implemented yet.