This is a current-state route reference, not a promise of future API stability.

Defaults And Auth Rules

  • Public Pulse data routes accept community and source.
  • If those parameters are omitted, the current public worker defaults to community=ihouse-nyc and source=ihouse-main-whatsapp-group.
  • Public admin routes require admin auth.
  • Ingest admin routes require admin auth.
  • /pulse/daily.json is public in the current checked-in deployment because PUBLIC_DAILY_DIGESTS=true.

Public Worker

PathMethodAuthNotes
/pulseGETPublicMain HTML experience
/pulse.jsonGETPublicWeekly summary; accepts weekof or week_start
/pulse/history.jsonGETPublicWeekly history; supports limit, cursor (keyset), and legacy offset
/pulse/daily.jsonGETPublic todayDaily summaries; supports limit, offset, optional week_start
/pulse/trends.jsonGETPublicTrends plus paginated weekly breakdown; supports limit and offset
/pulse/conceptsGETPublicDedicated concepts HTML page
/pulse/concepts.jsonGETPublicConcept graph endpoint; supports week_start, week_end, limit, all_weeks, aggregate
/pulse/embedGETPublicEmbed card; supports style, type, weekof, date, community, source, tz
/pulse/communities.jsonGETPublicReturns { communities }
/pulse/sources.jsonGETPublicAccepts community or community_id; returns { sources }
/docs/*GETPublicFixed redirect map into this docs site
/admin/communitiesGET, POSTAdminCreate and list communities
/admin/sourcesGET, POST, PUT, DELETEAdminManage chat sources
/admin/exports/assign-sourcePOSTAdminAttach a source to an existing export

Ingest Worker

Upload

PathMethodPurpose
/presignPOSTPlaceholder object-key helper, not the live upload path
/uploadPOSTDirect upload for smaller exports
/upload/multipart/initPOSTStart multipart upload
/upload/multipart/partPOSTUpload one multipart chunk
/upload/multipart/completePOSTFinalize multipart upload and queue ingest
/upload/multipart/abortPOSTAbort multipart upload

Export, media, and deletion

PathMethodPurpose
/filesGET, DELETEList exports or delete one
/exports/progressGETProcessing status
/exports/detailsGETDetailed export modal payload
/media/listGETMedia listing with filters
/media/replayPOSTRequeue media analysis
/clearPOSTClear derived data by date range
/communities/{community_id}DELETEDelete a whole community

Replay, regenerate, and backfill

PathMethodPurpose
/regenerate/dailyPOSTRebuild one daily digest
/regenerate/weeklyPOSTQueue one weekly regeneration or range
/regenerate/weekly/allPOSTQueue all-weeks weekly regeneration
/replay/exportPOSTRe-enqueue one export from raw storage
/replay/allPOSTRe-enqueue all matching exports
/replay/stuckPOSTRequeue stalled exports
/admin/backfill-concept-pillarsPOSTBackfill concept tags
/admin/backfill-strain-dailyPOSTBackfill daily strain
/admin/backfill-strain-weeklyPOSTBackfill weekly strain
/admin/backfill-media-summariesPOSTBackfill media summary enrichment

Quota and pipeline controls

PathMethodPurpose
/quota/statusGETText and media quota status
/quota/setPOSTManually set usage
/quota/bypassGET, POSTRead or set text/media bypass flags
/quota/configPOSTUpdate quota config
/pipeline/daily-configGET, POSTRead 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).

GET /pulse/history.json?community=ihouse-nyc&limit=20&cursor=2026-04-19
→ { "summaries": [...], "pagination": { "limit": 20, "next_cursor": "2026-02-15" } }

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.