Skip to main content

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,CO means Utah or Colorado.
  • Different parameters are ANDed. states=UT&assetClasses=Apartment%20Building means Utah and apartment buildings.
  • propertyTypes, propertySubtypes and assetClasses are 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

bash
curl 'https://api.boardwalkai.com/api/v1/projects/search?states=UT&estimatedProjectValueMin=1000000' \
  -H 'Authorization: Bearer bwk_live_YOUR_KEY'

Response · HTTP 400

json
{
  "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:

DefaultEffectOpt out
dateRange=last_1_yearA 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=falseCivic and government-owned projects are excluded by default, matching the product.includeCivic=true
sort=meetingDate, order=descNewest 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

ParameterTypeAlso accepted asDescriptionAccepted values
statesstring (list)state, stateId, stateIdsStates, 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)
countiesstring (list)county, countyId, countyIdsCounties, 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)
citiesstring (list)city, cityId, cityIdsCities, 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)
bboxobjectboundsRectangle {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.
circleobjectRadius search {lat, lng, radiusMeters}. radiusMeters is 100–500000.
polygongeojson_ringGeoJSON 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.
propertyTypesstring (list)type, types, propertyTypeTop-level land-use classification, e.g. "Residential". Case-insensitive.From /api/v1/taxonomy (free)
propertySubtypesstring (list)subtype, subtypes, propertySubtypeSecond-level classification. Also accepts "Type - Subtype" compounds, which are split server-side.From /api/v1/taxonomy (free)
assetClassesstring (list)assetClass, assetClasses[]Third-level classification, e.g. "Apartment Building".From /api/v1/taxonomy (free)
excludePropertySubtypesstring (list)excludeSubtype, excludeSubtypesSecond-level classifications to exclude. Applied after the taxonomy OR, as AND-NOT.From /api/v1/taxonomy (free)
excludeAssetClassesstring (list)excludeAssetClassThird-level classifications to exclude.From /api/v1/taxonomy (free)
taxonomyMatchModestringWhether 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
statusstring (list)statuses, statusSelectionWhere 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
decisionBodiesstring (list)decisionBodyThe 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
statusCombosstring (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.
requestTypesstring (list)requestType, applicationTypes, askType, askTypesWhat 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
decisionTypesstring (list)decisionTypeThe kind of action recorded on the project.
constructionTypesstring (list)constructionTypeWhat kind of construction the filing describes.new_building, renovation, site_work, infrastructure, demolition_only
constructionMagnitudesstring (list)constructionMagnitudeHow large the construction is.major, standard, minor, negligible
constructionLeadOnlybooleantrue keeps only records the pipeline marked as real construction leads.
hasConstructionIntelbooleanWhether construction intelligence was extracted for this record.
ownerTypesstring (list)ownerTypeWho the owner is, e.g. private or public. A list is an OR.From /api/v1/reference/owner-types (free)
includeCivicbooleanshowAllRecordsInclude non-real-estate government decisions. Defaults to false, which is what the product shows — and which reduces what a naive query bills for.
civicSubtypesstring (list)Narrows the civic side only. Requires includeCivic=true.
civicAssetClassesstring (list)Narrows the civic side only. Requires includeCivic=true.
meetingDateFromdatedateFromEarliest meeting date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named.
meetingDateTodatedateToLatest meeting date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named.
createdAtFromdatecreatedFromEarliest first-seen date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named.
createdAtTodatecreatedToLatest first-seen date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named.
lastUpdatedFromdateupdatedFrom, updatedAtFrom, updatedSinceEarliest 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.
lastUpdatedTodateupdatedTo, updatedAtToLatest last-updated date. Accepts YYYY, YYYY-MM, YYYY-MM-DD or RFC3339. Inclusive: a "To" bound snaps to the END of the period named.
dateRangestringA 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
totalUnitCountMinnumber · countunitCountMinLower bound for totalUnitCount, in count. Inclusive. 0 is a real bound, not "unset".
totalUnitCountMaxnumber · countunitCountMaxUpper bound for totalUnitCount, in count. Inclusive. 0 is a real bound, not "unset".
acreageMinnumber · acresLower bound for acreage, in acres. Inclusive. 0 is a real bound, not "unset".
acreageMaxnumber · acresUpper bound for acreage, in acres. Inclusive. 0 is a real bound, not "unset".
lotSizeSqftMinnumber · sqftlotSizeMinLower bound for lotSizeSqft, in sqft. Inclusive. 0 is a real bound, not "unset".
lotSizeSqftMaxnumber · sqftlotSizeMaxUpper bound for lotSizeSqft, in sqft. Inclusive. 0 is a real bound, not "unset".
squareFootageMinnumber · sqftLower bound for squareFootage, in sqft. Inclusive. 0 is a real bound, not "unset".
squareFootageMaxnumber · sqftUpper bound for squareFootage, in sqft. Inclusive. 0 is a real bound, not "unset".
parkingSpacesMinnumber · countLower bound for parkingSpaces, in count. Inclusive. 0 is a real bound, not "unset".
parkingSpacesMaxnumber · countUpper bound for parkingSpaces, in count. Inclusive. 0 is a real bound, not "unset".
buildingStoriesMinnumber · countstoriesMinLower bound for buildingStories, in count. Inclusive. 0 is a real bound, not "unset".
buildingStoriesMaxnumber · countstoriesMaxUpper bound for buildingStories, in count. Inclusive. 0 is a real bound, not "unset".
buildingHeightFeetMinnumber · feetbuildingHeightFtMinLower bound for buildingHeightFeet, in feet. Inclusive. 0 is a real bound, not "unset".
buildingHeightFeetMaxnumber · feetbuildingHeightFtMaxUpper bound for buildingHeightFeet, in feet. Inclusive. 0 is a real bound, not "unset".
bedroomCountMinnumber · countLower bound for bedroomCount, in count. Inclusive. 0 is a real bound, not "unset".
bedroomCountMaxnumber · countUpper bound for bedroomCount, in count. Inclusive. 0 is a real bound, not "unset".
floorCountMinnumber · countLower bound for floorCount, in count. Inclusive. 0 is a real bound, not "unset".
floorCountMaxnumber · countUpper bound for floorCount, in count. Inclusive. 0 is a real bound, not "unset".
qstringsearch, queryKeyword search. Several words are matched as an exact phrase; pipe-separated groups ("mixed use|apartments") are alternatives.
representationstringPayload depth: compact, standard or full. All cost the same.
includestringOptional work to do before delivering: contacts.
contactOptionsstringEnrichment options: minConfidence, maxProjects, cachedOnly, companyOnly.
deliveryModestringWhich delivery states to return.
cursorstringOpaque 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.
pagestringPage number, 1-based.
limitstringRecords per page.
offsetstringRecord offset. Retained while page-based pagination lands.
formatstringjson (default) or csv.
sortstringOrdering field. The product's own sort tokens are accepted as aliases.meetingDate, createdAt, lastUpdated, dataRichness, totalUnitCount, acreage
orderstringasc 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.