Net-new versus updated records
Pull only what you have not seen, and never pay twice for a record that has not changed.
Who this is for
Anyone running Boardwalk on a schedule. The question is always the same: which of these did I already have, and am I paying for them again?
The answer is on every record
Delivery state is not a mode you switch on — it is a block on every record we send you, on the API and in the CSV export alike:
| Field | Meaning |
|---|---|
delivery.alreadyExported | Has this pool received this record before, through any surface? |
delivery.updatedSinceExport | Has it changed since then? null on a record you have never received. |
delivery.lastExportedAt | When you last received it. |
delivery.billed | Whether this delivery charged you for it. |
The scheduled pull
For a mirror you keep in sync, use the sync feed rather than paging search. It walks by cursor in last-updated order, which is what makes it lossless: records that change while you are walking cannot slip past you the way they can with offset paging.
One net-new record and one that changed since you last saw it
curl 'https://api.boardwalkai.com/api/v1/projects/sync?states=UT&representation=compact&limit=2' \
-H 'Authorization: Bearer bwk_live_YOUR_KEY'Response · HTTP 200
{
"data": [
{
"id": 184203,
"recordType": "project",
"projectName": "Alta Ridge Phase II",
"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",
"latitude": 40.6916,
"longitude": -112.0011,
"propertyType": "residential",
"propertyTypeLabel": "Residential",
"status": "approved_with_conditions",
"statusLabel": "Approved with Conditions"
},
{
"id": 191774,
"recordType": "project",
"projectName": "Foothill Commons",
"boardwalkLink": "https://boardwalkai.com/map/#project=191774",
"mergedFrom": [
191774
],
"lastUpdated": "2026-06-24T14:08:03Z",
"meetingDate": "2026-06-23",
"delivery": {
"alreadyExported": true,
"updatedSinceExport": true,
"lastExportedAt": "2026-07-19T02:14:55Z",
"billed": true
},
"address": null,
"city": "Provo",
"county": "Utah",
"state": "UT",
"latitude": 40.2338,
"longitude": -111.6585,
"propertyType": "residential",
"propertyTypeLabel": "Residential",
"status": "continued",
"statusLabel": "Continued"
}
],
"meta": {
"schemaVersion": "2026-08-02",
"representation": "compact",
"limit": 2,
"creditsUsed": 2,
"creditsRemaining": 284,
"delivery": {
"mode": "all",
"notPreviouslyExported": 1,
"previouslyExported": 1,
"updatedSinceExport": 1,
"billed": 2,
"notRebilled": 0,
"ledgerApplied": true
},
"cursor": "eyJ1cGRhdGVkQXQiOiIyMDI2LTA4LTAyVDE0OjA5OjIyWiIsImlkIjoxOTE3NzR9",
"hasMore": 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.
Two records here tell the whole story. The first has never been delivered to you — alreadyExported: false, billed: true. The second you received on 19 July and it has changed since — alreadyExported: true, updatedSinceExport: true, billed: true. A third record that you held and which had not changed would come back with billed: false and cost nothing.
meta.delivery totals it for the page: how many were new to you, how many you had seen, how many changed, how many were billed, and how many were delivered without a charge.
How it scales
| Run | Records returned | Billable | Credits |
|---|---|---|---|
| First full walk of your market | 2,000 | 2,000 | 2,000 |
| Next morning | 2,000 matched, 34 changed or new | 34 | 34 |
| Morning after that, nothing moved | 2,000 matched, 0 changed | 0 | 0 |
This is the shape of a steady-state integration: an expensive first pull and a near-free daily delta. Budget for the first walk, not for the cadence.
What can go wrong
400 invalid_cursor— the cursor was minted for a different filter set or a different entitlement scope. Repeat the request without the cursor; restarting is cheap because records you already hold are not re-billed.sort,order,offsetandpageare refused on the sync feed. A caller-chosen ordering would break the losslessness guarantee while appearing to work, which is the worst way for a guarantee to fail. Use/projects/searchwhen you want your own ordering.
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.