Ask NYC Open Data a question

The city publishes 2,408 datasets and no way to ask across them. This is the layer in between: every dataset indexed, every column typed and profiled, and a query engine that pushes the work back to the portal so nothing is copied and nothing goes stale.

datasets indexed
0
columns typed
0
quality-scored
0
published endpoints
0

Start with a real question

Each of these runs against the live portal. Nothing here is a screenshot — and each is the opening move of a walkthrough in the guide.

Is my neighbourhood getting noisier?

311 is one dataset of 2,396 and holds 21 million rows. Nothing is downloaded — Socrata counts them where they sit and sends back the totals.

Run it

Expect: 20 rows — the Limit box defaults to 20 and there are 194 complaint types, so raise it to see the tail. Illegal Parking leads with 315,101, then HEAT/HOT WATER at 202,506. A second or two warm; up to half a minute if you are the first to ask it today.

Do 311 calls and arrests concentrate in the same districts?

Which datasets can be compared depends entirely on what you are comparing them by, so the key comes first and the candidates are ranked against it. This one is a boundary Socrata itself matched both datasets against.

Run it

Expect: 71 rows — one per community district — in a second or two, under two notes saying this is an alignment and not a record match. All 71 come back even though the Limit box says 20, because each side was aggregated first. The date filter applies to 311 only; the arrests column is that district's whole file.

Or ask for it in a sentence

It searches the catalog, reads the schema, and runs the query through the same planner the composer uses — so it gets the same refusals rather than writing SoQL that is accepted and wrong. Watch the activity list: every figure it reports came from one of those calls.

Run it

Expect: A tool call per line, then an answer citing the dataset by name and id. Twenty to sixty seconds — it is doing real work.

Which datasets have anything about zip codes?

Searches 56,000 column descriptions — a question the catalog alone cannot answer.

Run it

Expect: JSON, 20 matches, straight from the column layer.

Or find a dataset

Five ways in

Build on it

Everything the site uses is a public, unauthenticated endpoint. A published endpoint is a saved question at a stable URL — versioned, so an author's edit cannot break a caller, and it carries the SoQL that produced its answer so any number can be re-derived.

# a published question, with its provenance
curl "https://data-citizen.vercel.app/e/nyc-311-by-borough?since=2026-06-01"
curl "https://data-citizen.vercel.app/e/nyc-311-by-borough/provenance"

# which datasets mention a term, across 56k column descriptions
curl "https://data-citizen.vercel.app/api/columns?q=zip&limit=5"

# what this dataset can be joined to, and how
curl "https://data-citizen.vercel.app/api/joins/candidates?dataset=erm2-nwe9&column=bbl"

# compose a query yourself
curl -X POST "https://data-citizen.vercel.app/api/query" \
  -H 'content-type: application/json' \
  -d '{"query":{"dataset":"erm2-nwe9","groupBy":["borough"],
       "aggregations":[{"op":"count","as":"total"}]}}'
How this works, and what it does not do

Nothing is copied — The portal already filters and aggregates server-side — a 21-million-row dataset scoped to one neighbourhood returns a few hundred bytes in about two seconds. So this layer stores facts about datasets, never their rows, and pushes every query back to Socrata. That is why the numbers are never stale.

Where the data comes from — NYC Open Data, live. This project is not affiliated with the City of New York, and every answer links back to the dataset it came from.

The rest — Why a comparison is not a join, what a quality grade is derived from, and what a published endpoint is for are all in the guide.