Filter reference
Every parameter the record-returning endpoints accept, with its aliases, values and combination rules.
Generated from the same registry the API validates requests against. Anything listed here is accepted; anything not listed returns 400.
How filters combine
- Values within one parameter are an OR.
states=UT,COmeans Utah or Colorado. - Different parameters are ANDed.
states=UT&assetClasses=Apartment%20Buildingmeans Utah and apartment buildings. propertyTypes,propertySubtypesandassetClassesare OR-joined with each other first, then ANDed with everything else. Selecting a type and an unrelated asset class gives you the union, not the intersection.- A county or city narrows within the states you named rather than adding to them.
An unknown parameter is refused, not ignored
curl 'https://api.boardwalkai.com/api/v1/projects/search?states=UT&estimatedProjectValueMin=1000000' \
-H 'Authorization: Bearer bwk_live_YOUR_KEY'Response · HTTP 400
{
"error": {
"code": "invalid_filter",
"message": "1 filter problem. No credits were charged.",
"param": "estimatedProjectValueMin",
"details": {
"problems": [
{
"param": "estimatedProjectValueMin",
"code": "unknown_parameter",
"message": "Unknown parameter \"estimatedProjectValueMin\". Nothing was charged.",
"details": []
}
]
},
"docsUrl": "https://boardwalkai.com/docs/api/errors#invalid_filter",
"requestId": "req_01K1QF3M0000EXAMPLE0001"
}
}The response shape on this page is the one the endpoint builds — the keys, their nesting and their types are asserted against the shipping code by a test. The numbers inside it are the scenario being walked through, not a measurement of the corpus.
Defaults that are applied for you
Two defaults change what a bare query returns, and both are disclosed in the response so you can assert on them rather than remember them:
| Default | Effect | Opt out |
|---|---|---|
dateRange=last_1_year | A request with no date filter searches the last 12 months of meetings — the same window the web product shows. Reported in meta.appliedDefaults and as a default_date_window_applied warning. | dateRange=all |
includeCivic=false | Civic and government-owned projects are excluded by default, matching the product. | includeCivic=true |
sort=meetingDate, order=desc | Newest meeting evidence first. | Pass your own sort and order. |
The receipt
Every filtered response carries meta.appliedFilters — what actually ran after normalisation and name resolution — plus meta.appliedDefaults and meta.resolvedFrom. If you ever need to prove the API searched what you meant, diff those against what you sent.
Every filter
| Parameter | Type | Also accepted as | Description | Accepted values |
|---|---|---|---|---|
states | string (list) | state, stateId, stateIds | States, as numeric ids, USPS abbreviations ("UT") or full names ("Utah"). A list is an OR: pass every state you want. | From /api/v1/locations/states (free) |
counties | string (list) | county, countyId, countyIds | Counties, as numeric ids or names (a trailing "County" is optional). A name is resolved against a single states value when one is given. | From /api/v1/locations/states/{stateId}/counties (free) |
cities | string (list) | city, cityId, cityIds | Cities, as numeric ids or names. A name is resolved against a single states/counties value when one is given; an ambiguous name is an error, never a silently wider search. | From /api/v1/locations/states/{stateId}/counties/{countyId}/cities (free) |
bbox | object | bounds | Rectangle {north, south, east, west}. Records are returned only when their coordinates fall inside the rectangle — the engine prefilters with a circle and the corners of that circle are then removed. | — |
circle | object | — | Radius search {lat, lng, radiusMeters}. radiusMeters is 100–500000. | — |
polygon | geojson_ring | — | GeoJSON linear ring [[lng, lat], …], 4–1000 vertices, first vertex equal to last. The engine prefilters with the ring's bounding circle and exact point-in-polygon runs afterwards. | — |
propertyTypes | string (list) | type, types, propertyType | Top-level land-use classification, e.g. "Residential". Case-insensitive. | From /api/v1/taxonomy (free) |
propertySubtypes | string (list) | subtype, subtypes, propertySubtype | Second-level classification. Also accepts "Type - Subtype" compounds, which are split server-side. | From /api/v1/taxonomy (free) |
assetClasses | string (list) | assetClass, assetClasses[] | Third-level classification, e.g. "Apartment Building". | From /api/v1/taxonomy (free) |
excludePropertySubtypes | string (list) | excludeSubtype, excludeSubtypes | Second-level classifications to exclude. Applied after the taxonomy OR, as AND-NOT. | From /api/v1/taxonomy (free) |
excludeAssetClasses | string (list) | excludeAssetClass | Third-level classifications to exclude. | From /api/v1/taxonomy (free) |
taxonomyMatchMode | string | — | Whether a classification must be the project's primary one. Defaults to primary_or_secondary when assetClasses is set, primary_only otherwise — the product's own rule. | primary_only, primary_or_secondary, any |
status | string (list) | statuses, statusSelection | Where the project stands. Accepts the machine token or the human label ("approved" or "Approved"). "unknown" selects records with no decision recorded. | pending, approved, denied, recommended_for_approval, recommended_for_denial, continued, referred, withdrawn, unknown |
decisionBodies | string (list) | decisionBody | The body that heard the request, normalised to its short name ("Salt Lake City Council" → "City Council"). Matching is exact against that short name, never a substring. | Planning & Development Services, Planning and Development Services, Community Development Department, Community Development Division, Development Services Department, Municipal Planning Authority, Historic Preservation, Redevelopment Agency, Reinvestment Agency, Building Commission, Building Authority, Planning Department, Planning Division, Planning Commission, Planning Director, Local Planning Body, Parks & Recreation, Board of Adjustment, Board of Appeals, Township Council, Development Services, County Council, City Council, City Staff, Town Council, Council, Commission, Mayor, Staff, other_bodies, unknown_status |
statusCombos | string (list) | statusCombo | "<body>|<status>" pairs, e.g. "City Council|approved". This is what the retired CC…/PC… buckets decompose into, and it is strictly more expressive. | — |
requestTypes | string (list) | requestType, applicationTypes, askType, askTypes | What the applicant asked the jurisdiction for, e.g. "rezone". | conditional_use_permit, rezone, annexation, preliminary_plat, site_plan_approval, general_plan_amendment, development_agreement, subdivision_plat, variance, planned_unit_development, design_review |
decisionTypes | string (list) | decisionType | The kind of action recorded on the project. | — |
constructionTypes | string (list) | constructionType | What kind of construction the filing describes. | new_building, renovation, site_work, infrastructure, demolition_only |
constructionMagnitudes | string (list) | constructionMagnitude | How large the construction is. | major, standard, minor, negligible |
constructionLeadOnly | boolean | — | true keeps only records the pipeline marked as real construction leads. | — |
hasConstructionIntel | boolean | — | Whether construction intelligence was extracted for this record. | — |
ownerTypes | string (list) | ownerType | Who the owner is, e.g. private or public. A list is an OR. | From /api/v1/reference/owner-types (free) |
includeCivic | boolean | showAllRecords | Include non-real-estate government decisions. Defaults to false, which is what the product shows — and which reduces what a naive query bills for. | — |
civicSubtypes | string (list) | — | Narrows the civic side only. Requires includeCivic=true. | — |
civicAssetClasses | string (list) | — | Narrows the civic side only. Requires includeCivic=true. | — |
meetingDateFrom | date | dateFrom | Earliest meeting date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named. | — |
meetingDateTo | date | dateTo | Latest meeting date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named. | — |
createdAtFrom | date | createdFrom | Earliest first-seen date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named. | — |
createdAtTo | date | createdTo | Latest first-seen date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named. | — |
lastUpdatedFrom | date | updatedFrom, updatedAtFrom, updatedSince | Earliest last-updated date. On GET /projects/sync this seeds the first cursor and is then carried inside it, so it does not need re-sending on later pages. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named. | — |
lastUpdatedTo | date | updatedTo, updatedAtTo | Latest last-updated date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named. | — |
dateRange | string | — | A relative meeting-date window. Defaults to last_1_year, matching what the product shows. Pass dateRange=all to search the whole corpus. | last_1_month, last_3_months, last_6_months, last_1_year, since_jan_2025, all |
totalUnitCountMin | number · count | unitCountMin | Lower bound for totalUnitCount, in count. Inclusive. 0 is a real bound, not "unset". | — |
totalUnitCountMax | number · count | unitCountMax | Upper bound for totalUnitCount, in count. Inclusive. 0 is a real bound, not "unset". | — |
acreageMin | number · acres | — | Lower bound for acreage, in acres. Inclusive. 0 is a real bound, not "unset". | — |
acreageMax | number · acres | — | Upper bound for acreage, in acres. Inclusive. 0 is a real bound, not "unset". | — |
lotSizeSqftMin | number · sqft | lotSizeMin | Lower bound for lotSizeSqft, in sqft. Inclusive. 0 is a real bound, not "unset". | — |
lotSizeSqftMax | number · sqft | lotSizeMax | Upper bound for lotSizeSqft, in sqft. Inclusive. 0 is a real bound, not "unset". | — |
squareFootageMin | number · sqft | — | Lower bound for squareFootage, in sqft. Inclusive. 0 is a real bound, not "unset". | — |
squareFootageMax | number · sqft | — | Upper bound for squareFootage, in sqft. Inclusive. 0 is a real bound, not "unset". | — |
parkingSpacesMin | number · count | — | Lower bound for parkingSpaces, in count. Inclusive. 0 is a real bound, not "unset". | — |
parkingSpacesMax | number · count | — | Upper bound for parkingSpaces, in count. Inclusive. 0 is a real bound, not "unset". | — |
buildingStoriesMin | number · count | storiesMin | Lower bound for buildingStories, in count. Inclusive. 0 is a real bound, not "unset". | — |
buildingStoriesMax | number · count | storiesMax | Upper bound for buildingStories, in count. Inclusive. 0 is a real bound, not "unset". | — |
buildingHeightFeetMin | number · feet | buildingHeightFtMin | Lower bound for buildingHeightFeet, in feet. Inclusive. 0 is a real bound, not "unset". | — |
buildingHeightFeetMax | number · feet | buildingHeightFtMax | Upper bound for buildingHeightFeet, in feet. Inclusive. 0 is a real bound, not "unset". | — |
bedroomCountMin | number · count | — | Lower bound for bedroomCount, in count. Inclusive. 0 is a real bound, not "unset". | — |
bedroomCountMax | number · count | — | Upper bound for bedroomCount, in count. Inclusive. 0 is a real bound, not "unset". | — |
floorCountMin | number · count | — | Lower bound for floorCount, in count. Inclusive. 0 is a real bound, not "unset". | — |
floorCountMax | number · count | — | Upper bound for floorCount, in count. Inclusive. 0 is a real bound, not "unset". | — |
q | string | search, query | Keyword search. Several words are matched as an exact phrase; pipe-separated groups ("mixed use|apartments") are alternatives. | — |
representation | string | — | Payload depth: compact, standard or full. All cost the same. | — |
include | string | — | Optional work to do before delivering: contacts. | — |
contactOptions | string | — | Enrichment options: minConfidence, maxProjects, cachedOnly, companyOnly. | — |
deliveryMode | string | — | Which delivery states to return. | — |
cursor | string | — | Opaque sync watermark from meta.sync.cursor on GET /projects/sync. Omit it to start a fresh sync — a restart is free for every record you already hold that has not changed. | — |
page | string | — | Page number, 1-based. | — |
limit | string | — | Records per page. | — |
offset | string | — | Record offset. Retained while page-based pagination lands. | — |
format | string | — | json (default) or csv. | — |
sort | string | — | Ordering field. The product's own sort tokens are accepted as aliases. | meetingDate, createdAt, lastUpdated, dataRichness, totalUnitCount, acreage |
order | string | — | asc or desc. | asc, desc |
Ready to make a call?
A free Boardwalk trial includes API access and a sandbox key. Counting, filtering, the location tree and the analytics plane cost nothing, so you can evaluate the data before you spend a credit.