Raydn is building the newsdesk of the future: high-quality news in real time, written for people and machines alike. Until now, machines got the news second hand, scraped and stripped. Every Raydn story is chosen, researched, written and checked by its newsroom before it runs, 40 to 70 on a trading day. The moment it is published, it goes out here as clean data an agent can use as it is: the headline, the summary, the full text, and the tickers and names in it.
Building search or data tools for AI agents? We license the full feed. Write to desk@raydn.us.
How a news item is processed
- The wireSends news items over to the desk
- Desk EditorScores it, and approves it or bins it
- ReporterResearches and enriches it
- Copy EditorWrites and fact-checks it
- Editor-in-ChiefReads it, clears it, sends it back, or bins it
- The APIPublishes it
Sample reply
Edit the call and press Enter. Here it runs with no key, at most 3 stories a call and 10 calls a minute, and sees what a free key sees: stories from 6 hours to 5 days old. With a free key, up to 5, and with a paid key up to 100.
"as_of": "2026-11-04T23:20:45.538Z", "count": 1"id": 3806, "published_at": "2026-11-04T17:01:13.000Z", "updated_at": null, "category": ["other"], "tickers": [], "entities": ["Data Centers on the Ballot", "Trump administration", "OpenAI", "Anthropic"], "headline": "US voters back data centre limits almost everywhere they were asked, with one measure failing so far", "summary": "Early results from Tuesday's votes show restrictions winning in dozens of localities, and voters in Piqua, Ohio, removed officials who backed a Meta project. Past bans have so far delayed few projects.", "text": "Voters in dozens of US localities backed limits on data centres in Tuesday's elections, and early counts show almost no vote going the industry's way. <cite index=\"1-3\">According to Data Centers on the Ballot, 33 measures restricting data centre development have won, with six more questions leading.</cite> <cite index=\"1-4\">Only one, in Harwood, North Dakota, which adds a review process for industrial projects including data centres, has failed. Five have no posted results.</cite>\n\nThe measures were varied. <cite index=\"17-4\">They ranged from permanent bans and moratoriums to time-limited measures and limits based on facility size or energy use.</cite> Some were advisory: <cite index=\"19-1\">in Bloomington, Illinois, nearly 22,000 voters (78%) backed a nonbinding measure recommending a moratorium on large data centres.</cite>\n\nThe votes also reached officials. <cite index=\"14-1\">In Piqua, Ohio, voters approved a charter amendment restricting data centre construction and recalled three city commissioners, after months of debate over a planned Meta data centre.</cite> <cite index=\"14-2\">The amendment passed 66.70% to 33.30% in unofficial results.</cite> Heise reports <cite index=\"19-10\">a similar ouster in Yukon, Oklahoma.</cite>\n\nSome measures reach projects already in motion. <cite index=\"3-1\">Ashville residents voted to block a data centre campus that is already under construction,</cite> according to Fortune. <cite index=\"5-10\">Investinglive says Sunbury, Ohio, backed a ban on large data centres that could affect a proposed $2bn Amazon project.</cite>\n\nThe past record is the counterweight. Mezha reports that <cite index=\"17-9\">of more than 300 local data centre bans enacted across the US, only three developments, totalling 2.3 gigawatts, have been delayed.</cite> It adds that <cite index=\"17-10\">another 38 gigawatts are expected to come online by 2027.</cite>\n\nThat gap is the point. A ballot ban is a cheap instrument against capacity already financed, but it is a real one against sites not yet chosen, and developers and their lenders now have to price a permit that voters can revoke. <cite index=\"4-6\">An NBC exit poll found more than 50% of respondents called AI and data centres a crucial or major factor in their vote,</cite> according to Euronews. Next come votes on data centres in <cite index=\"2-10\">Arkansas on December 1 and North Dakota on Decembe"
Get a free key
A free key gets 5 stories a call, 10 calls a minute and 100 calls a day, and sees stories from 6 hours to 5 days old. One key to an email address. A paid key gets 100 stories a call, 60 calls a minute and no daily limit, and stories as they publish: write to desk@raydn.us.
For developers
Your first call: the 5 newest stories, with every option listed under it. Put your key in place of YOUR_KEY and run it in a terminal, or from Python or JavaScript.
curl -G "https://raydn.us/api/v1/stories" \ -H "Authorization: Bearer YOUR_KEY" \ -d limit=5 # Add any of these as more -d lines. They stack. # -d since=2026-11-04T14:00:00Z published or updated after this # -d id=3687,3685 # -d category=company_news any of these, comma between # -d tickers=NVDA,AMD # -d entities=Iran # -d published_from=2026-11-03 a date, or a date and time # -d published_to=2026-11-04 # -d updated_from=2026-11-03 # -d updated_to=2026-11-04 # -d headline=earnings contains this word # -d summary=guidance # -d text=buyback # -d related=1 add each story's related news # One story: # curl -H "Authorization: Bearer YOUR_KEY" "https://raydn.us/api/v1/stories/3809"
import requests
params = {
"limit": 5, # 1 to 100, default 20; a free key gets 5
# Any of these narrow it down. They stack.
# "since": "2026-11-04T14:00:00Z", # published or updated after this
# "id": "3687,3685",
# "category": "company_news", # any of these, comma between
# "tickers": "NVDA,AMD",
# "entities": "Iran",
# "published_from": "2026-11-03", # a date, or a date and time
# "published_to": "2026-11-04",
# "updated_from": "2026-11-03",
# "updated_to": "2026-11-04",
# "headline": "earnings", # contains this word
# "summary": "guidance",
# "text": "buyback",
# "related": 1, # add each story's related news
}
r = requests.get(
"https://raydn.us/api/v1/stories",
params=params,
headers={"Authorization": "Bearer YOUR_KEY"},
)
r.raise_for_status()
print("Calls left this minute:", r.headers["X-RateLimit-Remaining"])
reply = r.json()
print(reply["as_of"], reply["count"])
for s in reply["stories"]:
print(s["id"], s["published_at"], s["updated_at"])
print(s["category"], s["tickers"], s["entities"])
print(s["headline"])
print(s["summary"])
print(s["text"])
# One story: https://raydn.us/api/v1/stories/3809
const params = new URLSearchParams({
limit: "5", // 1 to 100, default 20; a free key gets 5
// Any of these narrow it down. They stack.
// since: "2026-11-04T14:00:00Z", // published or updated after this
// id: "3687,3685",
// category: "company_news", // any of these, comma between
// tickers: "NVDA,AMD",
// entities: "Iran",
// published_from: "2026-11-03", // a date, or a date and time
// published_to: "2026-11-04",
// updated_from: "2026-11-03",
// updated_to: "2026-11-04",
// headline: "earnings", // contains this word
// summary: "guidance",
// text: "buyback",
// related: "1", // add each story's related news
});
const r = await fetch(`https://raydn.us/api/v1/stories?${params}`, {
headers: { Authorization: "Bearer YOUR_KEY" },
});
if (!r.ok) throw new Error((await r.json()).error);
console.log("Calls left this minute:", r.headers.get("X-RateLimit-Remaining"));
const { as_of, count, stories } = await r.json();
console.log(as_of, count);
for (const s of stories) {
console.log(s.id, s.published_at, s.updated_at);
console.log(s.category, s.tickers, s.entities);
console.log(s.headline);
console.log(s.summary);
console.log(s.text);
}
// One story: https://raydn.us/api/v1/stories/3809
GET /api/v1/stories- The newest stories, newest first.
limit1 to 100, default 20. ExampleGET /api/v1/stories?limit=5 since- Only stories published or updated after this time (ISO 8601). To poll, send the
as_ofof the last reply. ExampleGET /api/v1/stories?since=2026-11-04T14:00:00Z related- Set to
1and each story also carriesrelated: the related news listed at the foot of its article page. Off by default. Works on both calls. ExampleGET /api/v1/stories/3809?related=1 GET /api/v1/stories/:id- One story.
Example
GET /api/v1/stories/3809 - Response
-
as_ofstringThe time of the response, ISO 8601, UTC.countintegerThe number of stories in it.storiesarray of story objectsThe stories, newest first. Example{"as_of": "2026-11-04T19:03:35Z", "count": 5, "stories": [ … ]} - Story object
-
idintegerThe story's number.published_atstringWhen it was published, ISO 8601, UTC.updated_atstring or nullWhen it was last updated, ISO 8601, UTC. Null if it never was.categoryarray of stringsTopic labels. Never empty:["other"]when there is none.tickersarray of stringsThe stocks it is about.entitiesarray of stringsThe people, companies and bodies it names.headlinestringThe headline.summarystring or nullThe line under the headline.textstring or nullThe article as plain text, paragraphs split by a blank line.relatedarray of objectsOnly withrelated=1, newest first. One of our stories iskind"story"with itsid,published_at,headline,summaryandurl. An item from the wire iskind"wire"with itspublished_atandtext. Example{"id": 3809, "published_at": "2026-11-04T18:13:03Z", "updated_at": null, "category": ["geopolitics", "company_news"], "tickers": ["CRWV"], "entities": ["CoreWeave", "Democratic Party"], "headline": "Credit investors are selling CoreWeave's bonds on Wednesday, some to new lows", "summary": "…", "text": "…"} - Filters
- Every field filters, and filters stack.
id=3687,3685.category,tickers,entities: any of the values, comma between, capitals aside, such astickers=NVDA,AMD.published_from,published_to,updated_from,updated_to: a date (a whole US Eastern day) or an ISO 8601 time.headline,summary,text: contains the word. ExampleGET /api/v1/stories?tickers=NVDA,AMD&published_from=2026-11-03&headline=earnings - Keys
- Send the key as
Authorization: Bearer YOUR_KEYorX-API-Key: YOUR_KEY. Never in the address. Examplecurl -H "X-API-Key: YOUR_KEY" "https://raydn.us/api/v1/stories" - Limits
- Each key has its calls a minute, and a free key its calls a day. Every reply says how many calls are left this minute in
X-RateLimit-Remaining. Over the minute is a 429 withRetry-After; over the day, a 429 until midnight US Eastern. Example429 Retry-After: 42 {"error": "Rate limit reached: 10 calls a minute."} - Errors
400a filter that does not read, anderrorsays which.401missing or unknown key.403key switched off.429over the limit. Example400 {"error": "limit must be a whole number from 1 to 5: a free key gets 5 stories a call."}