The free sandbox
What 100 trial credits buy, which endpoints cost nothing, and the two ways a trial key behaves differently.
Who this is for
You are evaluating. You want to know whether the data is any good before anyone signs anything.
What you get
A free Boardwalk trial includes API access and a balance of 100 trial credits, metered exactly like a paid balance: 1 credit per record delivered. Create your key under Settings → API keys after you sign up. Trial credits do not reset monthly — they are a one-off evaluation budget.
Billable — 1 credit per record delivered
| Method | Path | Cost | Notes |
|---|---|---|---|
| GET | /alerts/{alertId}/matches | 1 credit / record | Records already delivered and unchanged since a scheduled run are re-readable here without a second charge; anything new or changed bills once. |
| POST | /alerts/{alertId}/run | 1 credit / record | A manual run is a real delivery: records new to you or changed since their last delivery bill at the standard rate. Runs are capped per alert per day. |
| GET | /documents/{id} | 1 credit / record | One source document, one credit. |
| POST | /projects/ai-search | 1 credit / record | The same rate as a structured search. You pay for confirmed matches that are new to you or changed since their last delivery; rejected candidates and unchanged re-deliveries are free. |
| POST | /projects/ai-search/jobs | 1 credit / record | Credits are reserved up front against the requested limit and settled down to confirmed records that are new to you or changed since their last delivery. Unused reservation, including unchanged re-deliveries, is refunded. |
| GET | /projects/search | 1 credit / record | JSON pages: charged for records actually delivered after collapse, with unchanged re-delivery free. Zero results cost nothing. format=csv does not use this search charge — it reserves product export credits (1 per core CSV row) and returns HTTP 202 with poll/download URLs. |
| GET | /projects/sync | 1 credit / record | Only records that are new to you, or that changed since you last received them, are billable. A sync page that returns nothing but unchanged records is free. |
| GET | /projects/{id} | 1 credit / record | One credit when the record is new to you or changed since your last delivery; an unchanged re-read is free, just like the same record inside a search page. |
Free — 0 credits
| Method | Path | Cost | Notes |
|---|---|---|---|
| GET | /account/credits | Free | Free. Your balance, your plan and your rate limit. |
| GET | /alerts | Free | Free. Configuring alerts never costs credits; only delivered records do. |
| POST | /alerts | Free | Free. |
| GET | /alerts/{alertId} | Free | Free. |
| PATCH | /alerts/{alertId} | Free | Free. |
| DELETE | /alerts/{alertId} | Free | Free. |
| GET | /alerts/{alertId}/deliveries | Free | Free. The delivery history and what each run charged. |
| GET | /alerts/{alertId}/deliveries/{deliveryId} | Free | Free. |
| POST | /alerts/{alertId}/dismissals/{projectId} | Free | Free. Dismissing a match stops it being re-offered. |
| DELETE | /alerts/{alertId}/dismissals/{projectId} | Free | Free. |
| POST, GET | /alerts/{alertId}/preview | Free | Free. Preview returns how many records a rule would deliver and what that would cost, not the records themselves. |
| POST | /analytics/aggregate | Free | Free. POST only (GET returns 404/405). Returns counts and group keys, never a project id, name, address, contact or document. |
| GET | /analytics/datasets | Free | Free. GET only. What the analytics plane can and cannot answer, self-described. |
| POST | /analytics/rankings | Free | Free. POST only (GET returns 405). Same small-group suppression floor as /aggregate. |
| GET | /exports | Free | Free. Lists export jobs for your team (including jobs queued with format=csv on search). Credits were reserved when the job was created. |
| GET | /exports/{id} | Free | Free. Poll job status until ready. |
| GET | /exports/{id}/download | Free | Free re-download of a ready product-core CSV. Creating the job reserved export credits (1 per row) when you queued it. |
| GET | /health | Free | Free and unauthenticated. |
| GET | /locations/cities/{id} | Free | Free. |
| GET | /locations/counties/{id} | Free | Free. |
| GET | /locations/states | Free | Free. Resolve the ids you filter with. |
| GET | /locations/states/{id} | Free | Free. |
| GET | /locations/states/{id}/counties | Free | Free. |
| GET | /locations/states/{stateId}/counties/{countyId}/cities | Free | Free. |
| GET | /projects/ai-search/jobs/{id} | Free | Polling is free. The records the job delivers were charged when the job settled, not when you read them. |
| GET | /projects/count | Free | Free, always, including when your balance is zero. This is the endpoint that tells you what a query would cost before you buy it. |
| GET | /reference/decision-bodies | Free | Free. Canonical values accepted by the decisionBodies filter. |
| GET | /reference/owner-types | Free | Free. Owner-type values accepted by ownerTypes filters. |
| GET | /reference/request-types | Free | Free. Canonical values accepted by the requestTypes filter. |
| GET | /reference/statuses | Free | Free. Canonical status filter tokens plus display aliases (e.g. scheduled). |
| GET | /taxonomy | Free | Free. The complete land use taxonomy tree. |
| GET | /taxonomy/action-categories | Free | Free. |
| GET | /taxonomy/action-types | Free | Free. |
| GET | /taxonomy/asset-classes | Free | Free. |
| GET | /taxonomy/project-types | Free | Free. |
| GET | /taxonomy/subtypes | Free | Free. |
Evaluate without spending
The whole planning surface is free, on a trial key and a paid key alike. You can establish coverage, vocabulary and result sizes for your market before spending a single credit:
GET /locations/*— is your market covered, and what are its ids?GET /taxonomy/*— what vocabulary do we use for the thing you care about?GET /projects/count— how many records match your real query, and what would they cost?POST /analytics/aggregate— what does the shape of the market look like, without buying any records at all?
Narrow the query until it becomes affordable
curl 'https://api.boardwalkai.com/api/v1/projects/count?states=UT&assetClasses=Apartment%20Building&meetingDateFrom=2026-05-01&totalUnitCountMin=50' \
-H 'Authorization: Bearer bwk_live_YOUR_KEY'Response · HTTP 200
{
"data": {
"matchCount": 250,
"matchCountIsExact": true,
"matchCountBasis": "enumerated",
"countedAs": "distinct_projects",
"collapseApplied": true,
"duplicatesCollapsed": 0,
"scanCeiling": 10000,
"billable": {
"records": 250,
"credits": 250,
"creditRate": 1,
"isUpperBound": true,
"nonBillable": {
"alreadyDeliveredUnchanged": 0,
"ledgerApplied": true
}
},
"affordability": {
"affordable": true,
"blockReason": null,
"shortfallCredits": 0,
"maxAffordableRecords": 500,
"boundBy": "period_balance",
"unlimited": false
},
"ordering": {
"sort": "meetingDate",
"order": "desc",
"tiebreak": null,
"meaning": "Most recent meeting evidence first — the date of the meeting the record was extracted from, not when Boardwalk ingested it and not when the project was created."
},
"truncation": {
"policy": "refuse",
"wouldTruncate": false,
"deliverableRecords": null,
"explanation": "A metered request for this filter set fits inside the remaining balance, so it would deliver every matching record."
}
},
"meta": {
"schemaVersion": "2026-08-13",
"representation": "standard",
"deliveryMode": "all",
"credits": {
"limit": 500,
"used": 0,
"remaining": 500,
"charged": 0,
"periodStart": "2026-08-01",
"periodEnd": "2026-08-31",
"isTeamPool": true
},
"appliedFilters": {
"states": [
1
],
"assetClasses": [
"Apartment Building"
],
"meetingDateFrom": "2026-05-01T00:00:00+00:00",
"totalUnitCountMin": 50
},
"appliedDefaults": [],
"resolvedFrom": {
"states": [
{
"input": "UT",
"id": 1
}
]
},
"warnings": []
},
"links": {
"self": "https://api.boardwalkai.com/api/v1/projects/count?states=UT&assetClasses=Apartment%20Building&meetingDateFrom=2026-05-01&totalUnitCountMin=50",
"search": "https://api.boardwalkai.com/api/v1/projects/search?states=UT&assetClasses=Apartment%20Building&meetingDateFrom=2026-05-01&totalUnitCountMin=50",
"docs": "https://boardwalkai.com/docs/api/budgets/"
}
}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.
That call cost nothing and told you the query matches 250 records. Now you know exactly what 100 trial credits will and will not cover.
The two differences you need to know about
The second difference is contact data. On a trial key, external parties' contact channels — email, phone, LinkedIn — are withheld, and the record says so rather than pretending the filing had none:
The same record on a free-trial key
curl 'https://api.boardwalkai.com/api/v1/projects/search?states=UT&limit=1' \
-H 'Authorization: Bearer bwk_live_YOUR_KEY'Response · HTTP 200
{
"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": null,
"emailConfidence": null,
"emailSource": null,
"phone": null,
"phoneConfidence": null,
"phoneSource": null,
"linkedinUrl": null,
"linkedinConfidence": null,
"linkedinSource": null,
"contactProvenance": null,
"enrichmentSource": null,
"enrichedAt": null,
"enrichmentStatus": "not_requested",
"contactsWithheldReason": "free_tier"
}
],
"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": 0,
"withPhone": 0,
"withLinkedin": 0,
"enrichedCount": 0,
"lowConfidenceWithheld": 0,
"withheldCount": 1,
"withheldReason": "free_tier"
},
"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-13",
"representation": "standard",
"total": 1,
"pageCount": 1,
"hasMore": true,
"limit": 1,
"offset": 0,
"creditsUsed": 1,
"creditsRemaining": 99,
"trialTruncation": null,
"searchMethod": "redisearch",
"appliedFilters": {
"states": [
1
]
},
"appliedDefaults": [
"dateRange=last_1_year"
],
"resolvedFrom": {
"states": [
{
"input": "UT",
"id": 1
}
]
},
"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": null,
"matchCountIsExact": false,
"matchCountBasis": "not_computed",
"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.
Look at contactSummary.withheldCount and withheldReason, and at contactsWithheldReason on the party itself. The names, titles, roles and companies are all there — enough to judge whether the contact data is worth paying for, which is the point of an evaluation. Government staff contact details are never returned on any tier, trial or paid.
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.