Documentation

API Reference

Base URL: https://www.instnews.net

All responses are JSON. Authentication is optional — unauthenticated requests receive free-tier access, no API key required. Send X-API-Key: <key> (Pro and Max; create keys in your account dashboard) or Authorization: Bearer <token> to unlock your paid tier.

Machine-readable spec: OpenAPI 3.1 spec (/openapi.json).

Rate Limits

TierRequests per minuteItems per requestHistory depth
Free30507 days
Pro3002001 year
Max1,0005005 years

Exceeding the rate limit returns 429.

GET/api/news

Returns news items, newest first, with optional filtering.

ParameterTypeDefaultDescription
limitinttier maxNumber of items (Free: 50, Pro: 200, Max: 500). With from/to set on Pro/Max, up to 5× the tier max (hard cap 2,000)
sourcestringallFilter by a single source name (see /api/sources)
sourcesstring—Comma-separated source names (up to 100). An empty value (sources=) returns no items
source_typestringallsocial (X/Twitter and Truth Social accounts) or rss (every non-social source)
sentimentstringallFilter: bullish, bearish, neutral
qstring—Keyword search in title and summary
tickersstring—Comma-separated tickers (up to 100, case-insensitive), matched against each item's target_asset. All tiers
fromstring—Start date (ISO 8601). Pro and Max
tostring—End date (ISO 8601; a bare YYYY-MM-DD includes the whole day). Pro and Max
beforeint—Cursor: only items with id lower than this (older page). Pass the previous response's next_before
afterint—Cursor: only items with id higher than this (newer arrivals since your last poll)
hide_dupbool—1/true drops items flagged as duplicates. Pro and Max (ignored on Free)
tradablebool—1/true returns only items the AI marked tradeable. Max only (ignored on other tiers)
curl -s "https://www.instnews.net/api/news?tickers=NVDA,AMD&limit=10" | jq .

Response envelope: {"count": N, "items": [...], "next_before": <id or null>}.

Response Fields

FieldFreeProMaxDescription
id✓✓✓Unique item ID (cursor for before/after)
title✓✓✓Headline text
link✓✓✓URL to original article
source✓✓✓Feed source name
published✓✓✓Publication time (ISO 8601)
fetched_at✓✓✓Time InstNews ingested the item (ISO 8601)
summary✓✓✓Article excerpt (max 500 chars)
target_asset✓✓✓The one ticker the item is about (AI-assigned), or null
asset_type✓✓✓Asset class of target_asset (e.g. STOCK)
sentiment_score✗✓✓Score from -1.0 to 1.0
sentiment_label✗✓✓bullish, bearish, or neutral
duplicate✗✓✓1 if duplicate, 0 if original
confidence✗✗✓AI confidence in the ticker call (0–1)
risk_level✗✗✓AI risk assessment
tradeable✗✗✓Whether the AI considers the item actionable
reasoning✗✗✓Short AI rationale for the ticker call
priced_in✗✗✓Pre-news price run-up score (with priced_in_detail, priced_in_checked)
GET/api/news/stream

Server-Sent Events (text/event-stream) push of items as their AI analysis lands. Every tier can connect; each event's data is shaped with the same per-tier field rules as /api/news.

ParameterTypeDefaultDescription
since_seqint or latestlatestResume cursor. A number replays every event after that sequence, then streams live. latest (or omitted) starts at the live tail and first sends a cursor event carrying the current sequence

Wire format — one frame per event; id is the event sequence:

id: 1234
event: verdict
data: {"seq": 1234, "event_type": "verdict", "emitted_at": "2026-10-18T14:30:05+00:00", "data": {"news_id": 98765, "title": "...", "source": "...", "target_asset": "NVDA", ...}}

: hb 1760797805
curl -N "https://www.instnews.net/api/news/stream"
GET/api/sources

Returns all active feed sources with item counts.

curl -s "https://www.instnews.net/api/sources" | jq .
GET/api/stats

Returns aggregated statistics: total items, by source, by sentiment, average score.

curl -s "https://www.instnews.net/api/stats" | jq .
GET/api/auth/me

Requires authentication. Returns the current user's profile.

GET/api/auth/tier

Returns the current user's tier, feature flags, and limits. Works for anonymous users.

POST/api/billing/checkout

Requires authentication. Creates a Stripe Checkout session for upgrading.

// Request body
{"tier": "pro"}

// Response
{"url": "https://checkout.stripe.com/c/pay/cs_..."}

Error Responses

StatusMeaning
400Bad request (invalid parameters)
401Authentication required
403Feature not available on your tier
429Rate limit exceeded
503Service unavailable (e.g. Stripe not configured, all stream slots busy)