API

Every issue as JSON, at addresses that will not move. Nothing here is generated for the API — it is what the pipeline already wrote, in another shape. 124 days are available, the oldest from June 2026.

Addresses

api/index.json
Every day, newest first: date, state, how many papers, the headline line, and the URL of the page. Days with no issue are in here too — a gap would say nothing happened.
api/latest.json
The newest issue in full, at an address that does not move.
api/issues/<date>.json
One day in full. <date> is YYYY-MM-DD.

There is no rate limit and no key. It is a static file on a CDN; fetch it like any other file. Measured on 2026-08-24: this address answers with Access-Control-Allow-Origin *, so a browser on any origin may read it. The same files under raw.githubusercontent.com do too, but arrive as text/plain rather than application/json, and the repository layout is not part of the promise below — prefer these addresses. Only simple requests work: a preflight (OPTIONS) is answered 405, so send a plain GET and do not add custom headers.

Fields

Two of these have had a name that disagreed with their meaning, so both are spelled out rather than left to be guessed.

date
The day the issue covers.
state
published, quiet, no_headline or not_seen. ★ Derived here from the day's contents, not read from the stored quiet_day flag — that flag answers 'did anything clear the headline bar', and it is true on days that published nine papers. quiet here means nothing was published at all.
backfilled
The issue was assembled after the fact from archived candidates, because nobody was watching that morning. It is part of the method, not a fault — but those days skipped arXiv enrichment, so their contents differ slightly.
withheld
The reason the live run that morning published nothing, when there was one. A day can be both withheld and backfilled: the run refused and the issue was built later. Both facts are kept.
recent
Our knowledge of this day is still settling — arXiv indexes about three days late. Papers posted around then can still appear in a *later* issue. Issues never change once published.
headline.present
★ Whether there is a line in headline.line. It does not mean a paper stood out: since 0Z-B the threshold chooses the headline's *shape*, not whether there is one. headline.basis records which.
headline.basis
How the line was produced: llm:lead (written about one paper), llm:day (written about the day), :retry if a check rejected the first attempt, fallback:<reason> if no attempt passed.
silent_sources
★ Sources we promise to read that answered on this day and returned nothing — arXiv, OpenAlex, or both. The issue was still published: the papers in it are real, and withholding them would trade a partial day for none. What is missing is the other half of the scope. Empty on a normal day, and empty on a day with no issue, where withheld carries the reason instead.
counts.arxiv_categories
How many arXiv categories the run was configured to query. It does not say that arXiv answered — silent_sources says that, and on 2026-09-07 this field reads 7 while arXiv contributed nothing.
counts.unreadable
Papers we could see existed and could not read, because no source exposed an abstract. Published because it is the one blind spot this pipeline measures exactly.
scores.relevance
The classifier's probability for the arXiv path. On the journal path the paper entered because a journal we track published it, and the classifier is not consulted.
scores.headline
What decides the headline's shape. A third of the archive sits at exactly 0.44; treat small differences as noise.
summary
What the paper did and why it matters, written by a model from the abstract. Not under the open licence — see below.
synthesis.tag_shift
★ Tags that ran above their own 30-day average on this day, with that average. Recomputed from the archive on every build, not stored in the issue — an issue never changes once published, and this number was wrong in issues published before 2026-09-03. So it can move as the archive fills: a backfilled day added inside the 30-day window changes what the average was. status is NO_BASELINE when there was not enough archive behind the day to compare against at all, which is a different claim from an empty found under OK — that one means the comparison ran and nothing stood out.

What we promise

Addresses
api/index.json, api/latest.json and api/issues/<date>.json stay where they are. A date that has been published keeps its file.
Fields
Fields are added, not removed or repurposed. If a field's meaning has to change, it gets a new name and the old one is left as it was — renaming in place is how a consumer ends up silently wrong.
Values
work_key never changes once assigned — with one exception, taken once, on 2026-09-04: seventeen IJURR articles had been keyed arxiv:2427.… because that journal's ISSN sits inside its DOI and the parser read it as an arXiv identifier. They now carry the doi: key they should always have had. The promise means "a key does not drift"; it was never a promise to keep a wrong one. Fields that come from OpenAlex keep their OpenAlex names.
Breaking it
schema_version is 1 and is on every document. A change that cannot be made by adding will raise it, and the previous version stays reachable for at least ninety days. There is no mailing list to announce it on, so the version field is the announcement — read it.
What is not promised
Uptime, and the contents of any particular day. The pipeline runs unattended and some days it publishes nothing; that is a state, not an outage.

Licence and provenance

Three different things are in these files and they are not under one licence. Saying so is not lawyerly caution — it is the difference between a source you can build on and one that will surprise you later.

Ours — CC BY 4.0
The selection (which papers on which day), the scores, the badges and topic assignments, the day's state, and the headline line. This is the work: the deciding, not the describing. Attribute it to Urban Currents, Institute for Latent Publics, with a link to the day you used.
Not ours — the sources' terms
Titles, identifiers, landing-page URLs, journal names and dates come from arXiv and OpenAlex and are passed through unchanged. OpenAlex places its data in the public domain (CC0); arXiv metadata is used under arXiv's own terms. We do not relicense either.
Uncertain — no open licence offered
summary.what and summary.why. A model wrote them from an abstract we do not own. Whether that makes them ours to license is a question we have not answered, and we will not stamp an open licence on something we have not established we can grant. Read them, quote them with attribution as you would any other page on the web; do not assume a redistribution right. If that is not enough for your use, the fields above it are, and they are the ones under CC BY.
Absent on purpose
Abstracts are not served: third-party expressive text, and an API is a redistribution. Authors, ORCIDs and affiliations are not served either — a per-day machine-readable list of people is a different artefact from a citation and not one we cleared. Every item carries a DOI or an arXiv identifier, so the authoritative record is one fetch away.

Thank you to arXiv for use of its open access interoperability. This service was not reviewed or approved by, nor does it necessarily express or reflect the policies or opinions of, arXiv.

Citing a day

A day is the citable unit — there is no issue number, and inventing one here would make this page the source of a fact that exists nowhere else.

Urban Currents (2026–).
Institute for Latent Publics.
Issue 2026-10-14. https://latentpublics.com/urban-currents/issues/2026-10-14.html
Accessed <date>.

If you are citing what we selected or scored, cite the day. If you are citing a paper we listed, cite the paper — its identifier is in the record, and it is not ours to stand in front of.