API Documentation

Base URL: https://agentsignal.dev

Default response format: Markdown. Add ?format=json for structured JSON.

No authentication required. Rate limited by IP. Persistent SQLite storage.

Pull — Get Signals

GET /feed

Returns ranked signals from all sources. Markdown by default.

curl agentsignal.dev/feed

Query Parameters:

ParamExampleDescription
topic?topic=aiKeyword filter (title, summary, topics)
source?source=hackernewsFilter by source name (comma-separated)
type?type=news,marketFilter by signal type
min_score?min_score=70Minimum signal score (0-100)
limit?limit=50Results count (default 30, max 100)
after?after=2026-03-14T10:00:00ZOnly signals after this timestamp
format?format=jsonOutput format: markdown (default) or json
follow?follow=f_abc123Use a follow subscription for filtering
since_idNEW?since_id=sig_hn_123Cursor pagination — only signals newer than this ID
fromNEW?from=2026-03-14T00:00:00ZHistorical replay — start of time range (ISO 8601)
toNEW?to=2026-03-14T12:00:00ZHistorical replay — end of time range (ISO 8601)

Response Headers:

HeaderExampleDescription
ETag"a1b2c3d4e5f6"Hash of signal IDs — use with If-None-Match
Last-ModifiedSat, 14 Mar 2026 10:30:00 GMTTimestamp of most recent signal
X-Latest-Idsig_hn_12345ID of most recent signal — use as since_id cursor
X-Signal-Count30Number of signals in response
X-Next-Poll60Suggested seconds before next poll
X-TruncatedtruePresent when historical replay results were capped at 500
Cache-Controlpublic, max-age=30Safe to cache for 30 seconds

Example response (JSON):

{
  "ok": true,
  "count": 30,
  "timestamp": "2026-03-14T10:30:00Z",
  "latest_id": "sig_hn_12345",
  "signals": [
    {
      "id": "sig_hn_12345",
      "timestamp": "2026-03-14T10:25:00Z",
      "type": "social",
      "source": "hackernews",
      "title": "Show HN: Unified signal feed for AI agents",
      "summary": "342 points by user | 89 comments",
      "url": "https://news.ycombinator.com/item?id=12345",
      "topics": ["ai", "agents", "show-hn"],
      "score": 78,
      "metadata": {
        "score": 342,
        "comments": 89,
        "entities": {
          "companies": ["OpenAI"],
          "tickers": [],
          "people": []
        }
      }
    }
  ]
}

GET /sources

Lists all registered sources and their current status.

curl agentsignal.dev/sources

GET /health

Health check. Returns uptime, timestamp, and whether /ask is enabled.

Delta Updates NEW

Efficient polling — only fetch what's new. Three methods to avoid re-downloading the entire feed.

Option 1: Cursor Pagination (since_id)

Save the X-Latest-Id header from each response. Pass it back on the next request to get only newer signals.

# First request
curl -i agentsignal.dev/feed?format=json
# → X-Latest-Id: sig_hn_12345

# Next poll — only new signals
curl agentsignal.dev/feed?format=json&since_id=sig_hn_12345

Option 2: ETag / Conditional Requests

Use standard HTTP caching. If nothing changed, you get a 304 Not Modified (empty body, zero tokens).

# First request
curl -i agentsignal.dev/feed
# → ETag: "a1b2c3d4e5f6"

# Conditional poll
curl -H 'If-None-Match: "a1b2c3d4e5f6"' agentsignal.dev/feed
# → 304 Not Modified (if no new signals)

Option 3: Historical Replay (from / to)

Query a specific time window. Max 500 signals per replay. SQLite-backed, so historical data persists across restarts (up to 7 days).

# What happened in the last 6 hours?
curl "agentsignal.dev/feed?format=json&from=2026-03-14T04:00:00Z&to=2026-03-14T10:00:00Z"

# All high-signal crypto from yesterday
curl "agentsignal.dev/feed?format=json&from=2026-03-13T00:00:00Z&to=2026-03-14T00:00:00Z&topic=crypto&min_score=70"

If results are capped, the response includes X-Truncated: true header. Narrow your time range or add filters.

Ask — Question Answering

POST /ask

Ask a natural language question. Get an answer grounded in real-time signals, powered by Claude.

Requires ANTHROPIC_API_KEY on the server. Rate limited to 20 questions/hr per IP.

curl -X POST agentsignal.dev/ask \
  -H "Content-Type: application/json" \
  -d '{"q": "What happened to crypto in the last 2 hours?"}'

Request Body:

FieldTypeDescription
qstring (required)Your question
lookbackstringTime window: "1h", "6h", "24h" (default: "6h")

Response (plain text by default):

BTC dropped 5.2% to $82,100 following hawkish Fed comments.
ETH and SOL down 3-4%. Polymarket June rate cut odds fell
from 62% to 41%. Social sentiment bearish across Reddit and HN.

Follow — Topic Subscriptions

Create personalized feeds by following topics. Like Google Alerts but for agents, across all sources, ranked. Persisted in SQLite — survives restarts.

POST /follow

Create a new topic subscription.

curl -X POST agentsignal.dev/follow \
  -H "Content-Type: application/json" \
  -d '{"topics": ["ai", "regulation"], "min_score": 60}'

Request Body:

FieldTypeDescription
topicsstring[] (required)Keywords to follow (max 10)
sourcesstring[]Only these sources
typesstring[]Only these signal types
min_scorenumberMinimum score (0-100)

Response:

{
  "ok": true,
  "follow_id": "f_abc123",
  "topics": ["ai", "regulation"],
  "min_score": 60,
  "feed_url": "/feed?follow=f_abc123"
}

Then poll your personalized feed:

curl agentsignal.dev/feed?follow=f_abc123

GET /follow

List all your follows (identified by IP).

GET /follow/:id

Get details of a specific follow.

DELETE /follow/:id

Delete a follow subscription.

Webhooks — Real-time Push NEW

Instead of polling, register a URL and AgentSignal pushes new signals to you in real time. Includes retry logic and dead agent detection.

POST /webhooks

Register a webhook endpoint.

curl -X POST agentsignal.dev/webhooks \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-agent.com/signals",
    "topics": ["ai", "crypto"],
    "min_score": 50
  }'

Request Body:

FieldTypeDescription
urlstring (required)HTTPS endpoint to receive POSTs
topicsstring[]Only push signals matching these topics
min_scorenumberMinimum score threshold (default: 0)

Response:

{
  "ok": true,
  "webhook_id": "wh_abc123",
  "url": "https://your-agent.com/signals",
  "topics": ["ai", "crypto"],
  "min_score": 50
}

Webhook Payload

When new signals match your criteria, AgentSignal POSTs a JSON payload to your URL:

{
  "event": "new_signals",
  "timestamp": "2026-03-14T10:30:00Z",
  "webhook_id": "wh_abc123",
  "signals": [
    {
      "id": "sig_hn_12345",
      "title": "Breaking: Major AI regulation bill passed",
      "score": 85,
      "source": "google-news",
      "type": "news",
      "url": "https://...",
      "timestamp": "2026-03-14T10:28:00Z",
      "summary": "Congress passes comprehensive AI safety legislation..."
    }
  ]
}

Retry & Dead Agent Detection

If your endpoint fails, AgentSignal retries with exponential backoff:

AttemptDelayTimeout
1stImmediate5 seconds
2nd1 second5 seconds
3rd4 seconds5 seconds

After 10 consecutive failures, the webhook is marked dead and skipped in future dispatches. Re-register to reactivate.

GET /webhooks

List your registered webhooks (by IP).

curl agentsignal.dev/webhooks

DELETE /webhooks/:id

Delete a webhook.

curl -X DELETE agentsignal.dev/webhooks/wh_abc123

Security

Sources

All sources are free, require no API keys, and are polled on fixed intervals.

SourceTypeWhatInterval
Hacker NewssocialTop 30 stories60s
Redditsocial6 subreddits, hot posts120s
Google NewsnewsGeneral, tech, business120s
CoinGeckomarketTop 20 coins + trending60s
Yahoo FinancemarketMajor indices + active stocks120s
DeFi LlamamarketTop DeFi protocols by TVL change120s
PolymarketeventsPrediction markets ($10K+ volume)300s
KalshieventsRegulated event contracts300s
MetaculuseventsCommunity forecasting questions300s
RSS Feedsnews15 feeds: BBC, Wired, Axios, Politico + more120s
TechmemenewsCurated tech news aggregator120s
CrunchbasenewsStartup funding + acquisitions600s
SEC EDGARnews8-K material event filings600s
Congress.govnewsMost viewed bills + legislation600s
CVE / NVDnewsSecurity vulnerabilities by severity300s
GDELTnewsGlobal event monitoring300s
ArXivscienceAI/ML/CS papers300s
Hugging FacescienceTrending AI models300s
GitHub TrendingsocialTrending repos daily300s
Product HuntsocialDaily product launches300s
LobsterssocialCurated tech discussion120s
FREDmarketEconomic indicators (CPI, GDP, rates)3600s

Live Source Status

Loading...

Signal Scoring v2 NEW

Every signal is scored 0-100 using an entity-aware, multi-factor scoring engine:

FactorWeightWhat it measures
Engagement30%Upvotes, comments, volume — type-aware normalization (science papers get 2x multiplier vs social)
Recency25%Exponential decay — half-life of ~6 hours
Magnitude20%Price change %, earthquake magnitude, prediction odds shift
Cross-source15%Entity-based matching — same company/person/ticker across sources. 4+ sources = 100, 3 = 80, 2 = 50
Authority10%Topic-dependent — USGS scores 95 for geo but 30 for other topics. CoinGecko scores 85 for markets.

Developing Story Detection

When the same entity (company, person, ticker) appears in 3+ signals from different sources within 2 hours, all related signals get a +15 score boost. This surfaces breaking/developing stories automatically.

Intelligence Pipeline

Sources Pre-filter Entity Extraction Score SQLite Enrich (Haiku) Dispatch

Pre-filter: Removes duplicate URLs, garbage titles (<10 chars), title=summary artifacts.

Entity extraction: Regex-based ticker detection ($BTC, $AAPL), company name mapping (~30 variants), notable people lookup (~20), unified topic keywords (~40).

Feed output groups signals into tiers: High Signal (80+), Notable (40-79), Background (<40).

Signal Enrichment NEW

High-scoring signals (score ≥ 60) are automatically enriched via Claude Haiku. Enrichment extracts structured entities, generates a 1-line "why this matters" summary, and assigns a category.

Enriched signals include in metadata:

{
  "metadata": {
    "enrichment": {
      "entities": {
        "people": ["Sam Altman"],
        "companies": ["OpenAI", "Microsoft"],
        "tickers": ["$MSFT"]
      },
      "summary": "OpenAI announces GPT-5, signaling major competitive shift in AI race",
      "category": "AI"
    }
  }
}

Categories: AI, Crypto, Markets, Geopolitics, Science, Tech, Security, Climate, Sports, Economy, Other

Enrichment is async — signals appear immediately, enrichment data follows within seconds. Requires ANTHROPIC_API_KEY.

Signal Schema

Every signal follows this exact shape, regardless of source:

{
  "id": "sig_hn_12345",          // Unique identifier
  "timestamp": "2026-03-14...",  // ISO 8601
  "type": "social",              // news | market | social | events | science | geo
  "source": "hackernews",       // Source name
  "title": "...",                // Signal title
  "summary": "...",              // 1-2 sentence summary
  "url": "https://...",          // Original source URL (unique — dedup key)
  "topics": ["ai", "tech"],     // Topic tags (auto-extracted)
  "score": 78,                   // Signal score 0-100
  "metadata": {                  // Source-specific data + entities + enrichment
    "entities": { ... },
    "enrichment": { ... }
  }
}

Rate Limits

EndpointLimitWindow
/feed, /sources, /follow100 requestsPer hour, per IP
/webhooks100 requestsPer hour, per IP
/ask20 requestsPer hour, per IP

Responses include X-Next-Poll: 60 header suggesting when to call back. Use ?since_id= or If-None-Match for efficient delta polling.