Docs / Permit filters
Building permits
Permit filters
Every filter that permit search, count, sync, contractors, exports, alerts, and aggregate accept, with its values. The same filter names and values as the permits map.
Permit routes take their own filters, with the same names and values as the permits map. Anything listed here is accepted; a name or value that is not returns 400 invalid_filter with the closest one we know, and costs nothing. GET /permits/reference returns the same values with their labels, for free.
How filters combine
- Values within one filter are an OR.
trades=roofing,solaris roofing or solar. A list filter takes comma-separated values or the parameter repeated (trades=roofing&trades=solar). - Different filters are ANDed.
cities=Provo&trades=roofingis roofing jobs in Provo. states,counties, andcitiesare one place filter, as on the map: a permit in any of the places matches.counties=Salt%20Lake%20County&cities=Provois permits in either. Naming one state helps us find a county or city whose name exists in more than one state.workTypesandworkGroupsOR together, and so dopropertyTypes,propertySubtypes, andassetClasses.statusesandstagesAND together, so send the one you need.- A permit that does not state a value, square footage, or unit count is left out while a filter on that number is on.
- Send at most one of
q,permitNumber, andcontractor.
Aliases: ids for permitIds, placeKeys for placeKey, and the singular state, county, and city. At most 100 permitIds, 50 contractorKeys, and 20 placeKey values per request.
Defaults applied for you
A filter you leave out can still shape the answer. Every default is listed in meta.appliedDefaults, so you can check it rather than remember it.
| Default | Effect | Change it |
|---|---|---|
dateField=activity, dateRange=12m | With no date filter, permits with activity in the last 12 months. Sync and an alert's matches look at any date. A new alert keeps the window as a rolling one. The permits map opens on Issued, any date. | dateRange=all for every date, or dateField=issued&dateRange=all to match the map. |
jobKinds=major,minor | Major and minor jobs. Record-only entries (licenses, property records, and planning cases filed as permits) are left out. | includeRecords=true adds them. |
sort=recent | Newest activity first. Order only, not which permits match. | Send your own sort. |
| Your plan area | Every route reads only the places your plan covers. A place wholly outside it is 403 geographic_access_denied. | GET /permits/coverage shows what your plan includes. |
Every filter
| Filter | Meaning | Values |
|---|---|---|
q | Words in the permit: its description, the work, the address, the permit number, and the names of people and companies on the permit. Every word must appear. The permits map search box. | Text |
permitNumber | An exact permit number as the city prints it. Use instead of q, not with it. | Text |
contractor | The full name of a general contractor, builder, or trade contractor on the permit (Example Builders LLC). It matches the whole name, ignoring capital letters and extra spaces; punctuation counts. Unsure of the spelling? Find the company with GET /permits/contractors and send its contractorKeys. Use instead of q, not with it. | A full company name |
contractorKeys | Exact contractor keys: the 16-character contractorKey of each row from GET /permits/contractors (at most 50). | 16-character keys, one or more |
states | States by two-letter code, name, or id. Places OR together. | Codes, names, or ids, one or more |
counties | Counties by name or id (Utah County). | Names or ids, one or more |
cities | Cities by name or id (Provo). | Names or ids, one or more |
bbox | A map box west,south,east,north in degrees. | west,south,east,north |
workTypes | Work type tags. See GET /permits/reference?facet=workTypes. | Any of 35 values, listed below |
workGroups | Work type groups (every tag in the group). | Any of new, remodel, systems, exterior, site, planning, unspecified |
constructionTypes | Kind of construction: new building, addition, renovation, site work, infrastructure, demolition only, or not stated. | Any of new_building, addition, renovation, site_work, infrastructure, demolition_only, none, not_stated |
propertyTypes | Building Types (the same names as GET /taxonomy). | Labels from GET /taxonomy, one or more |
propertySubtypes | Building subtypes. | Labels from GET /taxonomy, one or more |
assetClasses | Building classes. | Labels from GET /taxonomy, one or more |
statuses | Permit status. | Any of in_review, active, final, inactive, no_construction |
stages | Where the job is, one step finer than status. Send <status>:<stage> (for example active:issued) or bucket:<status> (for example bucket:final). GET /permits/reference?facet=stages lists the stage words. | Any of 100 values, listed below |
whyNow | Why the permit is worth a call now (Activity signals on the permits map). | Any of 9 values, listed below |
trades | Trades the job involves (from the kind of work, not bids still open). | Any of 26 values, listed below |
sectors | Private or public work. | Any of private, public |
jobKinds | Major and minor jobs (both by default). Add includeRecords=true for record-only entries. | Any of major, minor |
includeRecords | Also return record-only entries (licenses, property records, planning cases filed as permits). | true or false |
valueMin | Lowest declared job value in US dollars. Permits that state no value are left out while a value filter is on. | A number |
valueMax | Highest declared job value in US dollars. Permits that state no value are left out while a value filter is on. | A number |
valueBands | Declared job value bands. Permits that state no value are left out while a value filter is on. | Any of u10k, 10k, 50k, 250k, 1m |
sqftMin | Smallest square footage. | A number |
sqftMax | Largest square footage. | A number |
unitsMin | Fewest dwelling units. | A whole number |
unitsMax | Most dwelling units. | A whole number |
dateField | Which date the date filters use. Defaults to activity. | One of activity, issued, applied. Default activity. |
dateRange | A rolling window. With no date filter, permit routes use the last 12 months (appliedDefaults says so); sync and an alert's matches use any date. all lifts it. The permits map opens on Issued, any date: send dateField=issued&dateRange=all to match it. | One of 7d, 14d, 30d, 90d, 6m, 12m, older, all. Default 12m. |
dateFrom | Earliest date (inclusive). Replaces the default window. | YYYY-MM-DD |
dateTo | Latest date (inclusive). | YYYY-MM-DD |
hasCompanyContact | Only permits with a phone or email for a company on the job. | true or false |
hasAnyContact | Only permits with any phone or email, private individuals included. | true or false |
hasContractor | Only permits that name a contractor. | true or false |
hasInspections | Only permits with at least one inspection that has a result (passed, failed, or completed). | true or false |
detailOnly | Only permits whose full city record was read (not just the list line). | true or false |
placeKey | Every permit at these addresses (placeKey from a record, at most 20). | placeKey from a record, one or more |
permitIds | Exact permit ids (at most 100). On count, the only filter. | permitId values, one or more |
Map labels and API names
The API uses the permits map's filters under names a program can send. Find the menu you use on the map, then send the parameter beside it. The second table lists the filters that have no menu on the map.
| On the permits map | API parameter | What to send |
|---|---|---|
| Search box: a keyword | q | Words in the permit, including the names on it. |
| Search box: a permit number | permitNumber | The exact number. |
| Search box: an exact contractor name | contractor | The whole name, as printed. |
| Search box: a place, or More → Region | states, counties, cities | Names, codes, or ids. |
| Work type | workTypes, workGroups | A tag, or a whole group. |
| Property type | propertyTypes, propertySubtypes, assetClasses | The Building Type labels from GET /taxonomy. |
| Date range: Issued, Applied, or Latest activity | dateField, dateRange, dateFrom, dateTo | The date to filter on, then a preset or a from and to date. |
| Status | statuses | In review, Active, Final, or Inactive. |
| Job value | valueBands, valueMin, valueMax | A band, or your own minimum and maximum. |
| More → Phone or email on the permit: A company | hasCompanyContact | true |
| More → Phone or email on the permit: Anyone | hasAnyContact | true. Counts private individuals, such as homeowners. |
| More → Names a contractor | hasContractor | true |
| More → Construction scope | constructionTypes | New building, addition, renovation, and so on. |
| More → Trades involved | trades | The trades the work involves. |
| More → Units and size | unitsMin, unitsMax, sqftMin, sqftMax | Dwelling units and square feet. |
| More → Major or minor jobs | jobKinds | major, minor, or both. |
| More → Public or private | sectors | private, public, or both. |
| More → Activity signals | whyNow | Why the permit is worth a call now. |
| Sort menu | sort | A sort value. |
| Only in the API | What it does |
|---|---|
contractorKeys | From GET /permits/contractors. |
placeKey | Every permit at one address, from a record. |
permitIds | Exact permits you already hold. |
bbox | The map uses the visible area instead. |
includeRecords | Adds record-only entries. |
stages | A finer step than status. |
hasInspections | Permits with an inspection result. |
detailOnly | Permits whose full city record was read. |
Searching by text
qsearches the words in a permit: its description, the work, the address, the permit number, and the names of people and companies on it. Every word must appear, and a word of 4 or more letters also matches longer words that start with it. Up to 200 characters.permitNumberfinds one permit number exactly as the city prints it.contractortakes the full name of a general contractor, builder, or trade contractor on the permit, such asExample Builders LLC. It matches the whole name, ignoring capital letters and extra spaces; punctuation counts, soExample Builders, LLCis a different name.contractorKeysis the precise way to find a company's permits. Call GET /permits/contractors with your filters, pick the rows you want, and send theircontractorKeyvalues (up to 50).- The API takes one
q. The website's alert form can join several search terms with OR; that cannot be sent over the API yet, so run one search per term.
Allowed values
Generated from the same lists the API checks requests against. GET /permits/reference returns them with their labels; add facet= for one block, for example facet=trades. It is free.
Work types
workGroups takes a whole group; workTypes takes single tags. Sending both finds permits in either.
| workGroups value | Map label | Tags in the group |
|---|---|---|
new | New buildings | new_home, multifamily, adu, manufactured, new_commercial, new_other |
remodel | Additions and remodels | addition, interior_remodel, kitchen_bath, tenant_improvement, accessory, structural_repair, repair |
systems | Building systems | hvac, electrical, solar_battery, generator, plumbing, water_heater, gas, fire_protection, telecom |
exterior | Exterior and outdoor | roofing, windows_doors, siding, pool, fence, signage |
site | Site and demolition | demolition, grading, utilities, driveway_sidewalk, septic_well |
planning | Planning cases | planning |
unspecified | Work not described | unspecified |
| workTypes value | Map label | Group |
|---|---|---|
new_home | New homes | New buildings |
multifamily | Townhomes and multifamily | New buildings |
adu | ADUs | New buildings |
manufactured | Manufactured homes | New buildings |
new_commercial | Commercial and industrial | New buildings |
new_other | Other new buildings | New buildings |
addition | Additions | Additions and remodels |
interior_remodel | Interior remodels | Additions and remodels |
kitchen_bath | Kitchens and baths | Additions and remodels |
tenant_improvement | Tenant improvements | Additions and remodels |
accessory | Garages, decks, and sheds | Additions and remodels |
structural_repair | Structural and fire repair | Additions and remodels |
repair | Other repairs | Additions and remodels |
hvac | HVAC | Building systems |
electrical | Electrical | Building systems |
solar_battery | Solar and batteries | Building systems |
generator | Generators | Building systems |
plumbing | Plumbing | Building systems |
water_heater | Water heaters | Building systems |
gas | Gas lines | Building systems |
fire_protection | Fire sprinklers and alarms | Building systems |
telecom | Low voltage and telecom | Building systems |
roofing | Roofing | Exterior and outdoor |
windows_doors | Windows and doors | Exterior and outdoor |
siding | Siding and exterior trim | Exterior and outdoor |
pool | Pools and spas | Exterior and outdoor |
fence | Fences and walls | Exterior and outdoor |
signage | Signs | Exterior and outdoor |
demolition | Demolition | Site and demolition |
grading | Grading and site work | Site and demolition |
utilities | Utility lines | Site and demolition |
driveway_sidewalk | Driveways, curbs, and sidewalks | Site and demolition |
septic_well | Septic and wells | Site and demolition |
planning | Zoning and land use cases | Planning cases |
unspecified | Permit doesn’t say what the work is | Work not described |
Trades
The trades a job involves, worked out from the kind of work. They are not bids still open.
| trades value | Map label | Group |
|---|---|---|
site_work | Site work | Site and structure |
foundation | Foundation | Site and structure |
paving_concrete | Paving and concrete | Site and structure |
framing | Framing | Site and structure |
roofing | Roofing | Roof and envelope |
windows_doors | Windows and doors | Roof and envelope |
siding_exterior | Siding and exterior | Roof and envelope |
insulation | Insulation | Roof and envelope |
electrical | Electrical | Building systems |
plumbing | Plumbing | Building systems |
hvac | HVAC | Building systems |
gas | Gas | Building systems |
fire_protection | Fire protection | Building systems |
low_voltage | Low voltage | Building systems |
solar | Solar | Building systems |
elevator | Elevator | Building systems |
drywall | Drywall | Interiors and finishes |
flooring | Flooring | Interiors and finishes |
cabinets_countertops | Cabinets and countertops | Interiors and finishes |
finish_carpentry | Finish carpentry | Interiors and finishes |
painting | Painting | Interiors and finishes |
appliances | Appliances | Interiors and finishes |
cleaning | Final cleaning | Interiors and finishes |
landscaping | Landscaping | Outdoor |
fencing | Fencing | Outdoor |
pool | Pool | Outdoor |
Statuses and stages
| statuses value | Map label | Meaning |
|---|---|---|
in_review | In review | Filed and waiting for approval. Contractor awards are not known from this status. |
active | Active | Approved to build, or under way. |
final | Final | Completed: the final inspection passed or the certificate of occupancy was issued. |
inactive | Inactive | Ended without a final: expired, withdrawn, denied, void, or stopped. |
no_construction | No construction | A record with no construction work, such as a planning case, a license, or a property record. |
stages is one step finer than status. Send <status>:<stage>, such as active:issued or active:under_inspection, or bucket:<status> for a whole status, such as bucket:final. The stage words are below.
| Stage word | Map label |
|---|---|
pre_application | Pre-application |
applied | Applied |
in_review | In review |
needs_applicant_action | Needs applicant info |
approved_awaiting_issuance | Approved, not issued |
issued | Issued |
under_inspection | Under construction |
on_hold | On hold |
stop_work | Stop work |
substantially_complete | Nearly complete |
finaled | Completed |
co_issued | Completed |
closed | Closed |
closed_noncompliant | Closed, not passed |
expired | Expired |
withdrawn | Withdrawn |
denied | Denied |
void_revoked | Voided |
unknown | Status unknown |
Activity signals
whyNow is Activity signals on the map: why the permit is worth a call now. expiring_soon and slow_review depend on today's date. Records can also carry expired_open, which shows on the record but is not a filter value.
| whyNow value | Map label |
|---|---|
rough_in_passed | Rough-in passed |
finals_next | Finals next |
issued_no_inspections | Issued, no inspections yet |
last_inspection_failed | Last inspection failed |
on_hold | On hold |
fees_due | Fees due |
expiring_soon | Expiring soon |
slow_review | In review over 60 days |
new_owner | New owner |
Construction types
| constructionTypes value | Map label |
|---|---|
new_building | New building |
addition | Addition |
renovation | Renovation |
site_work | Site work |
infrastructure | Infrastructure |
demolition_only | Demolition only |
none | No construction |
not_stated | Work not stated |
Value bands
Bands of the declared job value. A permit with no stated value is in no band.
| valueBands value | Range |
|---|---|
u10k | Under $10k |
10k | $10k to $50k |
50k | $50k to $250k |
250k | $250k to $1M |
1m | $1M and up |
Dates
| dateField value | Map label |
|---|---|
activity | Latest activity |
issued | Issued |
applied | Applied |
| dateRange value | Window |
|---|---|
7d | Last 7 days |
14d | Last 14 days |
30d | Last 30 days |
90d | Last 90 days |
6m | Last 6 months |
12m | Last 12 months |
older | More than a year ago |
all | Any date |
Job kinds and sectors
| Filter | Value | Map label |
|---|---|---|
jobKinds | major | Major jobs |
jobKinds | minor | Minor jobs |
sectors | private | Private |
sectors | public | Public |
Building Types
propertyTypes, propertySubtypes, and assetClasses take the Building Type labels that planned projects use, listed by GET /taxonomy. GET /permits/reference?facet=buildingTypes lists the ones present in permit data.
Sorts
| sort value | Label | Order |
|---|---|---|
recent | Most recent activity | Newest activity first. The default. |
trades_desc | Most trades involved | Permits that involve the most trades first. |
window_asc | Earliest status first | Permits earliest in their life first: in review, then active, final, and inactive, and within each status the earliest stage first (applied before issued, issued before under construction). |
value_desc | Highest value | Highest declared job value first. |
applied_desc | Newest applications | Newest application date first. |
issued_desc | Recently issued | Newest issue date first. |
activity_asc | Oldest activity first | Oldest latest activity first. |
value_asc | Lowest value | Lowest declared job value first. |
applied_asc | Oldest applications | Oldest application date first. |
issued_asc | Issued longest ago | Oldest issue date first. |
Ready to make a call?
A free Boardwalk trial includes API access, 50 record-export credits (search, CSV, MCP), and 5 Find Contact Info lookups. Counting, taxonomy, location lookups, and the analytics plane cost nothing, so you can evaluate the data before you spend a credit.