Skip to main content

Why a field can be empty

What Boardwalk guarantees about the values it returns, what it will not guess, and the one place filtering does not yet match that standard.

Boardwalk reads meeting minutes and agendas, and those documents are not uniform. One city's planning commission minutes state the acreage, the unit count and the zoning designation; the next city's record the motion and nothing else. So any extracted attribute can be absent on any given record.

We could fill those gaps. We do not, and this is the reason: the failure mode of a guess is not a slightly wrong number, it is "1,500 acres" for a 1,500 square-foot building, sitting in your CRM, in front of a client. An empty field is something you can handle. A confident wrong one is not.

What it looks like

A record we could not fully establish

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

Response · HTTP 200

json
{
  "data": [
    {
      "id": 191774,
      "recordType": "project",
      "projectName": "Foothill Commons",
      "projectHeadline": "Concept plan continued to a future meeting",
      "boardwalkLink": "https://boardwalkai.com/map/#project=191774",
      "mergedFrom": [
        191774
      ],
      "createdAt": "2026-06-02T00:00:00Z",
      "lastUpdated": "2026-06-24T14:08:03Z",
      "meetingDate": "2026-06-23",
      "delivery": {
        "alreadyExported": false,
        "updatedSinceExport": null,
        "lastExportedAt": null,
        "billed": true
      },
      "address": null,
      "city": "Provo",
      "county": "Utah",
      "state": "UT",
      "postalCode": "84606",
      "latitude": 40.2338,
      "longitude": -111.6585,
      "locationPrecision": "city_centroid",
      "locationPrecisionLabel": "City Centroid",
      "isApproximate": true,
      "parcelApn": [],
      "propertyType": "residential",
      "propertyTypeLabel": "Residential",
      "propertySubtype": "multifamily",
      "propertySubtypeLabel": "Multifamily",
      "assetClass": null,
      "assetClassLabel": null,
      "status": "continued",
      "statusLabel": "Continued",
      "statusDetail": "The item was continued; no decision was recorded.",
      "requestType": "concept_plan",
      "requestTypeLabel": "Concept Plan",
      "decisionBody": "Planning Commission",
      "caseNumbers": [],
      "acreage": null,
      "unitCount": [],
      "totalUnitCount": null,
      "existingZoning": null,
      "proposedZoning": null,
      "isRezone": null,
      "constructionType": null,
      "constructionTypeLabel": null,
      "ownerType": null,
      "ownerTypeLabel": null,
      "constructionDescription": null,
      "developerCompany": null,
      "developerCompanyRole": null,
      "developerCompanyRoleLabel": null,
      "contacts": [],
      "contactEnrichment": {
        "status": "not_requested",
        "statusLabel": "Not Requested",
        "attemptedAt": null,
        "contactsFound": 0,
        "source": "registry"
      },
      "publicOfficials": [],
      "contactSummary": {
        "externalCount": 0,
        "governmentCount": 0,
        "unclassifiedCount": 0,
        "withEmail": 0,
        "withPhone": 0,
        "withLinkedin": 0,
        "enrichedCount": 0,
        "lowConfidenceWithheld": 0,
        "withheldCount": 0,
        "withheldReason": null
      },
      "keyFacts": [],
      "evidence": "The chair continued the item to a date uncertain.",
      "voteSummary": null
    }
  ],
  "meta": {
    "schemaVersion": "2026-08-02",
    "representation": "standard",
    "total": 1,
    "limit": 1,
    "offset": 0,
    "creditsUsed": 1,
    "creditsRemaining": 294,
    "trialTruncation": null,
    "searchMethod": "redisearch",
    "appliedFilters": {
      "states": [
        44
      ],
      "cities": [
        31955
      ]
    },
    "appliedDefaults": [
      "dateRange=last_1_year"
    ],
    "resolvedFrom": {
      "states": {
        "UT": 44
      },
      "cities": {
        "Provo": 31955
      }
    },
    "warnings": [
      {
        "code": "default_date_window_applied",
        "message": "No date filter was given, so the last 12 months of meetings were searched — the same window the product shows. Pass dateRange=all to search everything.",
        "params": [
          "meetingDateFrom"
        ]
      }
    ],
    "matchCount": 61,
    "matchCountIsExact": true,
    "duplicatesCollapsed": 0,
    "collapseApplied": true,
    "delivery": {
      "mode": "all",
      "notPreviouslyExported": 1,
      "previouslyExported": 0,
      "updatedSinceExport": 0,
      "billed": 1,
      "notRebilled": 0,
      "ledgerApplied": true
    }
  }
}

Record bodies on this page were produced by running Boardwalk's production response mapper over a documented sample project, so the field set, the labels and the empty fields are exactly what the API emits. The project itself is a sample, not a real filing.

assetClass: null and acreage: null on a record that has a property type, a subtype, a city, a decision body and a status. Nothing failed. The minutes said what they said.

What you will notice

You will seeBecause
Some records look emptier than the same project does on the Boardwalk mapThe API holds every served value to the current standard. Older values are not shown.
A record matched a filter on an attribute the response returns as nullFiltering and output are held to different standards today. See below — this is the one gap we are asking you to work around.

The gap, stated plainly

Three things follow, and we would rather you knew all three:

  • You will not miss records because of this. The effect makes a filtered result set broader, not narrower.
  • You may receive some you did not want, and you paid a credit for each. If that matters to you, filter your side on the returned attribute as well: a record with assetClass: null after you filtered on assetClass is one we could not confirm.
  • The response tells you when this applies. A filter_evidence_unconfirmed warning in meta.warnings names the parameters affected, so an integration can assert on it rather than remembering this page.

We are migrating the index so that filtering is held to the same standard as output. When that lands, a record with no confirmed value for an attribute will stop matching a filter on it, result sets for those filters will get smaller, and this notice will be removed. It is a change to *which records come back, not to their shape — no field is removed, no type changes, no enum narrows — so nothing will break at your parsing layer. We treat it as a correctness change; the versioning policy says so in advance.

What this is not

  • It is not a coverage statement. Whether we cover your market at all is a different question.
  • It is not a completeness percentage. We do not publish a fill rate per attribute, because we have not measured one we would stand behind.

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.