Skip to content

Latest commit

 

History

History
46 lines (42 loc) · 132 KB

permitdetail.md

File metadata and controls

46 lines (42 loc) · 132 KB

PermitDetail

PermitSummary plus the nine columns that only a single-permit lookup used to carry. Also returned inline by search and sync with ?fields=full (Developer and above).

Fields

Field Type Required Description Example
id str ✔️ Stable PermitStack id. Pass to GET /v1/permits/{id}. f4be62ed-b522-42a3-907b-b4ab4ec1a102
permit_number Nullable[str] ✔️ The permit number as the issuing jurisdiction publishes it. Not unique across jurisdictions, and not always present. R2608-181
status models.PermitDetailStatus ✔️ One of FILED, ISSUED, IN_PROGRESS, FINAL, EXPIRED, CANCELLED, REVOKED, INTERCONNECTED, UNKNOWN -- normalised by us from each source's own vocabulary. UNKNOWN means the source published no status, never that the permit is inactive. INTERCONNECTED comes from the California NEM solar feed. ISSUED
category models.PermitDetailCategory ✔️ Trade/work classification, UPPERCASE. One of: NEW_CONSTRUCTION, RENOVATION, DEMOLITION, ELECTRICAL, PLUMBING, MECHANICAL, ROOFING, SOLAR, BATTERY, EV_CHARGER, HVAC, FIRE_ALARM, SIGN, FENCE, POOL, FOUNDATION, ADDITION, INTERIOR_REMODEL, GRADING, OTHER. Derived by us from the permit type and description, not published by the city. NOTE when FILTERING: ?category=hvac matches HVAC and MECHANICAL, and ?category=mechanical does the same, because HVAC work is routinely filed as MECHANICAL -- they are one market and a bare equality would hide half of it. ROOFING
tags List[str] ✔️ Free-form keywords extracted from the description (e.g. 'pool', 'reroof'). Additive; do not rely on a fixed vocabulary. [
"pool"
]
property_type str ✔️ RESIDENTIAL, COMMERCIAL, INDUSTRIAL, MIXED_USE or UNKNOWN. UNKNOWN is common -- many feeds publish nothing that implies a property type. RESIDENTIAL
address_street Nullable[str] ✔️ Street address as published. Stored verbatim, so spacing can be irregular; our address matching normalises whitespace for you. 288 Mosaic Blvd
address_city Nullable[str] ✔️ City. Null where the feed publishes none -- notably county-wide feeds. Read null as unknown, never as 'not in a city'. Daytona Beach
address_state Nullable[str] ✔️ 2-letter state. Null on 6.6M permits (7.3%) whose feed never populates it; those rows are still returned by ?state= searches, which admit them on independent evidence of the jurisdiction. FL
address_zip Nullable[str] ✔️ 5-digit ZIP where published. 32124
parcel_id OptionalNullable[str] ➖ Assessor parcel number / APN exactly as the SOURCE publishes it -- formatting varies by county and is not normalised. ~41% populated estate-wide and entirely dependent on whether the source publishes one, so read a null as 'this feed does not carry a parcel', never as 'this property has none'. Filterable via ?parcel=. 521804000160
description_raw Nullable[str] ✔️ The scope of work exactly as the jurisdiction published it. The single most useful field for lead qualification, and the input our category classifier reads. RE-ROOF: remove existing shingles, install 39 sq architectural shingles
estimated_value Nullable[float] ✔️ Declared job value in USD, as published. Frequently null and occasionally nominal -- treat 0 and 1 as 'not stated'. 24500
date_filed datetime ✔️ Application/filing date. Null where the source publishes only an issue date. 2026-08-14
date_issued datetime ✔️ Issue date. Null on ~25% of permits estate-wide -- whole feeds publish only a filed date -- which is why date_after/date_before filter on COALESCE(date_issued, date_filed) and issued_after does not. 2026-08-21
date_completed datetime ✔️ Completion/final date where the source publishes one. Usually null.
approval_days OptionalNullable[int] ➖ Calendar days from date_filed to date_issued (null unless both dates present)
construction_days OptionalNullable[int] ➖ Calendar days from date_issued to date_completed (null unless both dates present)
contractor_name OptionalNullable[str] ➖ Contractor of record, cleaned and de-duplicated by us. Null where the feed publishes no contractor -- which is whole jurisdictions, not scattered rows: 45% of permits estate-wide carry one. A page of nulls usually means the source does not publish contractors, not that our data is missing; the jurisdiction_coverage block on a search response tells you which. GLZ Industries LLC
contractor_id OptionalNullable[str] ➖ Opaque id of the contractor on this permit. Pass it to GET /v1/contractors/{id} for the full record; null when the source publishes no contractor for this permit.
owner_name OptionalNullable[str] ➖ Owner of record. contractor_name null + owner_name set means no contractor was recorded -- often a homeowner who pulled the permit themselves, which is a sales lead. Caveat: on feeds that capture no contractor at all, EVERY permit looks owner-filed and the owner may be a builder, not a homeowner. Use the ?owner_filed= filter rather than inferring this yourself. SMITH JOHN A
owner_address OptionalNullable[str] ➖ Property-owner MAILING address. Business plan ($149/mo) and above; null on every other plan, which is a gate and not an absence of data. Joined from county assessor rolls by parcel, so coverage is bimodal -- near-complete in the jurisdictions whose roll we have loaded, absent in those we have not. Never read a null as 'this property has no owner on record'.
jurisdiction_name OptionalNullable[str] ➖ The PermitStack data source this permit came from -- a city, county or statewide feed, which is not always the permit's own city. Daytona Beach
latitude OptionalNullable[float] ➖ WGS84 latitude. Null where the source publishes no coordinates and we could not geocode it; such permits are invisible to radius, bbox and polygon search. 29.1872
longitude OptionalNullable[float] ➖ WGS84 longitude. -81.0559
location_source OptionalNullable[str] ➖ Where the coordinates came from. 'source' = published by the city with the permit record, as good as the city's own data. 'geocoded' = derived by us from the site address (TIGER, address-centroid quality), which for a structure set back from the road, such as an antenna mast, marks the property address rather than the structure. 'derived' = set by us by another method (typically a parcel-centroid join), so treat it as ours, not the city's. 'source' is judged per feed: in a feed that publishes coordinates, a minority of rows whose record lacked them may have been filled by our geocoder before 2026-09-21, when it began logging successes, and those read 'source'. Null when latitude/longitude are null. source
enrichment OptionalNullable[models.PermitEnrichment] ➖ Structured detail parsed from the description (e.g. solar kW) where we could extract it. Null for most permits.
record_kind Optional[str] ➖ permit | contractor | tag | non_building | admin. Some portals mix non-permit records (contractor registrations, right-of-way, administrative) into the same feed; we store them and label them rather than counting them as permits. Search and export return record_kind='permit' only unless you ask otherwise. permit
date_expired datetime ✔️ Expiry date where published. Deliberately NOT null-checked against the future the way the other dates are -- an expiry legitimately lies ahead. 2027-02-21
fee_amount OptionalNullable[float] ➖ Permit/inspection fee. Frequently null — most open-data feeds do not publish fee data.
stories Nullable[int] ✔️ Building stories, where published. 1
units Nullable[int] ✔️ Dwelling/tenant units, where published. 1
square_footage Nullable[float] ✔️ Project square footage, where published. Usually null. 2100
applicant_name Nullable[str] ✔️ Whoever filed the application. On most feeds this is the OWNER; on a few it is the contractor, and for those tenants we map it to contractor_name instead. Never assume which one it is from this field alone. WINDOW WORLD OF DAYTONA
contractor_license OptionalNullable[str] ➖ Contractor's licence number as published or as matched against a state licence-board roster. A free public identifier; contact details remain gated to /v1/contractors/{id} on Developer+. CBC1262595
created_at OptionalNullable[str] ➖ When PermitStack first ingested this record (ISO 8601). NOT a date the city published -- use date_filed/date_issued for that. 2026-08-22T04:11:03.882174+00:00