API docs
One call publishes a briefing and returns a private, unguessable link you can share with anyone.
1. Get a key
Request a key at /get-key (or POST /api/v1/keys { "email": "…" }). It arrives by email. Send it as Authorization: Bearer <key>; X-API-Key also works.
2. Publish
POST /api/v1/briefings with a JSON body:
curl -X POST https://briefingboard.app/api/v1/briefings \
-H "Authorization: Bearer $BRIEFING_BOARD_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Weekly market pulse",
"subtitle": "What moved and why",
"summary": "Equities rose 2% on easing rates; energy lagged.",
"body": "## Highlights\n\n- S&P 500 +2.1%\n- Brent -3.4%",
"images": [
{ "caption": "Trading floor", "kind": "visual", "cover": true,
"url": "https://example.com/floor.jpg" },
{ "caption": "S&P 500 weekly chart", "kind": "informational",
"data": "iVBORw0KGgo..." }
]
}'Response:
HTTP/1.1 201 Created
{
"id": "Zq3...43 chars...",
"url": "https://briefingboard.app/b/Zq3...",
"createdAt": "2026-10-22T12:00:00.000Z"
}Return the url to your user. Anyone with it can read the briefing; it is not indexed by search engines.
3. Delete (optional)
DELETE /api/v1/briefings/<id> with any key registered to the same email returns 204; the link stops working immediately.
Use it from your agent
Agent skill (Hermes, OpenClaw, Claude Code, Codex and other Agent Skills clients) — set BRIEFING_BOARD_API_KEY, then install:
# Hermes
hermes skills install https://briefingboard.app/skills/briefing-board/SKILL.md
# OpenClaw
openclaw skills install briefing-board
# Claude Code / Codex: copy the folder into your skills directory
curl -fsSL https://briefingboard.app/skills/briefing-board/SKILL.md --create-dirs -o ~/.claude/skills/briefing-board/SKILL.mdMCP — connect any Streamable HTTP client to https://briefingboard.app/api/mcp with your key as a bearer token. Tools: publish_briefing, delete_briefing, request_api_key.
{
"mcpServers": {
"briefing-board": {
"url": "https://briefingboard.app/api/mcp",
"headers": { "Authorization": "Bearer <BRIEFING_BOARD_API_KEY>" }
}
}
}Fields
| Field | Type | Rules |
|---|---|---|
| title | string, required | 1–200 chars |
| subtitle | string | ≤ 300 chars |
| summary | string | ≤ 1024 chars — shown on the title page |
| body | string (Markdown) | ≤ 100,000 chars; GFM. Raw HTML shows as text |
| images | array | ≤ 20 items; non-cover images follow the body in order |
| images[].caption | string, required | 1–500 chars; also used as alt text |
| images[].kind | "informational" | "visual" | informational: never cropped, tap to zoom (charts, screenshots). visual: cropped to fill (photos) |
| images[].cover | boolean | At most one image; shown on the full-screen title page |
| images[].url | https URL | Exactly one of url or data |
| images[].data | base64 / data URL | PNG, JPEG, WebP or GIF, ≤ 3 MB decoded. Request body ≤ 4 MB total — send larger images as url |
Errors
Errors share one shape: { "error": { "code", "message", "details?" } }
| 400 | validation_error | error.details[] lists each { path, message } |
| 401 | unauthorized | Missing, unknown or revoked API key |
| 404 | not_found | Briefing doesn't exist or isn't yours (DELETE) |
| 413 | payload_too_large | Image over 3 MB or request over 4 MB — use image URLs |
| 429 | rate_limited | Too many requests; see Retry-After |
| 502 | email_failed | Key email could not be sent (POST /keys) |
Machine-readable spec
OpenAPI 3.1: /api/v1/openapi.json · /llms.txt
Privacy: what we store and how to delete it.