What San Antonio’s Bond Ledger Records
San Antonio voters approve bond programmes, and the City publishes a project by project ledger of what that money is doing. It is the only machine readable record of City money there is: the open data catalogue carries 166 datasets and not one of them covers the budget, contracts, vendors or payroll.
This page reads that ledger the way the rest of these tools read a public record. It publishes what the City reports, the share of projects each money column is actually filled in on, and the questions the record cannot answer at all. Nothing here is estimated.
Two numbers on this page are easy to misread, so they are settled before anything else.
The field called "Total Budget" is a recorded zero on 274 of the 370 projects. Divide the City’s recorded spending by it and you get 602.5% of budget, which is arithmetic over a column of zeroes rather than a finding. Every dollar figure below uses the Bond Budget and Bond Expenditures pair instead, and each one is printed beside the share of projects that actually carries it.
And no project in this record carries a real date. 356 of the construction end dates are a season, such as "Summer 2029", and the rest are blank. Nothing here can measure whether a project is late. Whether a project is on schedule is the City’s own assessment of itself, and this page reports it as exactly that.
What voters approved, and what has been spent
The citywide rate is 52.2%, and on its own it describes neither programme. Read separately, the 2017 bond is at 86.0% and the 2022 bond is at 28.5%. They were approved five years apart and are at different stages of delivery, so the blended figure is an average of two unrelated things.
| Bond programme | Projects | Approved | Spent | Share spent | Complete | Off schedule |
|---|---|---|---|---|---|---|
| 2017 bond | 182 | $844.0M | $726.0M | 86.0% | 171 | 7 |
| 2022 bond | 188 | $1.21B | $343.5M | 28.5% | 72 | 33 |
Which money fields are actually filled in
Four money columns exist. Two of them are usable and two are not, and nothing in the record marks which is which. This is the table that decides every figure above.
| Column, as the City names it | Carries a figure | Recorded as zero | Blank | Coverage |
|---|---|---|---|---|
| Bond Budget | 367 | 3 | 0 | 99.2% |
| Bond Expenditures | 365 | 5 | 0 | 98.6% |
| Total Budget | 96 | 274 | 0 | 25.9% |
| Total Expenditures | 366 | 4 | 0 | 98.9% |
Not one value in this table is blank, and that matters. A blank column would say nobody recorded a figure. A zero says the City wrote zero, and the record does not say whether that means the project has no separate total budget or that nobody entered one. Those are different facts and this page cannot tell them apart, so it says "recorded as zero" throughout and never "missing".
A rate is only ever computed inside one pair. Four divisions are refused here: recorded spending by Total Budget, bond spending by Total Budget, recorded spending by Bond Budget, and any of those added up citywide before dividing. The record does not document what separates the Total pair from the Bond pair, and unlike the building permits dataset this one publishes no data dictionary, so the difference is not guessed at.
By proposition
Ordered by how many projects each covers, never by money. A proposition with more dollars is not better funded relative to need: they buy different kinds of thing, and a library is not a drainage tunnel.
| Proposition | Projects | Approved | Spent | Complete | Off schedule |
|---|---|---|---|---|---|
| Parks | 163 | $459.2M | $265.4M | 128 | 18 (11%) |
| Streets | 126 | $916.8M | $484.7M | 72 | 12 (10%) |
| Drainage | 42 | $308.9M | $147.8M | 20 | 5 (12%) |
| Library | 13 | $23.3M | $23.6M | 13 | 0 (0%) |
| Safety | 11 | $112.7M | $48.9M | 6 | 2 (18%) |
| Facility | 9 | $59.1M | $19.6M | 3 | 3 (33%) |
| Housing | 5 | $150.0M | $59.0M | 0 | 0 (0%) |
| Neighborhood | 1 | $20.0M | $20.5M | 1 | 0 (0%) |
By council district, and the money that has no single district
Only 75.0% of the approved money sits in one named council district. The rest belongs to projects that span several, or that the City recorded as citywide. It is shown below as its own rows and is never divided between districts, because the record does not say how it divides and inventing a split would make the number ours rather than the City’s.
| District | Projects | Approved | Spent | Off schedule |
|---|---|---|---|---|
| District 1 | 50 | $329.3M | $239.9M | 7 |
| District 2 | 33 | $137.7M | $81.8M | 4 |
| District 3 | 43 | $206.3M | $110.5M | 3 |
| District 4 | 32 | $147.9M | $85.8M | 2 |
| District 5 | 32 | $145.4M | $64.8M | 6 |
| District 6 | 31 | $107.4M | $55.3M | 3 |
| District 7 | 30 | $108.1M | $53.3M | 1 |
| District 8 | 23 | $127.3M | $72.9M | 1 |
| District 9 | 25 | $119.9M | $63.4M | 0 |
| District 10 | 30 | $108.4M | $47.4M | 3 |
| Spans several council districts | 23 | $307.1M | $105.8M | not comparable |
| Citywide (CW) | 18 | $205.2M | $88.5M | not comparable |
These districts are not ranked and should not be. A district with more bond money recorded against it is not better served. Propositions fund particular kinds of asset, and parks, drainage and streets are not spread evenly across a city.
The record carries three council district columns and they do not agree. The column named Council District matches the one named CD on 329 of 370 projects, and CD matches CD2 on 347. This page reads Council District throughout. There is nothing in the record that makes one of the three authoritative, and switching between them would move money between districts, so the disagreement is published rather than quietly resolved.
On schedule, according to the City
No project sits past the end date the City has given it while still incomplete, and that is worth stating carefully. It is what you would see if the City kept these dates current. It is also exactly what you would see if a date were moved forward each time a project slipped. The record holds no history of previous end dates, so nothing in it separates the two readings, and this page does not pick one.
What can be said plainly is narrower: the City flags 40 of its 370 projects as off schedule itself, and 8 projects are marked complete and off schedule at the same time, which is the City recording that they finished late.
Cancelled
| Project | Bond | District | Approved | Spent |
|---|---|---|---|---|
| Lone Star Boulevard (Area Streets) | 2017 | 05 | $62k | $63k |
| Aquatic Center at Palo Alto College | 2017 | 04 | $0 | $0 |
| Harvey E. Najim YMCA Phase 2 | 2017 | 03 | $50k | $50k |
| O.P. Schnabel Park Multi-Generational Center | 2017 | 07 | $11k | $0 |
| Sports Education Facility | 2017 | 02 | $2k | $2k |
| District 4 Multigenerational Recreational | 2022 | 04 | $0 | $0 |
A cancelled project that records money spent is not necessarily money wasted. Design and study work happens before a decision to cancel, and the record does not say what was bought.
What this record cannot tell you
| Question | What the record holds |
|---|---|
| Is a project late? | No date exists to measure against. Every construction end is a season and the City's own status flag is the only judgement available. |
| Is a project over budget? | Not computable. The column that would be the denominator is a recorded zero on most projects, and approved bond money is an authorisation rather than an estimate of final cost. |
| What does each district get? | Only for the 75.0% of money in a single named district. The rest spans districts or is citywide and is never divided. |
| What is the difference between the two budget columns? | Undocumented. This package publishes no data dictionary, so the distinction is not guessed at. |
| Who is responsible for a project? | The record names an officer and a direct phone number on every project. This page reads neither and republishes neither. |
Source: City of San Antonio bond project master list, which the City states is updated monthly, retrieved 2026-08-30. This is a different record from the building permit file: a permit is permission for someone to build, and a bond project is work the City committed voters’ money to. There is no key between them and this page never joins them. Machine readable copies: JSON API and CSV.
Other San Antonio tools
Same method, a different public record. Each one states what its record cannot answer.
Crime Map Building Permits Bar & Restaurant Revenue Aggressive Driving Trail Accessibility Licence Plate Readers Data Centers Data Center Zoning 311 Response Times Data Center Corroboration Data Center Environmental Record Bond Projects
All 12 are free, with no signup and no email wall, and the public API behind them needs no key.