>-
A guided content system for people and agents. Browse feeds, search topics, and start Chowdahh Radio.
No API key required for anonymous access (feeds, search, streams, radio): 30 requests/minute. Replay, preferences, and personalized feeds require a person token (Authorization: Bearer ch_person_...): 300 requests/minute.
# Browse top stories
curl -s 'https://chowdahh.com/api/v1/streams/top?limit=5'
# Search
curl -s 'https://chowdahh.com/api/v1/search?q=NASA&limit=5'
# Start a feed session
curl -X POST https://chowdahh.com/api/v1/feed-sessions \
-H 'content-type: application/json' \
-d '{"intent": "browse", "budget_minutes": 5, "include_controls": true}'
Successful responses use {data, guidance, meta}. Error responses use {error, meta} and may omit guidance. The guidance block tells you what happened and suggests what to do next:
{
"data": { "session_id": "abc-123", "items": [...], "count": 6, "controls": {...} },
"guidance": {
"status_explanation": "Feed session started with 6 items.",
"next_best_actions": [
{
"action_id": "send_more",
"title": "Send more cards",
"api_hint": { "method": "POST", "path": "/api/v1/feed-sessions/abc-123/more" }
}
],
"account_state": { "auth_mode": "anonymous", "rate_limit": { "limit": 30, "remaining": 28 } }
},
"meta": { "request_id": "f3704a2e6d2f0f82" }
}
Read guidance.next_best_actions when present. Treat it as a suggestion layer, not a guaranteed contract, and keep using the documented /api/v1 routes as the source of truth.
Before running a new integration from scratch, read references/runner-playbook.md. It captures the production behaviors verified on April 14, 2026, including the endpoints that worked anonymously, the person-token behavior that was actually observed, and the flows that are still incomplete for a new runner.
POST /api/v1/feed-sessions and keep the first request minimal: intent, budget_minutes, include_controls.POST /api/v1/feed-sessions/{session_id}/more for "send more" -- stay in the same session.POST /api/v1/feed-sessions -- start a session (intent, budget_minutes, include_controls)GET /api/v1/feed-sessions/{id} -- get session statePOST /api/v1/feed-sessions/{id}/more -- send more cardsPATCH /api/v1/feed-sessions/{id}/controls -- apply or remove control chipsItems typically include id, headline, summary, topics, and source_count. However, headline may be empty on some search results, and image_url, share_url, and canonical_url may be null or absent. Always handle missing or blank fields gracefully.
Browse without a session:
curl -s 'https://chowdahh.com/api/v1/streams/top?limit=5'
Discover available streams via GET /api/v1/streams. Default set includes: top, latest, science, world, tech, business, health, culture, sports, good-news, local.
Production note: the live streams listing currently exposes reliable slug values, but friendly name values may be null. Use the slug as the stable key.
curl -s 'https://chowdahh.com/api/v1/search?q=climate&limit=5'
Searches clusters by topic match. Results are card objects — they do not currently expose stable result types or drill-down IDs for topics or curators, and some results may have empty headlines or null URL fields.
GET /api/v1/topics/{topic_name} -- callable anonymously by topic name (e.g. /api/v1/topics/NASA). Returns data.topic (string) and data.timeline (array, often empty). This is a shallow lookup, not a rich drill-down.GET /api/v1/curators/{curator_id} -- requires a valid internal curator ID. No reliable anonymous path exists to discover curator IDs.Requires a person token (Authorization: Bearer ch_person_...):
GET /api/v1/replay?period=this_month -- cards seen, opened, saved, shared, dismissedGET /api/v1/stats/activity -- aggregates over signalsProduction note: GET /api/v1/stats/activity always returns data.stats.by_type regardless of group_by parameter. GET /api/v1/replay works with a valid person token (fixed April 14, 2026).
Radio is session-based audio delivery. Start a session, get tracks with MP3 URLs.
curl -X POST https://chowdahh.com/api/v1/radio-sessions \
-H 'content-type: application/json' \
-d '{"mode": "briefing", "duration_minutes": 5}'
headlines, briefing, topic_runready or playing -- always check data.state and send {"action": "resume"} if readyradio_session_id from the create response -- GET and PATCH do not echo it backPATCH /api/v1/radio-sessions/{id} with {"action": "skip|pause|stop"}. State transitions may not be synchronous -- pause may return while state remains playing/audio/abc-123) -- prefix with https://chowdahh.comtitle is not guaranteed. The live API returned null for tested tracks.Radio is not replay. Replay is card history. Radio is forward-looking audio.
Record interactions as a batch:
curl -X POST https://chowdahh.com/api/v1/signals \
-H 'content-type: application/json' \
-d '[{"signal_type": "save", "card_id": "card_abc"}]'
Types: seen, open, save, share, dismiss, source_open
Note: invalid or unrecognized signal types are silently skipped. Always inspect recorded in the response body — a 200 status does not guarantee signals were accepted.
Authorization: Bearer ch_person_..., 300 req/min, intended for replay + preferences + personalized feeds. See references/runner-playbook.md for current production status.Authorization: Bearer ch_cur_..., 600 req/min, high-volume submissionsguidance.next_best_actions as a suggestion layer when present, but always be prepared to fall back to the documented /api/v1 endpoints directlycontrols responsegood-news or similar lenses are exact if the API returns low confidenceFull API endpoint reference with request/response shapes and worked flows.
AX philosophy: how agents should feel when using Chowdahh, the local vs durable preference split, and tone guidance.