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