Busabase
Busabase 是一款開源 (MIT) 資料庫與 AI agent 工作空間——將數據、文件、技能與應用程式整合於一處。您可以選擇本地運行、在網路內部進行自我託管,或使用 Busabase Cloud。
AI 翻譯
Checked NYC Council budget data: the Council's spreadsheets and NYC Open Data, plus Schedule C, transparency resolutions, the capital book and Terms & Conditions read from the budget PDFs, FY2018–FY2027. Explorer and MCP server. By BetaNYC.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗Checked, open data on New York City's budget, from BetaNYC. It has two halves, and they answer different questions:
| City agency budgets | Council discretionary funding | |
|---|---|---|
| What it shows | How much each City agency was given in the adopted budget, and how that changed during the year | Which organizations the City Council funds, for how much, through which agency, and at which Council member's request |
| Answers questions like | "How much does my community board get?" "How did NYPD's budget change since 2017?" | "Which groups did my Council member fund?" "Did this nonprofit get Council money?" |
| Source | NYC Open Data, Expense Budget (mwzb-yiwb), published by the Mayor's Office of Management and Budget (OMB) | The Council's spreadsheets, its budget PDFs (Schedule C and others) and NYC Open Data |
| Years | FY2017–FY2027 | FY2009, FY2011–FY2027 (by dataset; see below) |
| Size | The whole expense budget: $117.8 billion adopted for FY2026, as counted in Open Data | The Council's own share: discretionary awards and capital designations |
| Look at it | The agency budget explorer (moved here from nyc-budget-viz in #265) | The Council budget explorer |
Not sure which half you need? See Which tool answers my question? It also has a glossary: fiscal year, adopted vs. modified, unit of appropriation, intra-city, discretionary funding.
@betanyc/nyc-budget-mcp server (Council funding today; agency budgets planned, #270).data/, the data releases, and the agency explorer's one-file CSV.Last revised: 2026-11-09.
Correction, 2026-11-09. Before this date the agency budget explorer labeled every year one year late: "Adopted 2026" was really the FY2025 adopted budget. A community board staffer's spreadsheet showed it. It was fixed the same day (nyc-budget-viz#4). If you copied agency figures before 2026-11-09, move each one a year earlier, or download them again. The rule now used is below. The Council half was not affected.
City budgets are among the most important public documents there are, and among the hardest to use. This project turns NYC's budget data into files you can search, join and check, so journalists, researchers, community boards and New Yorkers can ask questions of their city's spending. Every row says where it came from, and no number is changed by hand.
It is one home for two kinds of budget data that people often mix up:
Neither half is a source for revenue, actual spending, or spending over decades. For those, see other sources.
One site, two halves. The agency budget explorer used to be a separate site
(nyc-budget-viz). It now lives in this repo at
viz/agencies/, published at /agencies/ beside the Council explorer
at /explorer/ (#265). The old address still works until it is forwarded (#271). The front
page has a door to each half, and every page shares one top bar and footer (#267). The rest of
the plan is epic #272.
New York City's fiscal year runs July 1 to June 30 and is named for the year it ends: FY2026 is July 1, 2025 to June 30, 2026. Both halves use this, and every year in this repo is a fiscal year unless it says otherwise. The budget for a year is adopted in June, just before it starts. More words: the glossary.
What it is. The City's expense budget for every agency, broken down by unit of appropriation (the lines the budget is adopted by; often split into Personal Services, which is pay, and Other Than Personal Services, which is everything else). For each fiscal year, FY2017–FY2027, there are two figures:
Source. NYC Open Data, Expense Budget, mwzb-yiwb,
published for OMB. Public, read through the Socrata API with no token. The pipeline keeps 764
units of appropriation.
Totals are gross. Open Data rows include intra-city amounts (money one City agency pays another), which OMB subtracts to get its headline "net total budget". So for FY2026 the adopted budget is $115.9 billion net (OMB's figure) and $117,791,473,676 as counted in Open Data, which includes $1,884,163,949 of intra-city money.
Each fiscal year is published up to three times, Preliminary (January), Executive (April or May) and Adopted (June), and each release restates the whole budget. Adding them up would count the same money up to three times, so only the June release of each year is used.
A release's fiscal_year tag names the budget being adopted in it, not the year of every amount
in the row. OMB's printed FY2026 Adopted Budget, which is the same publication as the June 2025
release tagged 2026, heads its columns "Adopted Budget for FY 2025", "Current Modified Budget for
FY 2025" and "Adopted Budget for FY 2026". So, in the release tagged fiscal_year = Y:
| Field | Describes |
|---|---|
adopted_budget_amount | FY Y−1, adopted |
current_modified_budget_amount | FY Y−1, as modified to the release date |
financial_plan_amount | FY Y (in the June release, the adopted budget) |
The rule the explorer uses:
financial_plan_amount from the June release tagged Y. (It equals
adopted_budget_amount in the release tagged Y+1, to the dollar.)current_modified_budget_amount from the June release tagged Y+1.Getting this wrong labels every year one year late. That is the mistake corrected on 2026-11-09 (above).
The agency pipeline (code/agency_budget_cleanup.py) stops and
writes nothing unless its output reproduces OMB's printed FY2026 Adopted Budget, to the dollar:
the citywide FY2026 and FY2025 adopted totals, the FY2025 modified total, and Manhattan
Community Board 1's lines (page 182E). It also stops if the two routes to "Adopted Y" above ever
disagree. 31 tests (code/test_agency_budget_cleanup.py)
cover the year rule, the June-release rule, the check itself, and OMB's figures in the committed
CSV; CI runs them with the other Python checks and before each deploy. Details:
viz/agencies/data/SCHEMA.md.
This is not the row-by-row review the Council PDF tables get (below). The agency numbers are the City's Open Data, as published, checked against OMB's printed totals. A test that checks every community board and year after the move is planned in #268.
This half is about who got what, at the level of the organization and its EIN. The Council publishes who gets its discretionary and capital money as spreadsheets and as long PDF tables. This half has three sources, and each row says which one it came from.
| Dataset | Years | Rows | Where |
|---|---|---|---|
| Expense funding disclosure: each discretionary award, with grantee, EIN, amount, clearance status and mailing address | FY2009, FY2011–FY2027 | 156,544 | data/fyNN/expense_disclosure/, data/disclosure_years.csv |
Capital designations: the Council's capital lists, from its workbooks (FY2015–FY2017, FY2026, FY2027) and, for FY2019–FY2025, from NYC Open Data t474-a92g, which the Council publishes | FY2015–FY2017, FY2019–FY2027 | 16,916 | data/capital/ |
FY2013–FY2027 disclosure files come from the Council's Research & Data site; FY2009, FY2011 and FY2012 from the Council's own workbooks, saved by the Internet Archive. A script reads each workbook cell by cell and keeps every value as published. Each file's sha256 is recorded.
Know these before you use them:
council_member is the roster when the file was exported.Details: DATA-DICTIONARY.md,
source/expense-funding-disclosure/README.md,
data/DISCLOSURE-AUDIT.md, data/capital/README.md.
Some things are printed only in the adopted budget's PDFs. We read them again, carefully, with a checked process (next section):
| Family | What it is | Years |
|---|---|---|
| Schedule C | The discretionary awards as adopted, with the initiative and category | FY2018–FY2027 |
| Transparency resolutions | Changes made after adoption: new awards, rescissions, changes of purpose | FY2018–FY2026 |
| Capital book (§254 supporting detail: the detail behind the capital changes the Council adopts under Section 254 of the City Charter) | The Council's capital additions, project by project | FY2018–FY2020, FY2022–FY2027 |
| Terms and Conditions | The reports the budget requires agencies to make | FY2018, FY2021–FY2027 |
That is 36 family-years (one family in one fiscal year), in data/fyNN/pdf/. The gaps in that
table are years with no PDF of that kind in source/FYNN/ (see what is not done yet). Each one's status is
in data/pdf_years.csv. Values are kept as printed, never corrected. The
PDFs themselves are in source/.
t474-a92g),
which the Council publishes: the capital lists for FY2019–FY2025.46m8-77gv) and
Capital Commitment Plan (2cmn-uidm): to compare
the Council's capital money with OMB's, by budget line (1,425 comparisons over 515 budget lines,
FY2019–FY2027).4d7f-74pe),
which stopped updating in April 2021: a cross-check. It adds NYC Open Data's MOCS ID (the Mayor's Office of Contract Services' ID for an award) to matching
disclosure rows (FY2009–FY2021).The Council explorer also says, for each award and capital row, whether it is on NYC Open Data, and the date of the copy it checked.
These claims are about the Council's PDF tables only. PDF-RECIPE.md is the
step-by-step. In short:
Each family-year then has one of two statuses, and every row shows it:
reviewed: "checked, review in progress." The table is checked and public. A person may
still be deciding some flagged rows.closed: "checked and reviewed." A person has decided every flagged row: critical items
one by one, warnings by type, and every "needs more information" item answered, or 30 days past
the date its question went to Council Finance. The questions, with their issues and dates, are in
data/council_questions.csv (explained in
data/COUNCIL-QUESTIONS.md).As of 2026-10-24 all 36 family-years are reviewed, and none is closed yet.
Where the checks stand (the pdf-tables-2026-10-24-260d16e release): 141,456 rows in 36
family-years, FY2018–FY2027. In Schedule C, 76,216 of 76,272 rows read the same from the text
and from the page image; the other 56 are flagged for a person. 515 of 519 printed totals tie
exactly; the other 4 are totals the PDF gets wrong itself (one each in Schedule C FY2018, FY2024,
FY2025 and FY2026), flagged and not fixed. 1,704 review items wait for a person's decision (195
critical, 1,509 warnings); 14 are decided. In short: every row is checked, the review of each
row is not finished, and we never change a number.
Rows show their review notes in plain words, and the status of any question to Council Finance. Text in the PDF that can't be seen on the printed page is shown apart, labeled "hidden text".
The checks run in CI (continuous integration: GitHub runs them automatically). On every pull
request and every push to main that touches the readers, configs, PDFs or tables, and when a
maintainer starts it by hand, python-checks.yml runs
python -m pytest code and re-reads every promoted PDF (promoted: its checked tables are
committed to data/fyNN/pdf/) to prove the committed tables match (about an hour, on macOS).
ci.yml builds and tests the MCP and the explorer, and checks that the
two agree. How to run each check yourself: PDF-RECIPE.md, Steps 2, 5 and 6.
Data releases. The checked tables (and the PDFs they cite) are published as GitHub Releases
tagged pdf-tables-<date>-<commit>, each with a manifest of sha256s
(all releases). The downloader always
takes the newest. As of 2026-10-24 that is
pdf-tables-2026-10-24-260d16e:
the 36 family-years, FY2018–FY2027 (17.4 MB of tables), and 126 PDFs (148 MB). The first was
pdf-tables-2026-10-23-5bab77c. The workflow
(.github/workflows/pdf-tables-release.yml) can
publish on every merge, but that is off for now, so a maintainer runs each release by hand. The
explorer redeploys on every merge that changes the data.
viz/explorer/.viz/agencies/.code/build_community_boards.py).legacy.html, so old links still
work ().@betanyc/nyc-budget-mcp is a
Model Context Protocol server. It lets an AI assistant (Claude
Desktop, Claude Code and others) search the Council data and cite each row. It does not answer
agency budget questions yet (#270).
Add it to your client's config:
"mcpServers": {
"nyc-budget": {
"command": "npx",
"args": ["-y", "@betanyc/nyc-budget-mcp@2"]
}
}
It has eight tools:
| Tool | Answers from |
|---|---|
search_disclosure_awards | The Council's expense funding disclosure |
search_council_capital | The Council's capital lists |
compare_capital_to_omb | The Council's capital vs. OMB's adopted capital budget, by budget line |
list_available_fiscal_years | What each year holds, where it came from, and each PDF family-year's status |
search_schedule_c_awards | Schedule C, from the checked PDF tables |
search_transparency_changes | The transparency resolutions, from the checked PDF tables |
search_capital_book | The capital book, from the checked PDF tables |
search_terms_conditions | Terms and Conditions, from the checked PDF tables |
The npm package holds the server's code and its spreadsheet index (dist and data/budget.db).
The checked PDF tables are an optional download (about 17 MB) from this repo's data
releases: npx @betanyc/nyc-budget-mcp download --pdf-tables (add --pdfs for the PDFs, 148 MB
more), or set "env": { "NYC_BUDGET_PDF_DATA": "on" } and the server downloads them when it
starts, if none are installed (run download again to get a newer release). Until then, the four PDF tools say how to add them. Every file is
checked against its published sha256.
How text searches match. Name and text filters (organization, member, purpose, title and so on)
ignore case and accents. A term of 3 or fewer letters and digits matches whole words only, so AI
finds "AI Training Program" but not "Jamaica" or "AIDS". Longer terms match anywhere, so Fellow
also finds "Fellowship". Each tool takes whole_word: true or false to choose either way, and
the answer says when it matched whole words. Exact filters (EIN, budget line) are unchanged.
The capital book's project_id and the transparency resolution_number always match anywhere,
so fragments like CC1 work.
A name search finds only the rows whose text matches, so report it as "at least". The full rules:
mcp/README.md.
Full details: mcp/README.md; changes: mcp/CHANGELOG.md.
data/, described in
DATA-DICTIONARY.md; the checked PDF tables in the
data releases.viz/agencies/data/nyc_budget.csv, described in
SCHEMA.md. Or go
to the source, mwzb-yiwb, and use the
year rule.Bringing the two halves together is epic #272: names and this README (#264), moving the agency explorer in (#265), removing what it inherited from Cook County (#266), one site shell (#267), a standing accuracy test for the agency numbers (#268), a community board view (#269), then agency budgets in the Council explorer and the MCP (#270) and forwarding the old address (#271).
For the Council data, open work is tracked in two epics: #101 (read every PDF, one year at a time) and #190 (serve the checked tables). The bugs the FY2018–FY2027 reviews found (epic #244) were fixed on 2026-10-24 (#252, #253, #254, #255).
closed yet. All 36 family-years are reviewed.source/; two are known
with no download route (#246).
There is no FY2021 capital supporting detail in source/ (OMB's copy is in source/gpp/, not
yet reviewed) and no FY2019 or FY2020 Terms and Conditions.DATA-ANOMALIES.md first: many oddities are in the
source and already listed there.npm run data -- --include-reviewed in viz/explorer/; see PDF-RECIPE.md,
Step 7) and decide flagged rows. Export your decisions and send them as a pull request.main. CI builds and tests the MCP and the
explorer, and a macOS job runs the Python checks (about an hour; run python -m pytest code
yourself first). A change to what the npm package ships needs a version bump and a changelog
entry.Questions: [email protected].
New-York-City-Budget/
├── README.md, WHICH-TOOL.md, PDF-RECIPE.md, DATA-ANOMALIES.md, DATA-DICTIONARY.md
├── source/ the Council's and City's documents (PDFs, workbooks, Open Data pulls), © City of New York
├── data/
│ ├── fyNN/expense_disclosure/ the Council's disclosure, per year
│ ├── fyNN/pdf/ the checked PDF tables, per year and family
│ ├── capital/ the Council's capital lists, and the comparison with OMB
│ ├── pdf_years.csv each PDF family-year's status
│ ├── council_questions.csv questions to Council Finance, with dates
│ └── retired/ the old PDF parser's output, kept for history, never served
├── config/ one file per PDF family and year
├── code/ the readers, checks and tests (Python), including the agency pipeline
├── mcp/ the MCP server (TypeScript)
├── viz/ the GitHub Pages site: front page, Council explorer (explorer/), agency
│ explorer (agencies/), frozen legacy.html
└── research/ plans, review records and research notes
nyc-budget-viz), from DataMade's Look at Cook
and NYC Open Data mwzb-yiwb.legacy.html, with a
banner saying not to cite it.More: mcp/CHANGELOG.md, data/retired/README.md,
code/PARSING.md (how each old file was made), and
this README as it was before 2.0.2,
which describes the old files in detail.
| Source | Best for | Overlap with this repo |
|---|---|---|
| This repo, agency half | Each agency's adopted and modified budget by unit of appropriation, FY2017–FY2027 | Built from NYC Open Data mwzb-yiwb, one June release per year |
| This repo, Council half | Council awards and capital designations, at the organization and EIN level | — |
| NYC Independent Budget Office, Data Center | Citywide and agency spending and revenue over decades, debt, headcount | None at the award level. IBO is the context this data sits in |
| NYC OMB budget publications | The printed budget the agency figures are checked against | The agency half's check uses OMB's FY2026 Adopted Budget |
| NYC Open Data: City Council Discretionary Funding | Council awards, FY2009–FY2021 | Overlaps the disclosure for FY2009 and FY2011–FY2021; stopped updating in April 2021. Compared row by row in research/2026-10-14-open-data-vs-disclosure-diff.md |
| NYC Checkbook (Comptroller) | Actual spending and registered contracts | Join on EIN to ask whether an award became a contract; compare an agency's budget with what it spent |
| NYC Council budget pages | The documents the Council half reads | This repo is the structured, checked version |
A source-by-source crosswalk:
research/2026-07-08-ibo-data-center-crosswalk.md.
BetaNYC uses AI tools openly and with people accountable for the result. The code here was built by AI agents (Anthropic's Claude) working under the direction and review of BetaNYC staff.
The figures are not AI-generated. Agency figures are read from NYC Open Data's API and summed by a script. Council spreadsheet values are read cell by cell. PDF values are read from the PDF's own text and ruled lines, and checked against an image of the page by ordinary image processing, not a language model. Where a person confirmed that the page shows something the text layer doesn't, the row says so. Every row keeps its source.
One exception, not served: the FY2009 transparency resolutions are scans with no text, so they
were read by OCR (a model). They stay in the repo as a research dataset
(data/fy09/transparency-resolutions/, DATA-ANOMALIES §28).
Everything BetaNYC made here is under the MIT License © 2026 BetaNYC: the code
(code/, mcp/, viz/), the derived data (data/) and our documentation and research. If you
use the data, please credit BetaNYC, link to this repository and cite the City of New York as the
source.
Not covered: the Council and City documents in source/ are public records, © The City of
New York, reproduced here for transparency. BetaNYC's license does not apply to them.
Third-party libraries in viz/ keep their own licenses (see viz/LICENSE.md).
Both the frozen legacy explorer and the agency explorer are built on DataMade's
Look at Cook, © 2019 DataMade, Derek Eder, Nick
Rougeux and Open City, MIT License; that copyright notice is kept with the code.
NYC Open Data is under the NYC Open Data Terms of Use.
A member of the NYC Council's Finance Division staff supplied the FY2025 Council-version §254 supporting detail book and pointed us to the expense disclosure spreadsheets. Both made much of this data possible.
A community board staffer's spreadsheet of all 59 boards' budgets found the agency explorer's year error on 2026-11-09.
DataMade (Derek Eder, Nick Rougeux) and Open City built Look at Cook, the front end the agency explorer and the legacy explorer are adapted from.
BetaNYC is New York's civic organization for public interest technology, open data and civic design. We build tools, train the public, and advocate for a more transparent, accountable and participatory city government.
Support open civic data: beta.nyc · donate · newsletter
viz/README.md