Where the public dollars go.
Thursday, September 24, 2026 (UTC)
Front

API ยท v1

The API

Get this paper as data. Every published story with the facts it cites, plus sections, the archive, search, the front page, the video editions, and a way to sign a reader up. No key. No sign-up.

15 endpointsNo key neededWorks from a browserJSON, UTF-8
Base addresshttps://gov-spending.newsroomfloor.com/api/v1

Your first call

The five newest stories. Paste one line.

curl -s "https://gov-spending.newsroomfloor.com/api/v1/stories?limit=5"
const r = await fetch("https://gov-spending.newsroomfloor.com/api/v1/stories?limit=5");
const { stories } = await r.json();
for (const s of stories) console.log(s.headline, s.url);
import requests

r = requests.get("https://gov-spending.newsroomfloor.com/api/v1/stories", params={"limit": 5})
for s in r.json()["stories"]:
    print(s["headline"], s["url"])

Endpoints

Pick one, fill in the fields, run it. It calls this paper for real, so what you see is what your code will get.


Put a story on your own page

Pick a story and copy the code. It shows the headline, the picture and the paper's name, and it links back here. It sets no cookies.

Story
Preview
<iframe src="https://gov-spending.newsroomfloor.com/embed/STORY_ID" title="Story card" width="100%" height="260" style="border:0;width:100%;max-width:640px" loading="lazy"></iframe>
<iframe src="https://gov-spending.newsroomfloor.com/embed/STORY_ID" title="Story card" width="100%" height="260" style="border:0;width:100%;max-width:640px" loading="lazy"></iframe>
<script>
window.addEventListener("message", function (e) {
  if (!e.data || e.data.nrfEmbed !== 1) return;
  var f = document.querySelector('iframe[src*="/embed/STORY_ID"]');
  if (f && e.data.height) f.style.height = e.data.height + "px";
});
</script>
https://gov-spending.newsroomfloor.com/story/STORY_ID

The plain version works anywhere, including places that strip scripts. Use auto height only on a page you control.

What you can build

Four things people ask for. Each one lists the endpoints it needs.

1

Headlines on your own site

Get the newest stories. Show the headline, the section and the link. Refresh on a timer.

2

A bot that posts the day

One endpoint returns each story already sized for a post: headline, link, picture.

3

Your own mailing list

Collect an address on your page and send it here. The reader confirms by email before anything goes out.

4

An agent that reads the paper

Start at the index. It lists every endpoint. The OpenAPI file describes them, and each story carries the facts it is built on.

Who can read what

What you send decides what comes back. There is nothing to set in the address.

No key

Everything this paper publishes: stories, their sources, the sections, the archive, search. Send nothing extra.

A desk key

For the people who run this paper. Adds drafts, source proofs, settings and the subscriber list. Ask an admin for one, then send it as Authorization: Bearer nrf_...

A reader key

For a reader signed in to this paper. Adds whatever their subscription includes, and nothing else. They get it when they sign in.

Have a key?

Paste it here and the calls below will use it. It stays in this browser.

A reader's key comes with a sign-in on this paper's Members page. The team that runs this paper mints its own keys under Desk settings. Sign in for yours

Before you use it

Use

Read it, cache it, publish it, feed it to a model. Say where it came from and link the story you quote.

How often

The paper changes a few times a day. Call it every few minutes at most. On the posts endpoint, use since= so you only get what is new.

Footnotes

A story's text carries [^1] marks. The cited_facts list beside it says what each one is. Show them. They are the evidence.

Signatures

Every story is stored with a content hash and a signed receipt. That proves who filed it and that it has not changed. It does not prove the story is right.

Other formats

The same paper in the shapes a program expects.

Every way to get this paper