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 entities

What 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.

ColumnTypeDescription
interval_start_utcrequiredtimestampThe day the permit was issued: midnight in the city's zone, as UTC.e.g. 2026-09-04T05:00:00Z
permit_idrequiredstringThe city's own permit number.e.g. 2026-116568 BP
permit_typerequiredstringThe 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_classstringRESIDENTIAL or COMMERCIAL, read off the permit type where the type says.e.g. COMMERCIAL
work_classstringThe city's work type: New, Existing or Other.e.g. New
descriptionstringThe 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_usdnumberDeclared valuation on the permit, US dollars.e.g. 20000
contractorstringThe 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_utcrequiredtimestampThe day the application was filed: midnight in the city's zone, as UTC.e.g. 2026-08-20T05:00:00Z
zipstringFive-digit ZIP of the permitted address. The entity a page counts by.e.g. 78704
latnumberLatitude of the permitted address, degrees north, as geocoded by the city.e.g. 30.243
lonnumberLongitude of the permitted address, degrees east of Greenwich.e.g. -97.751
source_published_at_utcrequiredtimestampWhen the city last refreshed the dataset this row was read from: the vintage.e.g. 2026-09-07T12:19:55Z
collected_at_utcrequiredtimestampWhen 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

shell
curl "https://api.dryos.ai/v1/datasets/sanantonio-permits/query?node=78201&limit=12"

The catalogue entry — every column, its type and the source

shell
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.

shell
claude mcp add --transport http dryos https://api.dryos.ai/mcp

Then 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.

  1. 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