Raydn API

raydn.us

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

  1. The wireSends news items over to the desk
  2. Desk EditorScores it, and approves it or bins it
  3. ReporterResearches and enriches it
  4. Copy EditorWrites and fact-checks it
  5. Editor-in-ChiefReads it, clears it, sends it back, or bins it
  6. The APIPublishes it

Sample reply

GET

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. limit 1 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_of of the last reply. ExampleGET /api/v1/stories?since=2026-11-04T14:00:00Z
related
Set to 1 and each story also carries related: 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. ExampleGET /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 with related=1, newest first. One of our stories is kind "story" with its id, published_at, headline, summary and url. An item from the wire is kind "wire" with its published_at and text. 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 as tickers=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_KEY or X-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 with Retry-After; over the day, a 429 until midnight US Eastern. Example429 Retry-After: 42 {"error": "Rate limit reached: 10 calls a minute."}
Errors
400 a filter that does not read, and error says which. 401 missing or unknown key. 403 key switched off. 429 over the limit. Example400 {"error": "limit must be a whole number from 1 to 5: a free key gets 5 stories a call."}

Terms

  1. Wherever you show our stories, name Raydn as the source and link to raydn.us.
  2. Don't resell our stories, or pass them on as a feed of your own.
  3. Don't keep a bulk archive of our stories.
  4. We can switch off any key at any time.
  5. The API comes as it is, with no guarantee that it is complete, correct or always up.
  6. Nothing here is investment advice.