All fiscal data in this tracker comes from NYC Legistar, the New York City Council's official legislative management system at legistar.council.nyc.gov. Legistar is the public record of all legislation introduced in the Council, including attached documents.
For any bill that moves toward a vote, the Council's Finance Division prepares a Fiscal Impact Statement, a standardized document estimating the bill's effect on city revenues, operational expenditures, and capital costs. These statements are attached to each bill's Legistar record as Word or PDF files and are publicly accessible.
This tracker reads those documents directly. Every figure comes from the text of the Finance Division's own analysis.
The tracker covers Introductions (proposed local laws) and Resolutions that have a fiscal impact statement attachment on Legistar, where the Finance Division estimated a non-zero fiscal impact. Coverage spans statements prepared from 2014 to the present.
Included legislation types
- Introductions (Int.), proposed local laws. These become binding law if passed by the Council and signed by the Mayor.
- Resolutions (Res.), formal Council positions, requests, or ceremonial acts. Resolutions don't create law, but some carry real fiscal implications (e.g. approving a contract).
- Pre-Considered Resolutions, resolutions introduced and voted on in the same session, bypassing the normal committee referral.
Not included
- Bills with zero fiscal impact. Many bills are analyzed and found to have no net cost, these are excluded. Only bills where at least one of total expenditure, capital, revenue, or net impact is non-zero are tracked.
- Bills where costs can't be estimated. When the Finance Division determines that costs cannot be reasonably quantified (e.g. "depends on how many complaints are filed"), the statement says so and these bills are excluded.
- Proposed bills. Bills labeled "Proposed Int." or "Proposed Res." on Legistar are draft versions that have not yet been formally introduced, and they are left out. The exception is a bill Legistar shows was enacted as a local law, which is kept under its "Proposed" label.
- Budget modification resolutions (MN-#). These are administrative approvals of mayoral budget modifications under City Charter §107(e). They pass as a matter of course and do not represent independent legislative fiscal decisions.
Legistar doesn't provide a bulk download of fiscal impact statements. The tracker identifies relevant bills by searching Legistar's legislation index for attachments containing the phrase "Fiscal Impact Statement", the standard title the Finance Division uses for these documents.
Two sources, checked monthly
The tracker searches Legistar's web interface using the attachment text search, retrieving every bill that has a matching attachment. That index is shallow: it returns roughly 300 matters in total, almost all from the current Council session, so the monthly job also walks the full list of enacted local laws maintained by the Obligations Tracker and checks each one for a fiscal impact statement. Bills already checked and found to have no quantified impact are recorded in a skip list so they are not downloaded again.
Every local law enacted from 2014 onward is checked. About one enacted law in five (400 of 2,158) carries a non-zero fiscal impact statement; the rest are costed at $0 by the Finance Division and are not in the table.
Historical bills (2014–2023)
Records for older bills come from the Legistar REST API (webapi.legistar.com/v1/nyc), which enumerates every NYC Council matter and its attachment URLs. The API uses its own record numbers, distinct from the ones in Legistar's web links, so those records are matched to their web pages through the enacted-law list; 17 state bills and pre-considered introductions from 2014 to 2019 cannot be matched and are shown without a Legistar link.
Bill status: five buckets
Each bill's status comes from its Legistar page and is re-read on every monthly refresh. Every bill lands in one of five buckets:
- Enacted or adopted: an enacted local law, or an adopted or approved resolution.
- Passed, awaiting mayor: the Council passed the bill and it sits on the mayor's desk for signature.
- In progress: any bill still moving through the Council.
- Lapsed or failed: filed at the end of a session, withdrawn, vetoed or disapproved by the mayor, failed or defeated.
- Status unknown: an older record with no matched Legistar page.
Charts and the overview total enacted laws and adopted resolutions by default; the Bill status filter widens them to pending or lapsed bills. The Bill Table and the agency and council-member profiles list every bill with a statement, tagged by status.
The table currently holds no lapsed bill from sessions before 2026, because Legistar's statement index only reaches the current session. Earlier lapsed bills enter the table only through a separate sweep of Legistar's API, run on request.
Opening a row in the Bill Table shows the status, and the panel quotes the statement's Summary of Legislation verbatim above the revenue and expenditure paragraphs.
Bill numbers
The bill number shown in the table is Legistar's own file number (for example Int 1002-2026), read from the bill's Legistar page. The number printed inside the fiscal impact statement itself is kept in the data but not displayed, because the Finance Division writes it inconsistently and it is often blank when the statement was drafted before the bill was numbered.
Data checks
A validation script runs against the data on every refresh and in a monthly quality report. It checks internal consistency (net impact equals revenue minus expenditure minus capital, no duplicate records, every Legistar link carrying the bill's own ID) and compares the table against the enacted-law list so a coverage gap shows up as a count.
Finding the right attachment
A single bill may have many attachments, committee reports, hearing transcripts, legal memos, and more. The tracker picks the attachment Legistar labels as the Council's fiscal impact statement. An amended bill carries one statement per version, so the tracker takes the newest, which is the statement for the version that passed. OMB's separate statement is not read.
Once a fiscal impact statement is identified, the tracker downloads the file and extracts its full text, including all table cells. Statements come as Word files (.docx), older Word files (.doc) and PDFs; all three are read. That text is passed to a large language model, Claude Sonnet (Anthropic), with a structured prompt that instructs it to return a JSON object containing all key fields: fiscal totals by year, agency breakdown, narratives, sponsor names, and administrative metadata.
Why AI extraction?
Fiscal impact statements don't follow a perfectly uniform format. While newer documents (post-2020) use a consistent three-column table, older bills used varied column structures, different terminology, or described costs entirely in prose paragraphs. A rule-based parser would break on edge cases. Claude reads the document's actual content and synthesizes the values regardless of layout.
Handling prose-only documents
Pre-2019 fiscal impact statements often have no structured table at all, costs are stated in sentences like "this legislation is estimated to increase expenditures by $1.6 million annually." For these documents, the model takes the totals from the narrative text.
Ranges and scenarios
When a statement gives an "at least" figure ("at least an additional $750,000"), the tracker records that figure. When it gives a range or several scenarios without one, the tracker records the midpoint: "$6.3 million to $11.6 million" is recorded as $8.95 million. The same rule applies to table cells and to figures stated in prose.
Pre-check before extraction
Before calling the AI, the tracker scans the raw document text for any non-zero dollar amounts. If every dollar figure in the document is literally $0 and there's no "See below" language indicating a cost described elsewhere, the document is skipped without an AI call. This avoids spending resources on bills that clearly have no fiscal impact.
Sponsor name normalization
Fiscal impact statements list sponsors inconsistently, sometimes as "Council Member Smith," sometimes as "By Council Members Smith and Jones," sometimes with "(s):" prefixes. The extraction prompt instructs the model to strip all prefixes and return last names only. "The Speaker (Council Member X)" is returned as "X (Speaker)".
Total expenditure, capital, and revenue
Most fiscal impact statements present costs across fiscal years in side-by-side columns, typically "Effective FY," "FY Succeeding Effective," and "Full Fiscal Impact FY." Each bill gets one figure per category, the annual cost once the law is fully in effect, chosen in this order:
- The Full Fiscal Impact column. The statement's own figure for a year of full implementation. When a statement has no column labelled full impact, the last fiscal-year column is used.
- The recurring yearly cost, when the statement separates one-time start-up costs from the ongoing cost and the full-impact figure includes both. A start-up cost is paid once, so the tracker records the cost that repeats each year.
- The sum of the columns, when the full-impact figure is zero: a one-time cost paid in the first year would otherwise disappear.
- The figure stated in prose, when the table has nothing for that category: a cell reading "See below", or a capital cost described only in the narrative while the table shows $0.
- Pilots and other time-limited programs have no steady year. When the statement prices every year the program runs, the figure is that whole run: the sum of its years, counting a year that appears twice (once as "FY Succeeding" and again as "Full Fiscal Impact") only once. When the program runs past the years the statement prices, the figure is the annual cost at full implementation, as for every other bill, and the bill's detail panel gives the end year and quotes the statement's sunset sentence. The unpriced years are never estimated. A bill counts as time-limited only when the statement quotes an end date for the program that carries the cost; a sunset on one reporting clause does not qualify.
- Multi-year plans carry their own total. When a statement prices a multi-year plan and its full-impact column is only the first year of a ramp-up, the tracker stores the statement's total for the whole plan and says so on the bill.
The overview's annual figures count operating costs and revenue only; capital, a one-time outlay, and bills priced over a whole program or plan are listed separately below them.
When one statement prices several bills together as a package, its cost is recorded once, on one bill of the package, and the other bills point to it, so the package is never counted twice.
Expenditure and capital are always recorded as positive numbers, and capital is null when a bill has none. Each record's totals_basis field names which rule produced its figures.
Costs already in the city's budget
Some statements say a cost "has already been reflected" in the City's Financial Plan, or that the agency's existing resources cover it: the money was budgeted before the bill passed. The bill does not add that cost, so the tracker leaves it out of the totals. Revenue the Adopted Budget already assumes is left out the same way. Amounts a statement describes as beyond the Financial Plan still count. A bill whose only costs were already budgeted is excluded (see below).
Net fiscal impact
The net fiscal impact represents the overall cost or benefit to the city's budget:
A negative net fiscal impact means the bill is a net cost to the city (expenses exceed revenues). A positive net fiscal impact means the bill generates more revenue than it costs, unusual but possible (e.g. a bill that imposes a new fee).
This matches the sign convention used in the Finance Division's own documents, where net figures appear as negative numbers in parentheses when they represent a cost.
Revenue reductions (pre-2019 documents)
Older narrative-format documents sometimes describe a fiscal impact as a reduction in revenue rather than an increase in expenditure, e.g. "this legislation would reduce revenues by $204,000." A revenue reduction is a real cost to the city. When the document frames it this way, the tracker records it as an expenditure so the net figure is negative (a cost), rather than as a positive revenue figure that would make the bill appear to be a money-maker.
Balanced-budget bills
Some bills are designed to be cost-neutral: new expenditures are fully offset by new revenues, so the net impact is $0. These are included in the tracker because the total expenditure and revenue figures are both non-zero and represent real resource flows, even if they cancel out.
After extraction, each record passes through a series of filters before it appears in the tracker. Records are excluded if any of the following conditions are true:
- EXCLUDED All fiscal values are zero. If total expenditure, total capital, total revenue, and net fiscal impact are all zero or null, the bill has no real fiscal impact and is not tracked.
- EXCLUDED Every cost was already in the budget. When the statement says all of a bill's costs are already reflected in the City's Financial Plan, the bill adds no new cost and is not tracked.
-
EXCLUDED
Costs cannot be estimated. The Finance Division sometimes states that a bill's costs "cannot be estimated" because they depend on future administrative decisions, litigation outcomes, or behavioral responses. These bills are labeled
cost_estimable: falseand excluded. A bill whose cost genuinely can't be quantified would misrepresent certainty if given a dollar figure. - EXCLUDED Proposed (not yet introduced) bills. Bills labeled "Proposed Int." or "Proposed Res." on Legistar are draft versions circulating before formal introduction. They may never be introduced, and the bill number may change, so they are left out unless Legistar shows the bill was enacted.
- EXCLUDED Budget modification resolutions (MN-#). These resolutions, labeled with a title like "MN-6", are routine Council approvals of mayoral budget modifications under City Charter §107(e). They are not independent legislative decisions. Including them would inflate the tracker with administrative paperwork rather than substantive Council action.
- INCLUDED Balanced-budget bills (net = $0). Bills where revenues exactly offset expenditures are kept because the gross figures (total spending, total revenues) still reflect real fiscal activity.
Each fiscal impact statement includes a program-by-program cost breakdown listing which city agencies bear which costs. The tracker reads these breakdowns and applies two cleanup rules.
Only agencies with actual cost line items
Fiscal impact statements often mention agencies in narrative text for reasons other than fiscal responsibility, the Office of Management and Budget may be cited as a reviewer, the Independent Budget Office as a reference source, and the City Council itself as the bill's introducer. None of these agencies are incurring costs.
The tracker assigns agencies only to bills where that agency appears in at least one line item in the cost breakdown table. Agencies mentioned only in narrative text are excluded from the agency list for that bill.
Street signs → DOT
Many bills require the installation or fabrication of new street signs, co-namings, street redesignations, or new regulatory signs. These costs are sometimes attributed in the document to whichever agency sponsored the request (parks, police, sanitation), but the actual work of fabricating and installing street signs in New York City is performed exclusively by the Department of Transportation (DOT).
The tracker reassigns any program breakdown line item involving street sign installation, fabrication, or co-naming to DOT, regardless of how the source document attributes it.
The Finance Division's fiscal impact statement template has changed over time. The tracker handles all three formats it has encountered:
New template (~2020–present)
Three standard columns: "Effective FY," "FY Succeeding Effective," and "Full Fiscal Impact." Rows for revenues, expenditures, and net. Includes a separate OMB estimate section and a hearing date field. This is the most consistent format and extracts cleanly.
Old template (~2015–2019)
Column structure varies by bill, custom labels based on the legislation's scope and effective date. May include a capital row. No OMB section. The tracker extracts whatever columns are present and sums them into totals.
Narrative format (pre-2019, common)
No structured table at all. Fiscal impact is described entirely in prose: "This legislation is estimated to increase expenditures by $1.6 million annually." The tracker takes totals from these narrative figures, using the range rule above. A single-column fiscal table labeled "Total" is created from the narrative figures for display purposes.
The totals likely understate what Council laws cost
Every figure here comes from the fiscal impact statement the Council's Finance Division writes before a vote, and those statements leave real costs out. Many say an agency will absorb the new work "within existing resources," which moves the cost onto staff and programs the City already pays for instead of pricing it (I wrote about this pattern for Searchlight). Statements rarely count the staff hours a new report, inspection or program takes, and they price only the agencies they name. Bills whose statements show no cost, or a cost the Finance Division could not estimate, are left out of the totals entirely. Treat every total in this tracker as a lower bound on what the Council's laws cost the City.
These are estimates, not actual expenditures
Every figure in this tracker is a pre-passage estimate prepared by the City Council's Finance Division. They represent what the bill is expected to cost if enacted and implemented as written. Actual costs after a bill becomes law may differ significantly, appropriations may be lower, implementation may be phased, or agencies may absorb costs within existing budgets.
One figure per bill hides the ramp-up
The "total expenditure," "total capital," and "net fiscal impact" columns show one year of full implementation (or, for a pilot the statement prices in full, its whole run), so a bill that phases in over three years shows only its final-year cost. Two bills with the same figure can spend very different amounts in their first years; the bill detail panel shows each year.
AI extraction may contain errors
Numbers are extracted from document text by a large language model. While the model performs well on structured tables, it can occasionally misread a figure, misattribute a cost to the wrong category, or misparse a complex multi-agency breakdown. If you spot a discrepancy, compare against the original document linked in each bill's detail panel (via the Legistar link).
Samples are checked blind against the original statements after every major change. In the latest round (October 6, 2026), the recorded figures, agencies, flags and fiscal years matched the statements on 38 of 40 checks. Bills an audit verifies or corrects are pinned to the audited figures, so a later extraction run cannot drift from them; a newer statement for the same bill is read fresh.
Older bills use narrative format
For pre-2019 legislation, fiscal impacts were often written as prose rather than structured tables. Synthesizing totals from narrative text introduces more uncertainty than reading from a table. Treat older figures as rough approximations.
Coverage depends on Legistar attachments
The tracker only includes bills with a fiscal impact statement attached to their Legistar record. It reads statements filed as Word (.docx and .doc) and PDF files.
Source data
All original fiscal impact statement documents are publicly available on NYC Legistar. Each bill in the tracker includes a direct link to its Legistar record where the source document can be downloaded.