Developers
Everything megachangelog tracks is available over four channels — a read-only REST API, RSS feeds, an MCP server, and signed webhooks. The base URL is https://megachangelog.com.
Authentication
Browsing is anonymous. You only need a key for per-user data (your feed and account).
Create an API key on your account page. Keys look like mck_<prefix>_<secret> and are shown once at creation — store the full value. Send it as a bearer token:
Authorization: Bearer mck_<prefix>_<secret>For read-only RSS access to your personal feed there is also an unguessable feed token (manage it on your account page) powering /feed/<token>/rss.xml — no header required, so it works in any feed reader.
REST API
Versioned under /api/v1, JSON responses, CORS open to all origins, and limit/offset paging (max 100). Public endpoints are edge-cached; authenticated ones are private, no-store.
/api/v1Index — lists every endpoint, feed, and MCP tool.
/api/v1/companiesTracked companies. Query: industry, search, limit, offset.
/api/v1/companies/{slug}One company plus its recent entries.
/api/v1/entriesRecent entries across all companies. Query: company (slug), limit, offset.
/api/v1/playlists/{id}A public or unlisted playlist: its companies and a merged feed.
/api/v1/meauthThe authenticated user (name, email, key scopes).
/api/v1/me/feedauthThe authenticated user's personal feed (followed companies).
Examples
# Public — no auth, CORS-enabled (Access-Control-Allow-Origin: *)
curl "https://megachangelog.com/api/v1/entries?limit=5"
curl "https://megachangelog.com/api/v1/companies?industry=developer-tools&search=ver"
curl "https://megachangelog.com/api/v1/companies/vercel"# Authenticated — create a key at https://megachangelog.com/account
curl -H "Authorization: Bearer mck_<prefix>_<secret>" \
"https://megachangelog.com/api/v1/me/feed?limit=60"Entry shape
List endpoints return { data, pagination }. Each entry is the same stable object everywhere (REST, MCP, and webhooks):
{
"id": "…",
"title": "Increased Blob store limit for Hobby users",
"summary": "Hobby projects can now store up to 1 GB in Blob.",
"version": null,
"changeType": "improvement",
"tags": ["storage"],
"publishedAt": "2026-06-20T12:00:00.000Z",
"url": "https://megachangelog.com/changes/vercel/increased-blob-store-limit-…",
"sourceUrl": "https://vercel.com/changelog/…",
"company": { "slug": "vercel", "name": "Vercel" }
}RSS feeds
RSS 2.0 with full content:encoded. Point any reader at these URLs.
/rss.xmlEverything, newest first.
/companies/{slug}/rss.xmlA single company.
/playlists/{id}/rss.xmlA public or unlisted playlist.
/feed/{feedToken}/rss.xmlYour personal feed, authenticated by the unguessable token.
MCP server
A streamable-HTTP Model Context Protocol server at /api/mcp. Browse tools work anonymously; pass a bearer key to unlock get_my_feed.
claude mcp add --transport http megachangelog \
https://megachangelog.com/api/mcp \
--header "Authorization: Bearer mck_<prefix>_<secret>"search_companiesSearch companies by name, optionally filtered by industry.
list_recent_changesRecent entries across all companies, or scoped to one.
get_company_changelogOne company's recent entries with a header.
get_playlistA public/unlisted playlist's companies and merged feed.
get_my_feedauthThe authenticated user's personal feed.
Webhooks
Get an HTTP POST when companies you follow (directly or in a playlist) publish new changes. Register endpoints on your account page.
Each delivery is a JSON POST carrying every new entry since the last successful delivery (newest companies you watch, capped per delivery). The only event today is entry.created.
POST <your-endpoint>
Content-Type: application/json
User-Agent: megachangelog-webhooks/1
X-Megachangelog-Event: entry.created
X-Megachangelog-Delivery: <uuid>
X-Megachangelog-Webhook-Id: <uuid>
X-Megachangelog-Signature: sha256=<hex>
{
"event": "entry.created",
"deliveryId": "…",
"webhookId": "…",
"deliveredAt": "2026-06-22T13:15:00.000Z",
"entries": [ /* array of entry objects, same shape as the REST API */ ]
}Verifying the signature
Every request carries X-Megachangelog-Signature: sha256=<hex>, an HMAC-SHA256 of the raw request body keyed by your endpoint's signing secret (shown once when you create or rotate it). Reject requests that don't match.
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody must be the exact bytes you received (do not re-serialize JSON).
function verify(secret, rawBody, signatureHeader) {
const expected =
"sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(signatureHeader);
const b = Buffer.from(expected);
return a.length === b.length && timingSafeEqual(a, b);
}Delivery & retries: a failed delivery is retried on the next cycle (the cursor only advances on success), and an endpoint that keeps failing is automatically disabled — re-enable it from your account page. Respond with a 2xx within 10 seconds to ack.