← back to Nationalrealestate
Add Palm Beach FL deed adapter (complements parallel session's Miami-Dade); FL scout findings logged
45f04ac55731f74c173b47a0e39c1b9d4a4e3f25 · 2026-07-26 16:23:49 -0700 · Steve Abrams
Files touched
M src/ingest/parcels/arcgis_sales.tsM src/ingest/parcels/engine.tsM src/jobs/hourly_loop.ts
Diff
commit 45f04ac55731f74c173b47a0e39c1b9d4a4e3f25
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Jul 26 16:23:49 2026 -0700
Add Palm Beach FL deed adapter (complements parallel session's Miami-Dade); FL scout findings logged
---
src/ingest/parcels/arcgis_sales.ts | 9 +++++++++
src/ingest/parcels/engine.ts | 1 +
src/jobs/hourly_loop.ts | 1 +
3 files changed, 11 insertions(+)
diff --git a/src/ingest/parcels/arcgis_sales.ts b/src/ingest/parcels/arcgis_sales.ts
index 595cfe7..b3d1368 100644
--- a/src/ingest/parcels/arcgis_sales.ts
+++ b/src/ingest/parcels/arcgis_sales.ts
@@ -177,6 +177,15 @@ const SOURCES: Record<string, Source> = {
toRecords: (fs) => fs.map(f => { const a = f.attributes; const apn = s(a.PARCEL_NO); if (!apn) return null;
return { fips: '53067', apn, price: anyPrice(a.SALE_PRICE), saleDate: anyDate(a.SALE_DATE) } as Rec; }).filter(Boolean) as Rec[],
},
+ 'palm-beach': {
+ key: 'palm-beach', label: 'Palm Beach County FL', cursorKey: 'palm_beach', geometry: false, orderBy: 'OBJECTID', pageSize: 2000,
+ layer: 'https://services1.arcgis.com/RTiKiFNGzgAobBzy/arcgis/rest/services/ParcelPropertyDetails/FeatureServer/1',
+ where: 'PRICE>0',
+ outFields: 'PARCEL_ID,PRICE,SALE_DATE,SITE_ADDR,CITY,OWNER_NAME1',
+ toRecords: (fs) => fs.map(f => { const a = f.attributes; const apn = s(a.PARCEL_ID); if (!apn) return null;
+ return { fips: '12099', apn, price: anyPrice(a.PRICE), saleDate: anyDate(a.SALE_DATE),
+ address: clean(a.SITE_ADDR), city: clean(a.CITY), grantee: clean(a.OWNER_NAME1) } as Rec; }).filter(Boolean) as Rec[],
+ },
};
async function fetchPage(src: Source, offset: number): Promise<any[]> {
diff --git a/src/ingest/parcels/engine.ts b/src/ingest/parcels/engine.ts
index 2b470f3..db3b2e2 100644
--- a/src/ingest/parcels/engine.ts
+++ b/src/ingest/parcels/engine.ts
@@ -25,6 +25,7 @@ const ADAPTERS: Record<string, () => Promise<{ run: () => Promise<{ upserted: nu
colorado: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('colorado') }; },
maricopa: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('maricopa') }; },
thurston: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('thurston') }; },
+ 'palm-beach': async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('palm-beach') }; },
};
async function main() {
diff --git a/src/jobs/hourly_loop.ts b/src/jobs/hourly_loop.ts
index a9f3b07..e011d74 100644
--- a/src/jobs/hourly_loop.ts
+++ b/src/jobs/hourly_loop.ts
@@ -61,6 +61,7 @@ const JOBS: Job[] = [
{ name: 'deeds-co', script: 'src/ingest/parcels/engine.ts', args: ['colorado'], minIntervalHours: 2, runSources: ['colorado'] },
{ name: 'deeds-maricopa',script:'src/ingest/parcels/engine.ts', args: ['maricopa'], minIntervalHours: 2, runSources: ['maricopa'] },
{ name: 'deeds-thur', script: 'src/ingest/parcels/engine.ts', args: ['thurston'], minIntervalHours: 4, runSources: ['thurston'] },
+ { name: 'deeds-pb', script: 'src/ingest/parcels/engine.ts', args: ['palm-beach'], minIntervalHours: 4, runSources: ['palm_beach'] },
];
/** hours since this job's freshest OK run across its runSources (∞ if never). */
← 896ac96 USRE: collapse topbar into an upper-left hamburger drawer si
·
back to Nationalrealestate
·
chore: v0.3.0 → v0.4.0 (session close — all-data-point filte 5f9ea95 →