AI search, asynchronously
Find projects no structured filter can express — "unresolved traffic concerns" — and pay only for confirmed matches.
Who this is for
You are looking for something the taxonomy does not have a field for. "Projects where neighbours raised unresolved traffic concerns" is not a filter and never will be; it is a question about what the minutes say.
How it works
- 1You submit a natural-language query, optionally with structured filters to bound it.
- 2We retrieve candidates and rank them by how well they match.
- 3We read the candidates in ranked order and confirm or reject each one against your query, working through them in batches.
- 4We stop as soon as a batch confirms nothing — matches concentrate at the top of the ranking, so continuing past that point spends time and money to find nothing.
- 5You receive the confirmed matches, and you are charged 1 credit for each one delivered.
Submit
Submit an AI search
curl -X POST 'https://api.boardwalkai.com/api/v1/projects/ai-search/jobs' \
-H 'Authorization: Bearer bwk_live_YOUR_KEY' \
-H 'Idempotency-Key: traffic-concerns-2026-08-02' \
-H 'Content-Type: application/json' \
-d '{
"query": "projects where neighbours raised unresolved traffic concerns",
"stateIds": [
1,
57,
54
],
"limit": 100
}'Response · HTTP 202
{
"requestId": 918442,
"status": "queued",
"pollUrl": "https://api.boardwalkai.com/api/v1/projects/ai-search/jobs/918442",
"meta": {
"creditsReserved": 100,
"limit": 100,
"trialTruncation": null,
"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.
Credits are reserved up front against your requested limit, and settled down to what is actually delivered. The Idempotency-Key matters more here than anywhere else on the surface: a duplicated submit reserves the budget twice, and two identical submits can hold the whole pool while both run. With a key, a retry replays the same job.
Poll
Poll it — and note the charge is smaller than the reservation
curl 'https://api.boardwalkai.com/api/v1/projects/ai-search/jobs/918442' \
-H 'Authorization: Bearer bwk_live_YOUR_KEY'Response · HTTP 200
{
"requestId": 918442,
"status": "completed",
"creditsReserved": 100,
"creditsCharged": 1,
"createdAt": "2026-08-02T14:31:02+00:00",
"startedAt": "2026-08-02T14:31:04+00:00",
"completedAt": "2026-08-02T14:33:47+00:00",
"expiresAt": "2026-08-05T14:33:47+00:00",
"data": [
{
"id": 184203,
"recordType": "project",
"projectName": "Alta Ridge Phase II",
"projectHeadline": "Planning Commission approved 240 apartments with conditions",
"boardwalkLink": "https://boardwalkai.com/map/#project=184203",
"mergedFrom": [
184203,
184987
],
"lastUpdated": "2026-06-18T09:22:41Z",
"meetingDate": "2026-06-17",
"delivery": {
"alreadyExported": false,
"updatedSinceExport": null,
"lastExportedAt": null,
"billed": true
},
"address": "3600 S Constitution Blvd, West Valley City, UT",
"city": "West Valley City",
"county": "Salt Lake",
"state": "UT",
"postalCode": "84119",
"latitude": 40.6916,
"longitude": -112.0011,
"locationPrecision": "address",
"locationPrecisionLabel": "Address",
"isApproximate": false,
"parcelApn": [
"15-27-301-004"
],
"propertyType": "residential",
"propertyTypeLabel": "Residential",
"propertySubtype": "multifamily",
"propertySubtypeLabel": "Multifamily",
"assetClass": "Apartment Building",
"assetClassLabel": "Apartment Building",
"landUses": [
{
"type": "residential",
"typeLabel": "Residential",
"subtype": "multifamily",
"subtypeLabel": "Multifamily",
"assetClass": "Apartment Building",
"assetClassLabel": "Apartment Building",
"matchedOn": []
}
],
"status": "approved_with_conditions",
"statusLabel": "Approved with Conditions",
"statusDetail": "The commission approved the preliminary plat subject to eight conditions.",
"requestType": "final_plat",
"requestTypeLabel": "Final Plat",
"decisionBody": "Planning Commission",
"caseNumbers": [
"PLAT-2026-0142"
],
"acreage": 9.8,
"squareFootage": null,
"unitCount": [
{
"count": 240,
"type": "apartment",
"typeLabel": "Apartment"
}
],
"totalUnitCount": 240,
"bedroomCount": null,
"buildingStories": null,
"floorCount": null,
"buildingHeightFeet": null,
"parkingSpaces": 372,
"existingZoning": "A-1",
"proposedZoning": "RM-16",
"isRezone": true,
"constructionType": "new_building",
"constructionTypeLabel": "New Building",
"ownerType": "private",
"ownerTypeLabel": "Private",
"constructionDescription": "A 240-unit garden-style apartment community on 9.8 acres.",
"developerCompany": "Alta Ridge Development LLC",
"developerCompanyRole": "developer",
"developerCompanyRoleLabel": "Developer",
"contacts": [
{
"name": "Rachel Okafor",
"title": "Director of Development",
"role": "developer",
"roleLabel": "Developer",
"partyClass": "external",
"partyClassLabel": "External Party",
"entityType": "person",
"company": "Alta Ridge Development LLC",
"email": "r.okafor@example.com",
"emailConfidence": "high",
"emailSource": "filing",
"phone": "+1-555-0142",
"phoneConfidence": "high",
"phoneSource": "filing",
"linkedinUrl": null,
"linkedinConfidence": null,
"linkedinSource": null,
"contactProvenance": "filing",
"enrichmentSource": null,
"enrichedAt": null,
"enrichmentStatus": "not_requested",
"contactsWithheldReason": null
}
],
"contactEnrichment": {
"status": "not_requested",
"statusLabel": "Not Requested",
"attemptedAt": null,
"contactsFound": 0,
"source": "registry"
},
"companyEnrichment": [],
"publicOfficials": [
{
"name": "Dana Whitfield",
"title": "Senior Planner",
"role": "city_planner",
"roleLabel": "City Planner",
"partyClass": "government",
"organization": "West Valley City"
}
],
"contactSummary": {
"externalCount": 1,
"governmentCount": 1,
"unclassifiedCount": 0,
"withEmail": 1,
"withPhone": 1,
"withLinkedin": 0,
"enrichedCount": 0,
"lowConfidenceWithheld": 0,
"withheldCount": 0,
"withheldReason": null
},
"keyFacts": [
{
"fact": "240 apartment units across six buildings",
"category": "unit_mix",
"categoryLabel": "Unit Mix"
}
],
"evidence": "Commissioner Reyes moved to approve subject to conditions 1-8.",
"voteSummary": {
"yes": 2,
"no": 1,
"abstain": 0,
"absent": 1,
"total": 4,
"isUnanimous": false,
"meetingDate": "2026-06-17"
},
"aiMatch": {
"score": 10,
"summary": "The minutes record unresolved traffic and circulation concerns raised by nearby residents.",
"channels": [
"semantic",
"keyword"
]
}
}
],
"meta": {
"schemaVersion": "2026-08-13",
"representation": "standard",
"total": 3000,
"limit": 100,
"offset": 0,
"creditsUsed": 1,
"creditsReserved": 100,
"trialTruncation": null,
"parsedQuery": {
"structuredFilters": {
"stateIds": [
1,
57,
54
]
},
"searchKeywords": "traffic concerns neighbours",
"semanticQuery": "projects where neighbours raised unresolved traffic concerns",
"explanation": "Looks for public-comment evidence of unresolved traffic concerns.",
"confidence": 0.92,
"query_type": "evidence_search"
},
"searchMethod": "ai_evidence_verified",
"matchesByProjectId": {
"184203": {
"confirmed": true,
"evidenceWhy": "The minutes record unresolved traffic and circulation concerns raised by nearby residents.",
"evidenceQuotes": [
"Residents raised concerns about traffic, access, and circulation."
],
"retrievalScore": 0.08125,
"channels": [
"semantic",
"keyword"
],
"channelCount": 2
}
},
"lowConfidence": false,
"candidatesRetrieved": 3000,
"candidatesScreened": 2000,
"batchesRun": 2,
"screeningCeiling": 10000,
"screeningCeilingSource": "request_cap",
"batchSizeYields": [
1,
0
],
"stopReason": "unproductive_batch",
"partialReason": null,
"matchCount": 1,
"matchCountIsExact": false,
"reusedVerdictCount": 0,
"verifierErrorCount": 0,
"delivery": {
"mode": "all",
"notPreviouslyExported": 1,
"previouslyExported": 0,
"updatedSinceExport": 0,
"billed": 1,
"notRebilled": 0,
"ledgerApplied": true
},
"requestId": "req_01K1QF3M0000EXAMPLE0001"
},
"stopReason": "unproductive_batch",
"partialReason": null
}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.
Reserved 100, charged 1. This is the normal case, not an exception. The quote you get before an AI search is a ceiling, not a prediction: early stop means most requests confirm far fewer records than the limit they reserved against, and you are refunded the difference.
The ceilings
| Ceiling | Value | What it means for you |
|---|---|---|
| Candidates reviewed | Up to 10,000 per request | A hard stop on how much reading one request can do. Reaching it is reported, not hidden. |
| Confirmed matches returned | Up to 100 per request | The largest result set one AI search can deliver — and, at 1 credit each, its largest possible cost. |
| Per-account daily budget | Enforced, value not published | There is a per-account daily ceiling on screening work. A job may finish partial with partialReason: daily_ai_budget_exhausted; confirmed matches still ship and unused reserved credits are refunded. |
What it costs
| Confirmed matches delivered | Credits |
|---|---|
| 0 | 0 |
| 23 | 23 |
| 100 | 100 |
What can go wrong
402 insufficient_credits— the reservation does not fit in the balance. Lowerlimit, or top up. Nothing was reserved.- A job that ends
partialdelivered real, billed, verified records and stopped early for a stated reason instopReason/partialReason. It is not a failure and the records are yours. - A job that ends
expiredmeans the result was not collected in time. Submit a new search.
Next
Ready to make a call?
A free Boardwalk trial includes API access and a sandbox key. Counting, taxonomy, location lookups and the analytics plane cost nothing, so you can evaluate the data before you spend a credit.