API & MCP documentation
Authentication
Generate a key in your dashboard — a free account is enough. Keys are shown once and stored only as a hash — if you lose it, revoke and generate a new one. Pass it as a bearer token or in x-api-key:
curl -H "Authorization: Bearer sk_live_..." \
"https://www.signalcrest.app/api/v1/entities?limit=10"
# equivalent
curl -H "x-api-key: sk_live_..." "https://www.signalcrest.app/api/v1/entities?limit=10"What a key returns
A key returns what its plan sees on the website, so the API never gives away more than the page does.
| Plan | Feed | History | Fresh signals |
|---|---|---|---|
| Free | Top 5 in full, corroborated first; the rest as locked rows | 7 days | Locked for 48h unless in the free top 5 |
| Scout | The full feed, corroborated first | 90 days | Open |
| Relay, Radar | The full feed, in score order | Full | Open |
Locked rows come back with "locked": true and no id, url or first_seen_at. Their score, source, spread and category stay, as they do on the website.
Endpoints
Two layers: entities are trends aggregated across communities (one row per technology) — signals are the item-level evidence underneath them. Start with entities.
GET/api/v1/entities
Entities ranked by cross-source momentum.
Query: category (optional), limit (default 50; max 200 on Relay, Radar and Scout, 30 on the free plan).
Returns name, locked, category, audience, signal_score, lifecycle, item_count, source_count, sources, first_seen_at.
GET/api/v1/entities/:name
Detail for one entity: current composite, score history for your plan's window, and the member items the score aggregates. 404s with the list endpoint named if the entity is unknown.
GET/api/v1/signals
Live item-level signals.
Query: category (optional), limit (default 50; max 200 on Relay, Radar and Scout, 30 on the free plan).
Returns id, locked, source, title, url, category, summary, audience, lifecycle, signal_score, source_spread, spread_entity, first_seen_at.
GET/api/v1/topics/:id
Topic detail including its score history for your plan's window.
Example response
{
"count": 2,
"entities": [
{
"name": "langchain",
"locked": false,
"category": "ai",
"signal_score": 61.4,
"lifecycle": "Heating",
"item_count": 13,
"source_count": 4,
"sources": ["github", "hackernews", "npm", "devto"],
"first_seen_at": "2026-07-19T04:31:12.000Z"
}
]
}Quotas & errors
- 100 requests/month on the free plan and Scout, 5,000 on Relay, 10,000 on Radar on a 30-day rolling window, plus a short-term burst limit of 120 requests/minute per key.
- Data refreshes every 30 minutes — polling faster than that returns the same scores.
- Need more? hello@signalcrest.app — we raise limits case by case.
| Status | Meaning |
|---|---|
| 401 | Missing or invalid key |
| 403 | The signal is locked on your plan: it is fresh and outside the free top 5. It opens to free keys once it is 48 hours old. |
| 404 | Unknown topic or entity |
| 429 | Burst or monthly quota exceeded |
| 503 | API temporarily unavailable, or the quota could not be checked — retry |
MCP server
Query the same data from Claude Code, Claude Desktop, or Cursor — ask “what's heating up in AI tooling this week?” and the model pulls live scores. Same key, same quota.
Claude Code:
claude mcp add --transport http signalcrest https://www.signalcrest.app/api/mcp --header "Authorization: Bearer YOUR_KEY"Or in any client's JSON config:
{
"mcpServers": {
"signalcrest": {
"type": "http",
"url": "https://www.signalcrest.app/api/mcp",
"headers": { "Authorization": "Bearer sk_live_..." }
}
}
}Four tools are exposed:
list_entities— trends aggregated across communitiesget_entity— one entity with history and evidencelist_signals— item-level signalsget_topic— one signal with its history
No-key surfaces
Free, no authentication, rate-limited by CDN cache:
- /feed.xml — RSS of the top public signals
/api/badge/:id— live SVG score badge for a README- /archive — every scored signal and entity past the 48-hour window