Skip to main content

AI search, asynchronously

Find projects no structured filter can express — "unresolved traffic concerns" — and pay only for confirmed matches.

Lead generation and business developmentAI-native analysts and MCP clients

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

  1. 1You submit a natural-language query, optionally with structured filters to bound it.
  2. 2We retrieve candidates and rank them by how well they match.
  3. 3We read the candidates in ranked order and confirm or reject each one against your query, working through them in batches.
  4. 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.
  5. 5You receive the confirmed matches, and you are charged 1 credit for each one delivered.

Submit

Submit an AI search

bash
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",
    "states": [
        "UT",
        "CO",
        "AZ"
    ],
    "limit": 100
}'

Response · HTTP 202

json
{
  "requestId": 918442,
  "status": "pending",
  "pollUrl": "/api/v1/projects/ai-search/jobs/918442",
  "meta": {
    "creditsReserved": 100,
    "limit": 100,
    "trialTruncation": 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.

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

bash
curl 'https://api.boardwalkai.com/api/v1/projects/ai-search/jobs/918442' \
  -H 'Authorization: Bearer bwk_live_YOUR_KEY'

Response · HTTP 200

json
{
  "requestId": 918442,
  "status": "completed",
  "creditsReserved": 100,
  "creditsCharged": 23,
  "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-09T14: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
      ],
      "createdAt": "2026-05-04T00:00:00Z",
      "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",
      "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,
      "unitCount": [
        {
          "count": 240,
          "type": "apartment",
          "typeLabel": "Apartment"
        }
      ],
      "totalUnitCount": 240,
      "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"
      },
      "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"
      }
    }
  ],
  "meta": {
    "schemaVersion": "2026-08-02",
    "representation": "standard",
    "creditsUsed": 23,
    "candidatesReviewed": 3000,
    "confirmedMatches": 23
  },
  "stopReason": null,
  "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 23. 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.

Credit costFree — 0 creditsPolling is free. The records the job delivers were charged when the job settled, not when you read them.

The ceilings

CeilingValueWhat it means for you
Candidates reviewedUp to 10,000 per requestA hard stop on how much reading one request can do. Reaching it is reported, not hidden.
Confirmed matches returnedUp to 1,000 per requestThe largest result set one AI search can deliver — and, at 1 credit each, its largest possible cost.
Per-account daily budgetEnforced, value not publishedThere is a per-account daily ceiling on AI-search work. We have not measured the right number yet, so we are not publishing one. When you hit it you get a clear error rather than a silent truncation.

What it costs

Credit cost1 credit per record deliveredCredits are reserved up front against the requested limit and settled down to the number of confirmed records actually delivered.
Confirmed matches deliveredCredits
00
2323
100100
1,0001,000

What can go wrong

  • 402 insufficient_credits — the reservation does not fit in the balance. Lower limit, or top up. Nothing was reserved.
  • A job that ends partial delivered real, billed, verified records and stopped early for a stated reason in stopReason. It is not a failure and the records are yours.
  • A job that ends expired means 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, filtering, the location tree and the analytics plane cost nothing, so you can evaluate the data before you spend a credit.