Navvo
API Reference

News & Markets

Live news headlines and market quotes, fetched server-side so your client never talks to a third-party feed.

News & Markets

Two small read-only endpoints that back the ambient widgets on a Navvo home or map screen: a topic-filtered news feed and a market quote lookup. Both are fetched and cached server-side, so your client makes one same-origin call to Navvo instead of reaching out to a third-party feed with its own keys, quotas and CORS rules.

Scope required: none — any valid API key works.

These endpoints exist to fill a widget, not to be a news or financial data platform. Responses are short, cached, and intentionally shallow: headline, link, image, timestamp for news; last price and day change for markets. If you need full articles, historical bars or intraday ticks, use a dedicated provider.

GET /widgets/news

Recent headlines across one or more topics, interleaved so every topic you ask for is represented.

curl -s "https://navvo.io/api/v1/widgets/news?topics=business,technology&limit=10" \
  -H "x-api-key: nvvo_YOUR_KEY"

Query parameters

topics
string
Comma-separated topic list. Supported: world, middleeast, business, technology, science, health, sports. Unrecognised topics are silently dropped; if nothing valid remains, it falls back to world. Defaults to world.
limit
integer
Maximum headlines to return, 1–20. Defaults to 8. Values outside the range are clamped.

Response

{
  "ok": true,
  "topics": ["business", "technology"],
  "items": [
    {
      "title": "Is football AI-proof? Why tech investors wanted a slice of the World Cup",
      "url": "https://www.bbc.co.uk/news/articles/cd7l4e3v238o",
      "source": "BBC Business",
      "image": "https://ichef.bbci.co.uk/ace/standard/240/cpsprodpb/…jpg",
      "topic": "business",
      "publishedAt": "2026-08-09T08:12:00.000Z"
    }
  ]
}
ok
boolean
false when no headlines could be assembled at all (every upstream feed was unreachable). items is then empty — render your widget's empty state rather than treating it as an error; the HTTP status is still 200.
topics
string[]
The topics actually used, after dropping unrecognised ones. Compare against what you sent to detect a typo.
items[].source
string
The publication the headline came from. Display it — you are surfacing someone else's journalism, and the link should point at their page.
items[].image
string | null
Thumbnail URL when the feed supplied one, otherwise null. Always guard for null.
items[].publishedAt
string | null
ISO-8601 UTC timestamp, or null when the feed omitted a date.
Interleaving. Topics are round-robin merged, not concatenated — asking for business,technology with limit=10 gives you roughly five of each, in alternating order, rather than ten business headlines. Ask for one topic if you want a single-subject list.
Caching. Each topic is cached for 10 minutes server-side. Polling faster than that returns the same payload and costs you quota for nothing — refresh on a 10-minute timer or on screen focus.

GET /widgets/markets

Last price and day change for up to twelve symbols.

curl -s "https://navvo.io/api/v1/widgets/markets?symbols=AAPL,MSFT" \
  -H "x-api-key: nvvo_YOUR_KEY"

Query parameters

symbols
string
Comma-separated ticker list, max 12 (extras are dropped). Equities use their plain ticker (AAPL, MSFT); pairs use the hyphenated form (BTC-USD). Defaults to AAPL,MSFT,GOOGL,BTC-USD.

Response

{
  "ok": true,
  "items": [
    { "symbol": "AAPL", "name": "Apple",     "price": 313.33, "currency": "USD", "change": 2.33,  "changePct": 0.75 },
    { "symbol": "MSFT", "name": "Microsoft", "price": 499.99, "currency": "USD", "change": 12.53, "changePct": 2.57 }
  ]
}
ok
boolean
true when at least one symbol resolved to a price. A single unknown ticker does not fail the request.
items[].name
string
A friendly name for well-known tickers; falls back to the symbol itself when unknown.
items[].price
number | null
Last traded price, or null if the symbol could not be resolved. Check for null before formatting — an unknown ticker still returns an entry so the response lines up with what you asked for.
items[].change / changePct
number | null
Absolute and percentage change on the day. Negative values mean the symbol is down.
Caching. Quotes are cached for 60 seconds per symbol. This is a widget feed, not a trading tape — do not build anything that depends on tick-level freshness.

Errors

Both endpoints return 200 with ok: false and an empty items array when their upstream data is unavailable, rather than surfacing an upstream failure as a 5xx. Design your widget for the empty case. Standard authentication and rate-limit errors apply as usual.

Copyright © 2026