Cookbook

Automate a weekly ecosystem digest

Three feeds, one markdown file, no writing. The AI briefing does the prose; news and governance supply the evidence under it.

~25 min Python, stdlib onlyNo API key, no signup
/items/news/summary//items/news//items/dao/
01

Compose the three calls

/items/news/summary/ returns written prose rather than rows, which is what makes this a digest instead of a list. The headlines below it are the receipts — a briefing nobody can check is a briefing nobody trusts.

import json, urllib.request from urllib.parse import urlencode BASE = "https://api.alphaday.com" def get(path, **params): with urllib.request.urlopen(f"{BASE}{path}?{urlencode(params)}") as r: return json.load(r) def digest(tag, period=1): # period 1 = LAST_WEEK news = get("/items/news/", tags=tag, period=period, limit=5)["results"] summary = get("/items/news/summary/", tags=tag) dao = get("/items/dao/", tags=tag, limit=20)["results"] return news, summary, dao news, summary, dao = digest("ethereum") print(f"# Ethereum — week in review\n") print(summary.get("summary", "(no summary)"), "\n") print(f"## Headlines ({len(news)})") for n in news: mood = {2: "++", 1: "+", 0: "0", -1: "-", -2: "--"}.get(n.get("sentiment"), "?") print(f"- [{mood:>2}] {n['title'][:66]} ({n['source']['name']})") print(f"\n## Governance ({len(dao)} proposals)") for d in dao[:4]: print(f"- {d['title'][:62]} ends {d['ends_at'][:10]}")

What it prints

Produced by running the code above against the live API, not written by hand.

# Ethereum — week in review Ethereum and Base developers have abandoned their joint effort to align account abstraction proposals. Uniswap Labs stable pair hook became the highest volume pool on Ethereum. Ethereum builders face challenges between locking up cash or relying on trusted brokers amid market shifts. ## Headlines (5) - [--] Ethereum and Base abandon joint account abstraction standard (Crypto.news) - [ +] BitMine Buys $68M in Ethereum, Nears 6 Million ETH (Contribune) - [ +] Bitcoin options lead $16.6B Q3 crypto expiry (Crypto.news) - [++] Uniswap Labs' stable pair hook becomes highest volume pool on Ethe (CryptoBriefing) - [ -] Ethereum, Base developers abandon effort to align account abstract (The Block) ## Governance (20 proposals) - [AIP-125] Launch on Base ends 2026-09-17 - [AIP-124] Deprecate alUSD and alETH Bridging + Wind Down v3 on ends 2026-09-17 - [1IP-106] Establish the 1inch DAO Security Council and Ratify ends 2026-09-19 - Authorize a Contingent LDO CEX Liquidity Market-Making Mandate ends 2026-09-21

Actual output, 15 Sep 2026. Two honest details: the same account-abstraction story appears twice from different outlets, because deduping across ~50 sources is your job and not the API's; and the governance section lists Alchemix, 1inch and Lido proposals under an Ethereum digest, because those are Ethereum DAOs.

Variations

The same shape, pointed somewhere else. Every figure below came back from the live API.

Monthly instead of weekly

period=2 widens to a month — 1,024 Ethereum articles rather than a week's handful. The AI summary is recomputed server-side and does not take a period, so only the evidence section widens.

news, summary, dao = digest("ethereum", period=2)

One digest per DAO

Scope governance with sources rather than tags and the section stops reporting the whole Ethereum ecosystem under one project's name.

dao = get("/items/dao/", sources="arbitrum_dao", limit=20)["results"]

Dedupe the headlines

The same story arrives from several of the ~50 outlets. Group on a normalised title before printing, or the digest reads like it is stuttering — as the output above does.

seen = set() news = [n for n in news if not (k := n["title"].lower()[:40]) in seen and not seen.add(k)]

Before you build on this

Ecosystem tags are broader than they look

tags=ethereum on governance returns 4,727 proposals because Alchemix, 1inch and Lido are all Ethereum DAOs. That is correct behaviour, not a bug, but it means a per-project digest reads wider than a reader expects. Filter by sources when you want one DAO.

period does not apply to governance

Proposals carry starts_at and ends_at rather than published_at, so a period filter passes through without narrowing anything. Window governance on its own dates.

Sentiment is per article, not per project

Each news item carries sentiment (-2 to +2) and sentiment_score. There is no project-level mood field — averaging is your call, and a mean over 50 articles can read positive in a week whose single biggest story scored -2.