Property · Permits
San Antonio permits
Every building and trade permit the City of San Antonio issues, one row per permit, with its own re-roof permit type — the number a roofer, an adjuster or a carrier watches the week after a hailstorm. Read nightly from the city's open-data file and upserted for two weeks after issue.
sanantonio-permitsdaily · 1d rows71 entitiesWhat is in it
- Updates
- daily · 1d rows
- Entities
- 71 entities — 78201, 78209, 78245…
- Source timezone
- US Central — every timestamp Dryos serves is UTC
- Coverage
- 26 May 2026 to now
- Rows held
- 20,901
- Primary key
- permit_id
- On the map
- 71 of 71 placed
What it measures
Every value, its unit, and what the source means by it.
- Permits issuedpermits
How many permits were issued in the day or week — the rollup's own row count, after any filter.
samples - Declared value$
Total valuation declared on the permits in the day or week. Filed on about two permits in a hundred, mostly new buildings, so this is new construction's value rather than all work's.
valuation_usd
Columns
Exactly what a request answers with, read from the API rather than written here.
| Column | Type | Description |
|---|---|---|
| interval_start_utcrequired | timestamp | The day the permit was issued: midnight in the city's zone, as UTC.e.g. 2026-09-04T05:00:00Z |
| permit_idrequired | string | The city's own permit number.e.g. 2026-116568 BP |
| permit_typerequired | string | The city's permit type as a token, trailing 'Permit' dropped: RE_ROOF, MECHANICAL, COMM_NEW_BUILDING, RESIDENTIAL_REPAIR and some sixty more.e.g. RE_ROOF |
| permit_class | string | RESIDENTIAL or COMMERCIAL, read off the permit type where the type says.e.g. COMMERCIAL |
| work_class | string | The city's work type: New, Existing or Other.e.g. New |
| description | string | The work described on the permit, verbatim. This is where a re-roof, a solar array or a foundation repair is named.e.g. Express: Removal of existing roof and chimney section |
| valuation_usd | number | Declared valuation on the permit, US dollars.e.g. 20000 |
| contractor | string | The contracting company on the permit. The company only: a contact that is a person's name is not stored.e.g. LEGACY HOME IMPROVEMENTS |
| applied_utcrequired | timestamp | The day the application was filed: midnight in the city's zone, as UTC.e.g. 2026-08-20T05:00:00Z |
| zip | string | Five-digit ZIP of the permitted address. The entity a page counts by.e.g. 78704 |
| lat | number | Latitude of the permitted address, degrees north, as geocoded by the city.e.g. 30.243 |
| lon | number | Longitude of the permitted address, degrees east of Greenwich.e.g. -97.751 |
| source_published_at_utcrequired | timestamp | When the city last refreshed the dataset this row was read from: the vintage.e.g. 2026-09-07T12:19:55Z |
| collected_at_utcrequired | timestamp | When Dryos collected this row, UTC. Stamped by the platform.e.g. 2026-09-07T14:00:10Z |
Read it
Public, read-only, no key and no sign-up. Relative times stay relative, so a URL keeps working.
The newest rows
curl "https://api.dryos.ai/v1/datasets/sanantonio-permits/query?node=78201&limit=12"The catalogue entry — every column, its type and the source
curl "https://api.dryos.ai/v1/datasets/sanantonio-permits"Full parameters — bucketing, aggregation, filters and search — are on the API reference.
Ask an agent
The same stream through the Model Context Protocol, so Claude, ChatGPT, Cursor or any MCP client can query it directly.
claude mcp add --transport http dryos https://api.dryos.ai/mcpThen ask:
How many permits did San Antonio issue each week this quarter, by trade?
Setup for every client is on the MCP server page.
Changes to this collector
A change in the collector is a change in the data. Anyone reading a step in a series is owed the day it moved under them.
- 2026-09-13
Permits carry a subject and an action (rules version 1), kept in a table of their own so the city's rows are untouched.
San Antonio's sixty-odd permit types nearly say what a permit is for (RE_ROOF is a roof being replaced), but its trade types name only the trade and its descriptions are addresses and names. The subject (Roof, HVAC, Home, …) and action (New, Replace, Repair, …) are read off the type, the work type and, for trade permits only, the words, by versioned rules in reference/permit_classes.py, after every run, and served beside the city's columns. About half the permits are trade permits whose action the city does not state; those read Unspecified rather than a guess.
How this stream is checked
- Pulled straight from City of San Antonio Development Services — no reseller in between — and compared against that file before it is served.
- Null means the source did not report it — never zero.
- A reading lands daily; the interval timestamp is the start of the interval, in UTC.
- The people are not stored. Contractor and applicant names, phones and addresses are never selected; the contractor company is kept, because which firms pull permits where is the point of the feed.
Related streams
- Austin construction permits
Every building, electrical, mechanical, plumbing and driveway permit the City of Austin issues, one row per permit: the work described, the declared value, the contracting company and the place.
daily · 1d rows50 entitiesaustin-permits - Fort Worth permits
Every building and trade permit filed with the City of Fort Worth, one row per permit, by the day it was filed: the work described, the declared value, its status as it moves from plan review to issued, and the place.
daily · 1d rows44 entitiesfortworth-permits - Collin County permits
Building permits from every city in Collin County, as the Collin Central Appraisal District records them: the city, the work, the builder and the ZIP.
daily · 1d rows38 entitiescollin-permits