I run CivicDataForge. We pull official government STR permit/license records from 30 US cities and counties into one normalized API — not Airbnb listing data, the actual government registries.
Every record carries: permit ID, status (active/expired/revoked), address with coordinates, expiration date, property type, and a link back to the source. The data refreshes daily from city open-data portals (Socrata, ArcGIS, CKAN, CSV feeds).
Current coverage: Seattle, Orlando, Nashville, Austin, Houston, Denver, Chicago, San Diego, Philadelphia, Boston, Sacramento, Scottsdale, Albuquerque, Asheville, Louisville, and 15 more including Florida's Osceola County (Kissimmee) and Polk County (Davenport/ChampionsGate) with coordinates and parcel IDs enriched from county GIS layers.
The API is free. If your market publishes a machine-readable permit registry, we can usually add it in a day.
What jurisdictions would be most useful to you? We're building based on what operators actually need — drop your city and we'll check if the data exists.
@Grant Woodward — checked Kansas City, MO. Good news: the city publishes all 1,436 registered short-term rentals on their Parcel Viewer GIS layer (ArcGIS, under the Neighborhood Services department). Every record carries a permit number, status, address, zip, parcel number, issue date, and expiration date. The data is machine-readable and queryable.
We'll add it. KC uses Missouri State Plane coordinates so we need to reproject to lat/long, but that's straightforward. Should be in the registry within the next few days.
Anything specific you're trying to do with the KC data — permit density analysis, checking a specific neighborhood, monitoring expirations? Happy to prioritize the fields that matter most for your use case.
@Mike Grudzien — live and queryable right now, not pre-launch. The API is an Apify actor that pulls directly from city open-data portals on each run.
Example of what a query returns today: run it against Orlando and you get 2,000+ vacation rental records, each with the DBPR licence number, status (Current / Suspended / Voluntarily Relinquished), expiration date, address with coordinates, and a link back to the state source. Run it against Denver and you get the city's Socrata-hosted registry with permit type, status, and address. Same normalized schema either way.
The landing page at civicdataforge.pages.dev/data/str-permit-data has the full jurisdiction list and links to the actor. Free to run — just pick your city and hit go.
@John Underwood — fair point. Experienced operators know their own permit requirements. The use case we're building for is more on the analysis side: investors underwriting a new market who want to see permit density by neighborhood before they buy, or operators tracking permit status changes across a portfolio without manually checking each city portal.
The "30 registries in one schema" part matters less if you're in one market you know well, and more if you're comparing across markets or building tools on top of the data. Appreciate the perspective — helps us calibrate who we're actually building for.
@Aaron Zimmerman — appreciate that. That's exactly the gap we saw: the data exists in public government portals, but finding it and making sense of 30 different schemas is a barrier for anyone who doesn't want to become a FOIA specialist. Glad it resonates.
@Grant Woodward — Kansas City is live. Turned out to be easier than I expected: the city publishes the registry on its own GIS server, so we wired directly to the source.
What you can pull right now: 1,145 unique active STR permits (the city's layer actually holds 1,436 rows, but 291 are exact duplicates we collapse), each with permit number, address, parcel number, issue/expiration dates, and GPS coordinates (converted from the state-plane system the city uses).
Update for everyone following: two upgrades shipped since the last post.
1. Every jurisdiction now carries coordinates. Seven of the 31 (Austin, Bend, Boston, Chicago, Denver, Orlando, Philadelphia) publish no geometry in their feeds, so we now resolve those through the US Census geocoder — 96% of records filled in testing. Every record also carries a coordinates_source field telling you whether the point came from the city's own geometry, a county parcel match, or Census street interpolation. Where nothing resolves, it ships null — we never guess a pin.
2. Florida condo group licences now show every unit. One DBPR licence can cover a whole complex (one row per unit). We found and fixed a bug that was collapsing those — an Osceola pull that returned 11 rows now correctly returns every permitted unit.
And a standing offer while we build: drop any address in the 31 covered markets and I'll run it against the official registry — whether that address already holds a permit, plus permit density and status mix on the surrounding blocks. Free, from the government record.
New field shipped today, and it's the one I think matters most: which government actually governs each parcel.
Every record now carries jurisdiction and jurisdiction_type, resolved by testing the property's coordinates against Census incorporated-place boundaries. So you get "this is inside Haines City" or "this is unincorporated county land" as a fact, rather than inferring it from the mailing address.
Why it matters — measured on Polk County, FL this morning: 159 of 188 permitted properties are on unincorporated county land (county rules, not city rules), and 7 have a mailing address naming a different place than the government that governs them. "214 WINDSOR PL, DAVENPORT" is actually governed by Eagle Lake. Underwrite that one off Davenport's ordinance and you read the wrong rulebook.
Control check, because a number like that deserves one: run against city-run registries, Kansas City came back 195/195 inside Kansas City and Orlando 199/199 inside Orlando — exactly what a correct method should return.
Also live: every record carries provenance. coordinates_source tells you whether a point came from the city's own geometry, a county parcel match, or Census interpolation. jurisdiction_source tells you the boundary set used. If we can't resolve something it ships null — we don't guess and we don't round up.
Quick pricing clarification, because earlier posts here said "free" and that was looser than it should have been.
The actor is pay-per-result: $0.003 per record. In practice a single-city pull is small — Orlando is 524 records (~$1.57), Kansas City 1,147 (~$3.44). The big counties run to thousands of records, so pick your city from the list rather than running the default all-31 pull — the full registry is ~100k records and prices accordingly. Apify's free plan includes $5/month of usage.
What stays genuinely free: drop an address in this thread and I'll run the check myself — permit status, density around it, governing jurisdiction — no account needed at all.