[object Object]

← 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

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 →