DC Building Permits - 2009 to Present
Pricing
from $0.03 / 1,000 dc building permit records
DC Building Permits - 2009 to Present
Washington DC building permits (public open data, year layers 2009-2026): type/subtype/category, status, work description, applicant and owner, fees, address with ward/ANC/SMD, zoning and the SSL parcel key that joins to DC property records.
Pricing
from $0.03 / 1,000 dc building permit records
Rating
0.0
(0)
Developer
Wenhao Yang
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Every building permit the District of Columbia issues lands in a public register: the permit type and category, the status of the application, the work being described, who applied, who owns the property, what was paid, where it is - and the SSL parcel key that links the permit to the District's property records. This actor turns that register into a charged-per-record search, filter and aggregate tool across 18 year layers, 2009 through 2026.
Built for: contractor and applicant research, construction-activity and development tracking, permit-history diligence on an address, neighborhood and ward analysis, and anyone who needs the District's own permit record rather than a map-by-map lookup.
What it covers
Each record carries:
- the permit - permit id, internal number, type, subtype, category, and the application status
- the dates - issue date and last-modified date
- the work - the free-text description of work
- the people - applicant and owner of record
- the money - total fees paid, with the fee type string itemising what the fee was for
- the place - full address, ZIP, ward, ANC, SMD, police district, neighborhood cluster, business improvement district, and zoning
- the parcel key -
ssl, the Square-Suffix-Lot identifier that joins this register to the District's CAMA property tables - the coordinates - latitude and longitude, on every row
The fine print that matters
The District publishes one layer per calendar year, and this actor makes you pick one. There is no single table spanning 2009-2026 - the source is partitioned, and year selects the layer that gets queried. The newest year is live: the 2026 layer carried 35,691 permits for the year to date, the most recent issued 2026-09-23. To trace one address across the decade, query the years you care about one at a time.
Recent years: 2026 - 35,691 / 2025 - 50,086 / 2024 - 47,161 / 2009 - 28,511. Volumes vary year to year, and older years are smaller; the guard on each layer is set below the smallest of them.
There is no usable ZIP column, and this actor does not pretend otherwise. CITY, STATE and ZIPCODE are null on every row of every year layer (verified layer by layer). The ZIP lives inside the address string instead (..., WASHINGTON, DC 20002), so the zip filter matches against the address and the zip output field is parsed from it. Coverage varies by year - 99.8% of 2026 rows carry one, but only 75.9% of 2009 rows do; the remainder return blank and cannot be found by a ZIP filter.
Some fields are thin, and they are not sold as features here. The work description is populated on 41.7% of 2026 permits and the applicant on 50.5%; the business improvement district on 19.0% of 2026 permits and the fee-type breakdown on 64.9% of 2025 permits. They are returned as fields, but nothing in this listing rests on them. The fields that are dense - permit id, issue date, address, type, status, fees paid, ward, ANC, SMD, coordinates - are filled on every row.
A row is a permit, and one address often has many. Supplementary, post-card and home-occupation permits pile up on the same property, so a plain address search returns the whole paper trail rather than one record. That is the register's real granularity and each row is billed once.
Typical questions
- "Every permit at an address - the full paper trail."
- "What has filed for?"
- "Construction permits in a ward or ZIP."
- "Permits issued in the last 90 days and still open."
- "High-fee permits - where the money went."
- "Permits by zoning or ANC, or on a given SSL parcel."
- "Aggregate by type, status, category, ward or zoning."
Inputs
| Input | What it does |
|---|---|
mode | rows (default) / aggregate |
year | which year layer to query (2009-2026); default = the current year |
permitId / ssl | exact permit number / parcel key |
address | full-address substring |
applicant / owner | name substring on each party |
permitType / category / status | exact values as the District records them |
ward / anc / zoning | district and zoning filters |
zip | digits only; matched inside the address string |
issuedFrom / issuedTo | issue-date range (inclusive) |
minFee | minimum fees paid |
groupBy | aggregate over status / permitType / category / ward / anc / district / zoning |
maxResults | cap records (default 50) |
Default run = 50 permits from the current year, newest issue date first - a plain read of the live layer, fast enough for the daily auto-test. For a targeted query add a filter; for a broad view use aggregate.
Example inputs
One permit by number
{ "permitId": "P2612157" }
An address's permits in the current year
{ "address": "MASSACHUSETTS AVE", "maxResults": 5 }
A ward's recent permits
{ "ward": "2", "maxResults": 5 }
Permits in a ZIP, issued in a window
{ "zip": "20002", "issuedFrom": "2026-01-01", "maxResults": 5 }
How this year splits by permit type
{ "mode": "aggregate", "groupBy": "permitType" }
Low cost
From $0.00005 per record, down to $0.00003 at Gold Pay-per-event: you are charged per record delivered, and nothing for the query. Cost scales with what you pull, not with the size of the register, and each record is metered individually - one address's permit history costs a fraction of a cent.
Example output
One permit - permitId=P2612157 in the 2026 layer returns its type, status,
parties, fees and location:
{"platform": "dc-building-permits","source": "dc-dcra-building-permits","year": "2026","mode": "rows","groupKey": "","groupCount": "","groupBy": "","permitId": "P2612157","internalNumber": "252612157","issueDate": "2026-09-23","lastModifiedDate": "2026-09-24","permitType": "SUPPLEMENTAL","permitSubtype": "PLUMBING AND GAS","category": "NA","status": "PERMIT ISSUED","descriptionOfWork": "","address": "3955 MASSACHUSETTS AVE NW, WASHINGTON, DC 20016","zip": "20016","ward": "3","anc": "ANC 3A","smd": "3A02","district": "SECOND","psa": "204","neighborhoodCluster": "Cluster 14","businessImprovementDistrict": "","zoning": "R-1B","ssl": "","applicant": "","ownerName": "TROY, ADAM W","feesPaid": "262","feeType": "26.00 (GASRANGE);26.00 (WATERHEATER);186.00 (PLUMBFIXTURE);23.80 (PLUMBINGEFEE)","latitude": "38.93324576","longitude": "-77.07897127","sourceUpdatedAt": "2026-09-24"}
Note descriptionOfWork and applicant are blank on this permit and zip is
filled from the address - see the fine print.
An aggregate row - {"mode": "aggregate", "groupBy": "permitType"} returns
one row per type, with the record fields blank:
{"platform": "dc-building-permits","source": "dc-dcra-building-permits","year": "2026","mode": "aggregate","groupKey": "SUPPLEMENTAL","groupCount": "19176","groupBy": "permitType","permitId": "","address": "","ward": "","ownerName": "","sourceUpdatedAt": "2026-09-24"}
Notes
- Source: DC Department of Buildings / DCRA, published on the District's open GIS server. No login, no key.
- Freshness: each row carries
sourceUpdatedAt, the newest edit date in the layer (checked on the current year; past years are archives and are not required to be fresh). - Coverage: District of Columbia, 2009 to present. One layer per year - the register is not a single searchable table.