Accepts community or community_id; returns { sources }
/docs/*
GET
Public
Fixed redirect map into this docs site
/admin/communities
GET, POST
Admin
Create and list communities
/admin/sources
GET, POST, PUT, DELETE
Admin
Manage chat sources
/admin/exports/assign-source
POST
Admin
Attach a source to an existing export
Ingest Worker
Upload
Path
Method
Purpose
/presign
POST
Placeholder object-key helper, not the live upload path
/upload
POST
Direct upload for smaller exports
/upload/multipart/init
POST
Start multipart upload
/upload/multipart/part
POST
Upload one multipart chunk
/upload/multipart/complete
POST
Finalize multipart upload and queue ingest
/upload/multipart/abort
POST
Abort multipart upload
Export, media, and deletion
Path
Method
Purpose
/files
GET, DELETE
List exports or delete one
/exports/progress
GET
Processing status
/exports/details
GET
Detailed export modal payload
/media/list
GET
Media listing with filters
/media/replay
POST
Requeue media analysis
/clear
POST
Clear derived data by date range
/communities/{community_id}
DELETE
Delete a whole community
Replay, regenerate, and backfill
Path
Method
Purpose
/regenerate/daily
POST
Rebuild one daily digest
/regenerate/weekly
POST
Queue one weekly regeneration or range
/regenerate/weekly/all
POST
Queue all-weeks weekly regeneration
/replay/export
POST
Re-enqueue one export from raw storage
/replay/all
POST
Re-enqueue all matching exports
/replay/stuck
POST
Requeue stalled exports
/admin/backfill-concept-pillars
POST
Backfill concept tags
/admin/backfill-strain-daily
POST
Backfill daily strain
/admin/backfill-strain-weekly
POST
Backfill weekly strain
/admin/backfill-media-summaries
POST
Backfill media summary enrichment
Quota and pipeline controls
Path
Method
Purpose
/quota/status
GET
Text and media quota status
/quota/set
POST
Manually set usage
/quota/bypass
GET, POST
Read or set text/media bypass flags
/quota/config
POST
Update quota config
/pipeline/daily-config
GET, POST
Read or change daily pipeline mode
Contract Notes
/upload currently rejects direct uploads above roughly 75 MiB.
Multipart uploads currently use 16 MiB parts.
/replay/stuck defaults to 30 minutes if max_age_minutes is omitted at the API level.
/quota/bypass POST supports scope values of text, media, or all.
/replay/all can report skipped_missing_raw_exports when raw files have already been deleted.
Weekly endpoints still expose some raw JSON-string fields such as top_themes_json and tags_json, while daily and trends responses normalize more of that data.
Pagination
/pulse/history.json — cursor vs offset
Cursor mode (preferred): Pass ?cursor=<week_start> where week_start is the value from the previous response’s pagination.next_cursor. The query uses WHERE week_start < cursor ORDER BY week_start DESC LIMIT limit, giving O(1) page cost regardless of history depth. The response includes pagination.next_cursor (null when exhausted).
Legacy offset mode (deprecated): Omit cursor and pass ?offset=N. Returns pagination.total, pagination.offset, and pagination.hasMore. A separate COUNT(*) query runs on every request. For deep pages this is O(N) on the D1 side. Offset mode is retained for backward compatibility but cursor mode is preferred for any new consumers.