San Antonio Building Permits
All 137,425 building permits the City of San Antonio issued between 2025-01-01 and 2026-08-21, grouped by type, council district and month. Published the way the City’s record actually is, which means every figure arrives next to the share of permits it was computed from. That turns out to matter more than any of the totals.
Read the two numbers together or not at all. A dollar total from this record is not a measure of construction. It is a measure of construction that had the valuation box filled in. Those are different quantities, and on this dataset they are very different: the field is blank on 97.8% of permits, including every single one of the new houses. Each table below therefore carries its own coverage column.
Where the valuation field is filled in, and where it is not
Every permit type the City issued 250 or more of, ordered by how many permits it covers. Two coverage columns, not one. A permit with no price is not necessarily a permit with nothing recorded: the City measures floor area on categories where it never records a dollar figure, so the rows showing no money are often the rows carrying a size.
| Permit type | Permits | Has a price | Declared valuation | Has a size | Floor area |
|---|---|---|---|---|---|
| Mechanical Permit | 16,132 | 0.0% | none | 0.0% | none |
| Plumbing General Permit | 15,170 | 0.0% | $413k | 0.0% | 902 sf |
| Electrical General Permit | 13,810 | 0.0% | none | 0.0% | none |
| Plumbing Irrigation Permit | 11,389 | 0.0% | none | 0.0% | none |
| Re-Roof Permit | 10,083 | 0.0% | none | 0.0% | none |
| Residential Repair Permit | 9,282 | 0.0% | none | 0.0% | none |
| Res New Building Permit | 6,464 | 0.0% | none | 99.4% | 32,615,297 sf |
| Garage Sale | 6,035 | 0.0% | none | 0.0% | none |
| Foundation Repair Permit | 5,178 | 0.0% | none | 0.0% | none |
| LSR Plumbing Permit | 4,514 | 0.0% | none | 0.0% | none |
| Plumbing Sewer Permit | 4,249 | 0.0% | none | 0.0% | none |
| Plumbing Gas Permit | 4,154 | 0.2% | $1.5M | 0.2% | 8 sf |
| Tree Affidavit Permit | 3,427 | 0.0% | none | 0.0% | none |
| On Premise Sign | 3,123 | 0.0% | $29.0M | 0.1% | 132,150 sf |
| Electrical TOPS Permit | 2,084 | 0.0% | none | 0.0% | none |
| Residential Fence Permit | 1,942 | 0.0% | none | 0.0% | none |
| LSR Mechanical Permit | 1,746 | 0.0% | none | 0.0% | none |
| Solar - Photovoltaic Permit | 1,628 | 0.0% | none | 0.0% | none |
| Comm Remodel Permit | 1,408 | 10.8% | $69.2M | 3.7% | 1,028,484 sf |
| Home Addition Permit | 1,222 | 0.0% | none | 0.0% | none |
| Minor Commercial Repair Permit | 954 | 0.0% | none | 0.0% | none |
| Sidewalk-Curb Permit | 915 | 0.0% | none | 0.0% | none |
| Comm New Building Permit | 893 | 100.0% | $19.72B | 100.0% | 275,161,817 sf |
| Electrical TML Permit | 812 | 0.0% | none | 0.0% | none |
| Comm Sitework Permit | 786 | 89.3% | $2.52B | 81.6% | 31,321,792 sf |
| Demolition Permit | 761 | 0.0% | none | 99.5% | 2,649,563 sf |
| Tree Permit | 760 | 0.0% | none | 0.0% | none |
| Swimming Pool or Spa Permit | 731 | 0.0% | none | 0.0% | none |
| Across the Street Banner | 726 | 0.0% | none | 0.0% | none |
| Plumbing Backflow Permit | 705 | 0.0% | none | 0.0% | none |
| Maintenance Permit | 702 | 0.0% | none | 0.0% | none |
| Covered Patio or Porch Permit | 544 | 0.0% | none | 0.0% | none |
| Carport Permit | 461 | 0.0% | none | 0.0% | none |
| Plumbing Completion Permit | 441 | 0.0% | none | 0.0% | none |
| Electrical Reconnect Permit | 419 | 0.0% | none | 0.0% | none |
| Electrical Completion Permit | 368 | 0.0% | none | 0.0% | none |
| Comm Fence Permit | 311 | 98.7% | $974.1M | 28.9% | 10,575,090 sf |
| Mechanical Completion Permit | 263 | 0.0% | none | 0.0% | none |
| Comm Finish Out Permit | 256 | 100.0% | $533.1M | 100.0% | 3,833,179 sf |
| All other permit types | 2,577 | 28.0% | $2.92B | 16.5% | 28,467,829 sf |
7,341 of the priceless permits are not blank rows. They carry a recorded floor area totalling 38,351,073 square feet. The City measured those buildings, it simply did not price them, and reading only the money column throws that away.
By council district
A district with more recorded valuation is not necessarily building more. It may simply have had the field filled in more often. This record cannot tell those apart, so both columns are shown and neither is ranked.
- under 10,909
- 10,909+
- 12,293+
- 12,811+
- 14,276 and up
| District | Permits | With a valuation | Coverage | Declared valuation |
|---|---|---|---|---|
| District 0 (not a council district: extra-territorial or unassigned) | 13,778 | 8 | 0.1% | $1.9M |
| District 1 | 14,728 | 274 | 1.9% | $1.51B |
| District 2 | 14,048 | 306 | 2.2% | $740.9M |
| District 3 | 12,293 | 378 | 3.1% | $4.41B |
| District 4 | 12,553 | 338 | 2.7% | $3.86B |
| District 5 | 8,171 | 162 | 2.0% | $480.8M |
| District 6 | 10,909 | 354 | 3.2% | $3.80B |
| District 7 | 10,860 | 128 | 1.2% | $319.2M |
| District 8 | 11,397 | 371 | 3.3% | $2.75B |
| District 9 | 12,811 | 274 | 2.1% | $3.24B |
| District 10 | 14,276 | 311 | 2.2% | $2.59B |
| Spans several districts (valuation deliberately not divided between them) | 982 | 93 | $1.79B | |
| No district recorded | 619 | not stated |
Permits issued per month
How concentrated the recorded value is
569 permits carry 90.3% of all the declared value on the record. That is 0.41% of permits holding most of the money, which is worth knowing before treating a citywide dollar total as broad-based activity.
| Declared valuation | Permits | Total declared | Share of declared value |
|---|---|---|---|
| $10M and above | 569 | $24.17B | 90.3% |
| $1M to $10M | 694 | $2.19B | 8.2% |
| $250k to $1M | 624 | $327.5M | 1.2% |
| $50k to $250k | 504 | $61.5M | 0.2% |
| $10k to $50k | 484 | $13.5M | 0.1% |
| Under $10k | 169 | $781k | 0% |
Shares are of the declared value only, which is the 2.2% of permits carrying the field. They are not shares of construction in San Antonio.
The blanks are not all empty
Before reaching for an estimate, it is worth asking what the record already holds. Two things turn out to be true of the permits with no price on them.
This is the honest way to fill a gap: read a field the City already populated, rather than inventing a number for one it did not. Floor area is not a substitute for construction value and is not converted into one anywhere on this page. It is simply the measurement that exists, and on new homes it exists on almost every permit while the price exists on none of them. Quote the median rather than the mean if you use the home-size figure: a few hundred large multifamily permits filed under the residential type pull the average to more than twice the typical house.
What the blank is hiding, according to a different agency
The City records new-home permits with the valuation field empty. The Census Bureau surveys the same county for the same months and publishes a number for the same buildings. Neither figure is used to fix the other; they are shown together because the gap between them is the point.
| Census Building Permits Survey, Bexar County | Buildings | Value |
|---|---|---|
| Single-unit | 3,061 | $569.9M |
| Buildings of five units or more (663 units) | 58 | $226.8M |
| Of the single-unit total, actually reported rather than imputed | 2,799 | 262 imputed |
These two records do not line up, and should not be made to. Census covers all of Bexar County including suburbs that run their own permit offices; the City file covers City of San Antonio permits. Census counts buildings and dwelling units; the City counts permits. So this is not a reconciliation and no figure here has been used to fill a blank. It is one independent estimate of the order of magnitude the City’s empty column is not carrying. Source: Census Building Permits Survey, file co2607y.txt.
Two maps, and what each one leaves out
The district map above keeps every permit and loses precision. The pin map below keeps precision and loses permits. Neither is the honest one on its own, which is why this page carries both and states what each drops. The audit here is what decides which permits the pin map can show at all.
- Usable coordinates 121,867 (88.7%)
- Wrong or mixed system 4,493 (3.3%)
- No coordinates recorded 11,174 (8.1%)
| What the coordinate columns contain | Permits |
|---|---|
| Longitude and latitude in degrees, inside San Antonio | 121,867 |
| Texas State Plane feet, a different coordinate system in the same column (recoverable by reprojection, verified) | 4,259 |
| A positive longitude, which places San Antonio in western China | 108 |
| A longitude sitting in the latitude column | 113 |
| Both systems mixed inside a single row | 13 |
| No coordinates at all | 11,174 |
Not all of that is lost. The 4,259 rows in Texas State Plane are not corrupt, they are simply in another coordinate system, and reprojecting them is arithmetic rather than a guess. Every corner of their bounding box converts into Bexar County, so all of them are recoverable. That still does not make a pin map of EVERY permit honest: 11,174 have no coordinates at all, and 234 more carry sign or axis errors that no reprojection repairs. Losing eight per cent of a map without saying so is the failure this page is about.
A pin map built from this column without checking would silently drop the 11,174 permits that have no location and scatter the broken ones across the planet, and it would look completely normal while doing it. The failure would be invisible precisely because the output is a picture, and a picture of San Antonio with dots on it looks right no matter which dots are missing. So this page does draw a pin map, but only over the category where the coordinates actually hold up, and it prints the count it is missing above the map rather than under it.
Where the new buildings are
Every permit the City issued for a new residential or commercial building, placed at its recorded coordinates. This is a complete category, not a sample, but it is not every permit: a re-roof or a water heater has no building to place.
Nothing external is contacted until you press this: not the map library, not the tile server, and not the 7,011 points.
Read the missing 346 as part of the map. They are not scattered at random: a permit with no coordinates is disproportionately likely to be an older or hand-entered record, so the blank spaces on this map are not necessarily places where nothing was built. That is exactly why the district map above, which loses precision but keeps every permit, is the one this page shows first.
Source. City of San Antonio open data, Building Permits (permits issued), read through the City's own API and rebuilt monthly. Fetched 28 August 2026. Nothing here is corrected, filled or smoothed: where the City's record is blank, this page shows a blank and says how large it is.
Share it with someone about to quote a construction number.
Read this before you read the numbers
A construction figure with no coverage rate attached is not a small imprecision. It is a different quantity wearing the same name.
What this is
Every permit in the City’s published “permits issued” record: 137,425 of them across 40 permit types and 11 council districts, refetched monthly and republished exactly as fetched.
What it is not
It is not a measure of construction, a property lookup, or a record of what got built. A permit is a declaration of intent. Nothing here says the work started, finished, or ever happened.
Where the numbers come from
Directly from the City of San Antonio’s own open data API. No field was corrected, filled or smoothed. Where the City’s record is blank, this page shows a blank and says how large it is.
Who it is for
Anyone who has to quote a San Antonio construction number and would rather quote a defensible one. Reporters, analysts, and anyone checking a figure they were handed.
The number that is wrong in a way that hides itself
The City’s permit record carries a field called declared valuation. Add it up across every permit and you get a headline worth billions of dollars. That total is real arithmetic on real data, and it is quoted as though it describes construction in San Antonio.
It is computed from 2.2% of the permits. The field is blank on the other 97.8%. Not zero. Blank. And the blanks are not scattered randomly across the boring permits: coverage is exactly zero on mechanical work, on plumbing, on electrical, on re-roofing, on foundation repair, and on all 6,464 permits for new residential buildings.
So the total excludes every new house in the city while including a handful of very large projects, and it presents the result as the value of construction. Nothing about the number looks wrong. It has no error bar, no footnote, and no missing-data warning, because from the arithmetic’s point of view nothing is missing. The zero is doing the work of an absence.
The concentration makes it sharper still. 569 permits, each declaring ten million dollars or more, carry 90.3% of all the declared value on the record. A citywide dollar total is therefore mostly a report on a few dozen large projects, dressed as a report on a city.
This is not a complaint about the City. The field is optional on most permit types and there is no reason a re-roof permit would carry a construction valuation. The problem appears at the moment someone sums the column without asking how often it is filled in, and that is a thing anyone can do in about four seconds in a spreadsheet.
Four fields that will quietly ruin your analysis
Each of these produces a confident, plausible, wrong answer rather than an error.
Declared valuation is mostly blank
Populated on 2.2% of permits, and on 0% of several of the largest categories. Sum it without checking and you have measured paperwork habits, not building. Always publish the coverage rate beside the dollar figure.
The council district field holds several districts at once
It is a comma-separated string. A permit can read “0, 1, 2, 5, 7”. Group by it naively and you invent districts that do not exist and split billions across them. 982 permits span more than one district here and are reported whole, never divided, because the record does not say how the value divides. Another 619 carry no district at all.
The coordinates are two coordinate systems in one column
121,867 permits carry usable longitude and latitude. 4,493 carry something else: Texas State Plane feet, a positive longitude that places San Antonio in western China, or a longitude sitting in the latitude column. 11,174 have no location at all.
District 0 is not a district
It is extra-territorial or unassigned land. It appears in the City’s data beside the eleven real council districts and looks exactly like one of them. It is labelled here and kept out of any comparison between districts.
Two maps, and what each one leaves out
There are two maps in this record and they fail in opposite directions, which is why the page carries both.
The district map above works because a council district is a label. The field is genuinely messy, a comma-separated string that names several districts at once on 982 permits and none at all on 619 more, but once you parse it properly every permit either lands in exactly one district or is reported separately as unplaceable. Nothing is guessed. And the map is shaded by permit count rather than by dollars, because the count is on every record and the valuation is on 2.2% of them. Shading a map by the sparse field would draw exactly the picture this page exists to warn about.
The pin map trades the opposite way: exact locations, but only for the permits whose coordinates survive inspection. Across all 137,425 permits that is not good enough. 11,174 have no coordinates at all, and a map that quietly omits eight per cent of its subject looks completely normal while doing it. The failure would be invisible precisely because the output is a picture, and a picture of San Antonio with some dots on it looks right no matter which dots are missing.
Narrow it to new buildings and the picture changes. Those permits get surveyed properly, so 95.3% of them carry a usable location once the Texas State Plane rows are reprojected rather than discarded. That is a complete category rather than a sample, and the count it is still missing is printed above the map instead of under it. A stated omission is not a silent one, and that distinction is the whole difference between the two maps.
What this page will not do is draw the pin map over every permit and let the gaps pass for empty ground. That is the same call the trail accessibility tool makes when it refuses to certify a trail as ADA compliant from a record that contains no width, grade or cross slope. Saying what a dataset cannot support is a result, not a gap in the work.
How this was built
Everything on this page is a grouped aggregate computed by the City’s own API and reconciled before it is published. No row-level extract is downloaded, which matters because the platform silently truncates large result sets at thirty-two thousand rows and reports success while doing it. The build compares its per-type and per-district totals against an independent count and refuses to publish anything at all if they disagree, so a partial fetch produces no page update rather than a quietly wrong one.
The whole thing is rebuilt monthly. If a rebuild fails, the previous good copy stays exactly where it is and the page carries its original build date, so staleness is visible and a bad fetch can never turn into bad numbers. The figures on this page were last rebuilt on 28 August 2026.
Every number in the prose above is read from the same file as the tables, through a shortcode, so this essay cannot drift out of agreement with the data underneath it. If the City’s coverage rate changes next month, this sentence changes with it.
The data is free to take. There is a CSV of the entire dataset and a public JSON API with a documented OpenAPI description, both linked from the panel above. The API’s quality endpoint returns the coverage rates and the coordinate audit as structured data, so a consumer who never reads this page still gets told what the numbers do and do not support.
Why an IT contractor built a permit tracker
Because this is what the work actually looks like. Public agencies hold enormous amounts of data that is technically published and practically unusable, and the hard part is almost never the dashboard. It is knowing that a blank is not a zero, that a column can hold two coordinate systems, that a field called district can name five of them, and that the honest output is sometimes a refusal.
Anyone can build a chart from a government CSV. The difference is whether the person who built it checked what the fields mean first, and whether they will tell you when the answer is that the data does not support the question. This page is a public, checkable sample of that.
If you have a dataset that needs the same treatment, that is the work we do. See our capabilities or get in touch.
Want the monthly rebuild in your inbox? Leave an email and we will send you the update when the numbers move.
We'll send a copy and, if you want, help you take the next step. No spam.
Related free tools
San Antonio Trail and Sidewalk Access
Every city trail by surface firmness, plus the sidewalk network by council district, with an audit of the inventory’s own missing-data sentinels. Certifies nothing, and says why.
San Antonio Crime Map
Forty-two months of SAPD offences by ZIP code with trends, per-capita rates and a statistical test that mostly reports that nothing unusual happened, because that is usually the truth.
The free API platform
Every one of these datasets is available as documented, CORS-enabled JSON with an OpenAPI description. No key, no signup, no rate limit worth mentioning.
Schedule Your Technical Briefing
Skip the email queue. Book a direct 30-minute discovery session on our technical calendar.
Pick a date
Available times
All times shown in Central (Chicago)You're booked.
A confirmation email is on its way from [email protected].
If you need to reschedule, reply to the confirmation email and we’ll handle it.