Methodology
Every number on this site can be re-derived.
Source
All data comes from the public Checkbook NYC XML API operated by the Office of the New York City Comptroller — the same system behind the official Late Contracts Dashboard. We pulled every registered expense contract for fiscal years 2011–2026 (119,872 standard contracts after filtering) plus the live pending queue, snapshotted 2026-07-10.
Universe
Following the official dashboard’s stated exclusions, we count standard expense contracts only (document code CT1, first registration): no master agreements, no modifications, no purchase orders, no City Council discretionary awards, and no emergency procurements (which are late by design). This reconciles with the official universe almost exactly — FY24: 6,348 contracts here vs. 6,349 on the official dashboard.
Definitions
Late— registered strictly after the contract’s start date, per the official glossary (“Retroactivity: the difference between a contract’s Registration Date and its Start Date”). Same-day registrations are reported as their own category rather than folded into either side: 59% of human-services contracts register on exactly their start date, which we believe reflects start dates being set to the registration date rather than genuine timeliness. Days late — registration date minus start date, in calendar days. Fiscal year— NYC’s July 1–June 30 year, assigned by registration date. Dollar-years— each late contract’s current committed value multiplied by its years of delay, summed. This is an index of financing burden (face value held in limbo, weighted by time), not a measure of cash actually owed during the delay.
Where we differ from the official dashboard
The official dashboard states a contract is late “if it is registered after the Contract’s start date,” yet reports a higher late share (FY24: 77%) than that definition yields from public data (45%, or 86% if same-day registrations count as late). Their figure sits between those two bounds — consistent with same-day registrations being largely counted as late, possibly informed by internal submission dates that are not published. We could not reproduce it exactly under any threshold. Rather than pick a number that can’t be verified, every figure here is computed from the public record — and the queries are published.
The pending queue
The API’s pending-contracts domain includes a received_date — when a contract reached the Comptroller — that exists nowhere in the registered data. Because the official dashboard only counts contracts after registration, currently-late contracts are invisible to it until they register (survivorship bias). Our backlog section counts pending standard contracts more than 30 dayspast their start date as of the snapshot — contracts still inside the Charter’s 30-day registration window (124contracts on snapshot day) are excluded, since they could yet register on the only legal clock in the process. Every contract in the resulting backlog reached the Comptroller after its start date. The received dates also corroborate the Comptroller’s statement that its own reviews run at nearly half the 30-day limit: the median contract in the queue arrived 11 days ago.
Caveats
Contract amounts are current committed amounts on the first registered version, not eventual spending. Lateness measures the registration process, not vendor payment timing (payment can lag further). Received dates exist only for the current pending snapshot, so submitted-to-registered lag can only be measured prospectively. This site is a design concept and is not affiliated with the Comptroller’s office.
Reproduce it
A single POST to the public API returns a page of registered contracts:
curl -X POST https://www.checkbooknyc.com/api \
-H 'Content-Type: application/xml' -d '
<request>
<type_of_data>Contracts</type_of_data>
<records_from>1</records_from><max_records>1000</max_records>
<search_criteria>
<criteria><name>status</name><type>value</type><value>registered</value></criteria>
<criteria><name>category</name><type>value</type><value>expense</value></criteria>
<criteria><name>fiscal_year</name><type>value</type><value>2026</value></criteria>
</search_criteria>
<response_columns>
<column>document_code</column>
<column>prime_contract_version</column>
<column>prime_contract_award_method</column>
<column>prime_contracting_agency</column>
<column>prime_vendor</column>
<column>prime_contract_current_amount</column>
<column>prime_contract_start_date</column>
<column>prime_contract_registration_date</column>
</response_columns>
</request>'Iterate records_from in steps of 1,000 per fiscal year, compute registration_date − start_date, and every chart on this site falls out.