Playbook · View 01 Location Intelligence Internal · Admin Pipeline OK

Location Intelligence

Every Google Maps Platform signal for 8630 N Green Hills Road fused with the property's classification, tagging, and incumbent-use history — to generate the full building & land use-case universe, score it against the proximity business census, traffic, and demographics, and rank the optimum uses, tenants, and buyers ready for campaign testing.

WF SCORE 84OFFICE · CLASS A10,500 SF · 1 STORYB3-3 ZONING1.29 ACBUILT 2020PKG 4.0/1,000APN 19-3.0-08-200-001-003.00039.2511, −94.6316
Run ID
LI-1616772-0714
2026-07-14 · 06:42 CT
Study Radius
0.5 / 1 / 3 mi
rings · 4,828 m outer
POIs Harvested
31 mapped
Places API (New) · 9 categories
Use Cases Generated
25 scored
from tags · zoning · history
GMP APIs Called
14 endpoints
console in §10
Optimum Use
Prof. Services
LUS — · Tier A
idle · baseline loaded last run · LI-1616772-0714 · 10.2s · 31 rows
top LUS across runs§08 TB blend stays pinned to promoted run lus-1.0 · r1 until a newer run is promoted
RunCompletedPOIsOptimum useTop LUSΔ vs prevDurationArtifacts
Live wiring — what this console mocks
In production the Run button invokes a Supabase Edge Function li-run that executes the §10 calls server-side and streams NDJSON events over SSE while inserts land in li_pois / li_use_case_scores and fan out on Realtime channel li:1616772. The page subscribes to both: SSE paints this stream, Realtime patches the map, census, and rankings — the same DOM updates this mock performs. Automations are the identical function on a pg_cron schedule or fired by webhooks (listing status change, Clay enrichment complete, Apify scrape landed). Full event schema → §10 · DATA-04.
§ 01

Map Command Center

Maps JS · Places (New) · Street View · Tiles 3D · Routes

The property pinned at 39.2511, −94.6316 with the full proximity census plotted and filterable. Modes swap Google map renderers: Roadmap → Satellite → 3D Tiles → Traffic → Demand Heat. Every marker is a live Places record; the rail on the right is the synced result set. Frontage imagery below is pulled per-heading from the Street View Static API.

0.5 mi1.0 mi3.0 mi photorealistic 3D tile · lod 4 8630 N GREEN HILLS RD SUBJECT · 10,500 SF · B3-3 I-29 / US-71 MO-152 HWY N GREEN HILLS RD NW BARRY RD N AMBASSADOR TIFFANY SPRINGS GREEN HILLS PARK ZONA ROSA →
Legend · Places categories
mock renderer · schema = Maps JS API vector map · © Google when live
heading=235° fov=80SW frontage
heading=000° pitch=0N approach
heading=090° fov=90E signage line
heading=180° lot=SES parking field
Renderer contract
This static build draws the basemap as inline SVG so the view works with zero keys. In production the stage swaps to the Maps JavaScript API vector map (mapId: WF_LI_DARK) with the identical marker, ring, traffic, and heat layers — request bodies in §10 API Console. Filters, modes, and the rail already speak the live data contract.
§ 02

Classification, Tags & Building History

inputs → use-case generator

The generator's raw inputs: the property's classification and metadata, its tag set, and the incumbent-use history (Doc 20). Every use case in §03 is derived from these fields plus the zoning schedule — nothing is hand-picked.

classification.metadatasource: property record · Doc 01
Asset Class
Office · Class A · single-tenant configuration
Structure
10,500 SF · 1 story · built 2020 · ADA, no elevator
Site
1.29 AC · APN 19-3.0-08-200-001-003.000 · Platte County
Zoning
B3-3 — office, medical, professional services as-of-right
Parking
~4.00 / 1,000 SF surface · exceeds 3.5 medical minimum
Coordinates
39.2511, −94.6316 · geohash 9yuw6
Corridor
Tiffany Springs / Coves North · MO-152 × N Green Hills interchange · I-29 immediate · KCI 15–30 min · Zona Rosa 2 mi
Tags
owner-occupant professional medical-ready interchange class-a for-sale single-story turnkey
building.historysource: Doc 20 · incumbent use
PeriodUser / EventSignal for next use
2019–20Ground-up development · Class-A shell + high-end interiorModern HVAC / electrical / finishes — low day-one capex
2020–26Real estate & title services · 100% occupancy, high client trafficProven high-throughput, client-facing site; reception + private offices + conference
2026Listed for sale · owner-occupant or investorTurnkey inheritance: prof. services = low convert · medical = low–mod (add plumbing) · 3–4 suite demise = moderate
Previous-user inference: incumbent fit-out is the strongest prior. Uses inheriting reception / private-room / conference infrastructure score a buildout bonus inside ZB (§04); uses demanding demolition (retail showroom, assembly) carry a conversion discount.
§ 03

Use-Case Universe

25 generated · zoning-gated

The comprehensive candidate list generated from §02 inputs crossed with the B3-3 schedule of uses. Grouped by entitlement path: as-of-right, conditional (CUP required), and conversion (repositioning risk). Chips show the three hard gates — zoning, buildout inheritance, parking. Click any card to isolate its evidence layer on the §01 map.

Generator recipe
tags ∪ zoning_schedule(B3-3) ∪ incumbent_adjacency(Doc 20) ∪ demand_categories(Doc 03/10) → dedupe → gate by entitlement → 25 candidates. The universe is intentionally wider than the 4 headline segments in Doc 21; §05 scoring is what compresses it back down.
§ 04

The LUS Scoring Model

Location-Use Score · v1.0 · deterministic

Every candidate is scored 0–100 by the Location-Use Score — eight weighted components computed from the §06 census, §07 demographics & traffic, and the §02 gates, then multiplied by an entitlement gate. All weights ship in scoring_config.json (§10) so runs are reproducible.

LUS = G × Σ ( wᵢ · sᵢ )   i ∈ {DG, DF, TV, CS, CP, ZB, PA, CM} · sᵢ ∈ [0,100] · Σwᵢ = 1.00
G — entitlement gate: as-of-right 1.00 · conditional (CUP) 0.85 · conversion / repositioning 0.80 · assembly-class conditional 0.75 · zoning unverified / likely not permitted 0.62
component weightsscoring_config.json · v1.0
Demand Gap DG · unmet category demand in trade area
22%
Zoning & Buildout Fit ZB · entitlement + incumbent inheritance
15%
Demographic Fit DF · income · age · growth vs category ideal
15%
Traffic & Visibility TV · AADT frontage + secondary + sightline
12%
Co-Tenancy Synergy CS · complementary POIs ≤ 0.5 mi
12%
Competition Saturation CP · inverse of direct rivals ≤ 2 mi
12%
Parking & Access PA · ratio have ÷ need · ADA
6%
Corridor Momentum CM · dev sites · KCI · jobs · comp premium
6%
component formulasinputs cited to §06–§07
DG = 100 · clamp(1 − ρ/ρbench, 0, 1) · Didx  ρ = rivals(3mi) ÷ pop(3mi)/10k · ρbench = KC metro density · Didx = category demand index (Doc 03) DF = 25·m(HHI) + 25·m(age) + 25·m(pop≥45k) + 25·m(growth≥2%)  m() = band match vs category ideal, §07 TV = 0.5·Vfront + 0.3·Vsec + 0.2·Vis  V = 100·min(AADT/AADTref,1) · GreenHills/12k · Barry/25k · Vis = corner+signage score CS = min(100, Σₖ wₖ·min(nₖ,capₖ))  nₖ = complementary POIs ≤0.5mi by type k (§06) · wₖ, capₖ per category CP = 100 − 100·min(Ndirect(2mi)/Ncap, 1)  Ncap = tolerable rival count · e.g. chiro Ncap 5 → 5 rivals ⇒ CP 0 ZB = 0.5·Z + 0.5·B  Z: as-of-right 100 · conditional 60 · prohibited 0  |  B (Doc 20): low 100 · low-mod 80 · mod 60 · high 30 PA = 100·min(4.0/need, 1) − ADAgap  need = category stalls/1,000 SF · ADAgap = 0 here (single-story) CM = min(40,10·devsites≤1mi) + 20·KCI + 20·jobs + 20·comps  4 dev sites (§06) · $1.5B KCI · +35k metro jobs · $140 vs $105/SF medical premium
worked example — click any §05 row to recomputeuse_case: profsvc
loading…
Tier bands · shared with fw.scoring (Doc 10)
A · Hot 80–100 → campaign-test immediately, human first touch · B · Warm 60–79 → 5-touch sequence + LinkedIn audience · C · Nurture 40–59 → drip + ad retargeting · D · Monitor 20–39 → newsletter awareness only. Same bands the prospect matrix uses, so use-case tiers and prospect tiers join cleanly in §08.
§ 05

Use-Case Rankings

LUS computed live in-page · sorted desc

All 25 candidates scored by the §04 model against the §06–§07 evidence. Component bars are the eight sᵢ values in weight order; drivers cite the controlling inputs. Click a row → the §01 map isolates that use case's evidence categories and the §04 worked example recomputes.

#Use caseTierComponents · DG DF TV CS CP ZB PA CMControlling driversLUS
§ 06

Proximity Business Census

Places API (New) · 31 POIs harvested · 3 rings

Every business inside the 3-mile study area, harvested by places:searchNearby sweeps per category (§10 · API-02) and aggregated per ring. These counts are the raw inputs to DG (demand gap), CS (co-tenancy synergy) and CP (competitive pressure) in §04. Ring counts below are computed live from the same POI array that renders the §01 map.

key establishments · places.searchNearby result samplefieldmask: id,displayName,types,rating,userRatingCount,location · 12 of 31 shown
place_id (mock)NamePrimary typeRatingDistRingRole in model
plc_ne01Northland Eye Specialists · 8660 N Green Hillsophthalmologist4.7 · 2100.06 mi≤0.5CS+ medical anchor · CP− for opto
plc_mc01Magnolia Family Chiropractic · Barry Plazachiropractor4.9 · 880.40 mi≤0.5CP− for chiro (1 of 5+ in 2 mi)
plc_bp01Shoppes at Barry Plaza · 8560 N Green Hillsshopping_mall4.2 · 3400.40 mi≤0.5CS+ retail amenity · lunch traffic
plc_qt01QuikTrip #247 · MO-152 & Green Hillsgas_station4.5 · 5200.30 mi≤0.5TV corroboration · interchange draw
plc_sb01Starbucks · Tiffany Springs Pkwycoffee_shop4.3 · 6100.9 mi≤1CS+ professional amenity
plc_pc01Price Chopper · Barry Rdgrocery_store4.4 · 1.4k1.1 mi≤3DF corroboration · daytime pop
plc_sl01Saint Luke's North Hospital · Barry Rdhospital3.9 · 4802.3 mi≤3CS++ referral engine for all medical UCs
plc_zr01Zona Rosa Town Centershopping_mall4.3 · 8.2k2.0 mi≤3CS+ regional draw · comps for retail conv.
plc_pt01Athletico Physical Therapy · Barry Rdphysiotherapist4.8 · 1301.6 mi≤3CP− for pt (1 of 3 in 2 mi)
plc_dv01Dev site — 8433 N Green Hillsvacant_land*0.25 mi≤0.5CM+ momentum (1 of 4 dev sites ≤1 mi)
plc_dv02Dev site — 4511 NW Barry Rdvacant_land*0.55 mi≤1CM+ momentum
plc_ur00Urgent care — none found · 2 mi radiusurgent_care ∅DG++ for urgent · zero-result is a signal
Zero-result sweeps are kept, not discarded. A searchNearby call for med_spa or urgent_care that returns Ø inside 2 mi is the strongest demand-gap evidence in the model — it drives DG=95 for medspa and DG=88 for urgent in §05. * vacant_land is not a Places type; dev sites are ingested from the county parcel layer (Doc 22) and unioned into the same li_pois table with src='parcel'.
§ 07

Demographics & Traffic

ACS 5-yr · MoDOT TMS · Routes API

The demand-side evidence: who lives around the pin, how fast the trade area is growing, and how many vehicles pass the frontage. These feed DF (demand fundamentals) and TV (traffic & visibility) directly — every threshold used in §04 is shown against its measured value here.

trade-area demographics · census acs 5-yrgeography: 3-mi + 5-mi radius · Doc 22
Measure3-mile5-mileDF band test
Population45–65k142,300≥45k → +25
Households18–26k~55kcontext only
Median HHI$68–92k$89.4k$60–110k → +25
Median age35–3836.130–45 → +25
Age 65+~14%14.2%medical demand context
Annual growth2–4%2.8%≥2% → +25
DF = 100/100 for population-serving categories — all four bands hit. Professional-services DF swaps the age band for a white-collar employment share band (also met at 5-mi), so profsvc DF = 88 rather than 100 (3-mi HHI floor of $68k trims one band to partial credit).
traffic counts · aadtMoDOT TMS station pulls · est. = modeled
SegmentAADTRefV-scoreSource
N Green Hills Rd (frontage)8–12k12k83MoDOT TMS
NW Barry Rd (secondary)25k+25k100MoDOT TMS
MO-152 (interchange)38–44khaloMoDOT TMS · est.
I-29 (1 exit)55–65khaloMoDOT TMS · est.
// TV for a storefront-visibility use case (e.g. urgent) Vfront = 100·min(10k/12k,1) = 83 Vsec = 100·min(25k/25k,1) = 100 Vis = 62 (mid-block, monument sign, no corner) TV = 0.5·83 + 0.3·100 + 0.2·62 = 41.5 + 30 + 12.4 = ≈ 78
drive-time matrix · routes api computeRouteMatrixtravelMode: DRIVE · routingPreference: TRAFFIC_AWARE · departureTime: weekday 08:30
Origin → DestinationDistanceDuration (traffic)Why it matters
8630 N Green Hills → KCI Airport9.8 mi14 min$1.5B terminal · relocating vendor & consultant demand (CM)
8630 N Green Hills → Zona Rosa2.1 mi6 minRegional amenity draw · staff recruiting pitch (§09)
8630 N Green Hills → St. Luke's North2.3 mi7 minReferral proximity for every medical use case (CS)
8630 N Green Hills → Downtown KC14.6 mi19 minReverse-commute owner-occupant pitch — I-29 one exit away
§ 08

Optimum Users — Ranked & Testable

TB = 0.6·ProspectScore + 0.4·LUS

Named prospects from the Windfield scoring matrix (Doc 10) joined to the §05 use-case tiers. Total-Buyer index blends the 6-dimension prospect score (60%) with the location score of the use case the prospect would occupy (40%) — a strong company in a weak use case ranks below a strong company in a strong one. All eight are live in the outreach engine.

#1WilsonHaag CPAs & Advisors95.2
TB = 0.6·98 (prospect) + 0.4·86.4 (profsvc LUS) = 58.8 + 34.56 = 95.2
Multi-office CPA firm scaling in KC North · lease events tracked · Managing Partner identified · owner-occupancy saves 10–20% vs leasing over 10 yrs (Doc 21).
uc: profsvc · Aseg: owner-occch: LinkedIn ABM + directmsg: A-2
#2Ong & Company CPAs91.6
TB = 0.6·95 + 0.4·86.4 = 57 + 34.56 = 91.6
Northland-native firm, growth-stage headcount · strong geo-proximity dimension · tax-season parking need met at 4.0/1,000 SF.
uc: profsvc · Aseg: owner-occch: direct + email seqmsg: A-2
#3Northmarq — Kansas City90.6
TB = 0.6·98 + 0.4·79.6 (invest LUS) = 58.8 + 31.84 = 90.6
Capital-markets shop → dual path: investor-buyer channel for its clients or debt/equity partner on the 1031 story. 7.2% in-place vs 6.8–7.6% corridor caps.
uc: invest · Bseg: capital partnerch: broker-to-brokermsg: C-1
#4Pacific Dental Services89.3
TB = 0.6·96 + 0.4·79.3 (dso LUS) = 57.6 + 31.72 = 89.3
DSO with active Northland pipeline · B3-3 permits dental as-of-right · turnkey Class-A interior trims fit-out to plumbing adds only (Doc 20).
uc: dso · Bseg: tenant/buyerch: LinkedIn + RE deptmsg: B-1
#5Block Funds · Aaron Mesmer88.8
TB = 0.6·95 + 0.4·79.6 = 57 + 31.84 = 88.8
Active KC value-add buyer, $500K–3M equity band matches Doc 21 investor profile · known principal, direct line — Tier A on DM-authority dimension.
uc: invest · Bseg: investorch: direct + memomsg: C-1
#6Northland Early Education Ctr83.8
TB = 0.6·95 + 0.4·66.9 (edu LUS) = 57 + 26.76 = 83.8
Expansion-stage operator · use case is Tier-B (education support), while full childcare would gate to conditional-use — pitch is admin + tutoring hub, not licensed daycare.
uc: edu · Bseg: tenantch: email seqmsg: A-1 variant
#7SERC Physical Therapy82.2
TB = 0.6·98 + 0.4·58.4 (pt LUS) = 58.8 + 23.36 = 82.2
Top prospect score, weak location math — 3 PT rivals in 2 mi drags CP to 25. Reframe: owner-occupier consolidating satellites, where CP matters less than control & parking.
uc: pt · Cseg: owner-occ consolidatorch: directmsg: B-1 variant
#8FitNKC80.9
TB = 0.6·95 + 0.4·59.7 (fit LUS) = 57 + 23.88 = 80.9
Boutique operator with strong prospect fundamentals · fitness build-out cost (ZB drag) and Zona Rosa gym density cap the ceiling — nurture, don't lead.
uc: fit · Cseg: tenantch: retargeting poolmsg: hold
Read of the board
The blend surfaces the real strategy: lead with owner-occupant professional services (two CPA firms at 91+), keep capital-markets and DSO channels warm in parallel, and reframe rather than drop high-prospect / low-location names like SERC. Nobody below 80 makes the first campaign wave.
§ 09

Positioning & Message Tests

6 cells · every hook cites a §04–§07 number

Each cell pairs a ranked use case with a hook built from the location evidence — no claim appears in copy that isn't a computed value on this page. Cells map 1:1 to campaign audiences in the outreach engine; KPI gates decide which survive to wave two.

MSG-A1Professional Services · owner-occLinkedIn ABM · 1p
"Own the corner your clients already drive past."
Proof stack: LUS 86.4 (rank #1) · 25k+ VPD on NW Barry · 14 min to KCI · Class-A 2020 build, zero deferred capex · B3-3 as-of-right.
aud: mgmt partners, presidents · 15-miuc: profsvctier A
KPI gate → CTR ≥ 0.9% · 2 meetings / 30 d · kill below 0.4%
MSG-A2CPA / Advisory · lease-eventEmail seq + direct · 5-touch
"Your lease renewal is a down payment."
Proof stack: owner-occupancy saves 10–20% vs leasing over 10 yrs (Doc 21) · SBA 504-eligible size · 4.0/1,000 parking covers tax-season surge · targets WilsonHaag, Ong (§08 #1–2).
aud: CPA firms 8–30 staff · lease exp ≤ 18 mouc: profsvctier A
KPI gate → reply ≥ 6% · 1 LOI conversation / 45 d
MSG-B1Medical group · parking-ledLinkedIn + direct · 1p
"3.5 per 1,000 is the medical minimum. This building parks 4.0."
Proof stack: PA 100 · B3-3 permits all medical uses, no variance (Doc 21) · plumbing-only conversion (Doc 20) · St. Luke's North 7 min · LUS 84.9 (rank #2).
aud: practice admins, DSO RE leadsuc: medgroup / dsotier A/B
KPI gate → CTR ≥ 0.8% · 1 tour / 30 d
MSG-B2Med spa · demand-gapLinkedIn + IG · 1p
"Zero med-spa competition on an 8–12k VPD corridor."
Proof stack: DG 95 — searchNearby returns Ø med spas ≤ 2 mi (§06) · $89.4k median HHI at 5 mi · CP 95 · Northland Eye anchor 100 yds for aesthetic-adjacent referrals.
aud: med-spa founders, multi-unit aestheticsuc: medspatier A
KPI gate → CTR ≥ 1.1% (visual creative) · 2 inquiries / 30 d
MSG-C1Investor / 1031 · yield-ledBroker memo + email · 1p
"7.2% in-place, in a corridor trading 6.8–7.6."
Proof stack: 100% occupied, 2020 build · medical conversion path adds $140 vs $105/SF exit optionality (Doc 22) · 4 dev sites ≤ 1 mi (CM) · $1.5B KCI tailwind · targets Northmarq, Block Funds.
aud: $500K–3M equity, 1031 clocksuc: investtier B
KPI gate → memo open ≥ 45% · 1 underwrite / 30 d
MSG-D1Urgent care · visibility-ledLinkedIn ABM · 1p
"Walk-in visibility at the M-152 interchange — and nobody's built here yet."
Proof stack: DG 88, zero urgent care ≤ 2 mi (§06) · 38–44k VPD interchange halo · TV 78 · 142k pop / 5 mi · single-story ADA-clean shell.
aud: urgent-care platforms, health systemsuc: urgenttier A
KPI gate → CTR ≥ 0.8% · 1 site-selection call / 45 d
§ 10

API Console

every call behind this page · copy-paste ready

The full Google Maps Platform surface this playbook consumes, with the exact request shapes. Keys are injected server-side (never in the browser for REST calls); the Maps JS key is domain-restricted. Each card names the section it powers.

render plane · maps javascript
JSAPI-01 · Maps JavaScript API — base map + vector stylingSKU: Dynamic MapsPOWERS → §01
// bootstrap loader — one script tag, then importLibrary per need
(g=>{ /* official inline bootstrap */ })({
  key: "WF_MAPS_JS_KEY",          // domain-restricted, browser key
  v: "weekly"
});

const { Map }               = await google.maps.importLibrary("maps");
const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");

const map = new Map(document.getElementById("map"), {
  center: { lat: 39.2511, lng: -94.6316 },   // 8630 N Green Hills Rd
  zoom: 15,
  mapId: "WF_LI_DARK",      // cloud-styled map → tokens.json palette mapped in console
  tilt: 0, heading: 0
});

new AdvancedMarkerElement({ map, position: map.getCenter(),
  content: buildPin({ label: "8630", color: "#1db954" }) });
Cloud styling: the WF_LI_DARK map ID carries the Windfield palette (land #0d141d, water #0a1622, roads #1b2632) so the live map matches this mock 1:1. A twin WF_LI_LIGHT ID backs the light theme. Toggling §01 modes swaps mapTypeId (roadmap/hybrid) and layer objects — no reload.
harvest plane · places api (new)
POSTAPI-02 · Places searchNearby — category sweepsSKU: Nearby Search ProPOWERS → §01 · §06 · DG/CS/CP
POST https://places.googleapis.com/v1/places:searchNearby
Content-Type: application/json
X-Goog-Api-Key: {SERVER_KEY}
X-Goog-FieldMask: places.id,places.displayName,places.types,places.location,
                  places.rating,places.userRatingCount,places.businessStatus

{
  "includedTypes": ["doctor","dentist","physiotherapist","chiropractor","pharmacy"],
  "maxResultCount": 20,
  "locationRestriction": { "circle": {
      "center": { "latitude": 39.2511, "longitude": -94.6316 },
      "radius": 4828.0   // 3 mi in meters — outer study ring
  }},
  "rankPreference": "DISTANCE"
}
Sweep plan — 9 calls, one per model category: medical (types above) · professional (accounting, lawyer, insurance_agency, real_estate_agency, finance) · food (restaurant, coffee_shop) · retail (shopping_mall, grocery_store, clothing_store) · fitness (gym, yoga_studio) · education (school, tutoring*) · auto (gas_station, car_repair) · civic (post_office, library, local_government_office) · anchors (hospital). Each response is distance-bucketed into rings ≤0.5 / ≤1 / ≤3 mi and written to li_pois. Zero-result sweeps are logged too — they set DG. (*tutoring via searchText, no native type.)
POSTAPI-03 · Places searchText — gap probes & typeless queriesSKU: Text Search ProPOWERS → §06 zero-result rows · DG
POST https://places.googleapis.com/v1/places:searchText
X-Goog-FieldMask: places.id,places.displayName,places.types,places.location,places.rating

{
  "textQuery": "med spa near Tiffany Springs Kansas City MO",
  "locationBias": { "circle": {
      "center": { "latitude": 39.2511, "longitude": -94.6316 },
      "radius": 3218.0 }},          // 2 mi competitive ring
  "maxResultCount": 20
}

// probe battery: "med spa", "urgent care", "walk-in clinic", "title company",
// "tutoring center", "compounding pharmacy", "imaging center", "coworking"
Text probes catch what typed sweeps miss. The Ø med spa and Ø urgent care results inside 2 mi are the two highest-leverage numbers on this page — they set DG 95 / 88 and write the §09 B2 / D1 hooks verbatim.
GETAPI-04 · Place Details — enrichment on keepersSKU: Place Details ProPOWERS → §06 table · rail cards
GET https://places.googleapis.com/v1/places/{PLACE_ID}
X-Goog-Api-Key: {SERVER_KEY}
X-Goog-FieldMask: id,displayName,nationalPhoneNumber,websiteUri,regularOpeningHours,
                  rating,userRatingCount,priceLevel,businessStatus,googleMapsUri
Called only for the ~30 keepers after dedupe — not the full sweep — to hold the Details SKU spend flat. websiteUri feeds the Clay enrichment waterfall (Doc 13) so a POI can graduate into a §08 prospect.
POSTAPI-05 · Places Aggregate — computeInsights density countsSKU: Places Aggregate (preview)POWERS → §04 DG benchmark ρ
POST https://areainsights.googleapis.com/v1:computeInsights

{
  "insights": ["INSIGHT_COUNT"],
  "filter": {
    "locationFilter": { "circle": {
        "latLng": { "latitude": 39.2511, "longitude": -94.6316 },
        "radius": 4828 }},
    "typeFilter": { "includedTypes": ["doctor"] },
    "operatingStatus": ["OPERATING_STATUS_OPERATIONAL"]
  }
}
Count-only queries are far cheaper than result sweeps — used to compute category density ρ here vs. the metro benchmark ring (same call centered on the KC North reference centroid). The ratio is DG's ρ/ρbench term in §04.
context plane · imagery, geocode, terrain
GETAPI-06 · Geocoding — canonical pin + APN crosswalkSKU: GeocodingPOWERS → every lat/lng on this page
GET https://maps.googleapis.com/maps/api/geocode/json
    ?address=8630%20N%20Green%20Hills%20Rd%2C%20Kansas%20City%2C%20MO%2064154
    &key={SERVER_KEY}

// → 39.2511, -94.6316 · plus_code 87F4+XW · stored once in li_runs, reused everywhere
GETAPI-07 · Street View Static + metadata — frontage stripSKU: Static Street ViewPOWERS → §01 sv-strip
// 1) free metadata check — never render a "no imagery" tile
GET https://maps.googleapis.com/maps/api/streetview/metadata
    ?location=39.2511,-94.6316&key={SERVER_KEY}

// 2) four headings, matches the mock strip in §01
GET https://maps.googleapis.com/maps/api/streetview
    ?size=640x400&location=39.2511,-94.6316
    &fov=80&pitch=0&heading=235&key={SERVER_KEY}     // SW · building face
// heading=000 N Green Hills north · 090 toward I-29 · 180 toward NW Barry
Headings were chosen from the parcel bearing so frame 1 is always the facade. Images are cached to li_assets_streetview with the metadata pano_id + capture date — stale imagery (> 24 mo) flags for a manual drone refresh.
GETAPI-08 · Map Tiles API — photorealistic 3D tilesSKU: 3D Tiles (photorealistic)POWERS → §01 mode: 3D
GET https://tile.googleapis.com/v1/3dtiles/root.json?key={SERVER_KEY}
// consumed by CesiumJS / deck.gl Tiles3DLoader — massing + roof context
// session-token flow per tile fetch; render clipped to the 1-mi ring to cap tile spend
Used for the buyer-facing flyover clip (§09 creative) and roof/HVAC massing checks. The §01 "3D" mode mocks the extruded-parcel view this renders.
movement plane · routes, roads
POSTAPI-09 · Routes — computeRouteMatrix drive timesSKU: Routes Advanced (traffic-aware)POWERS → §07 drive-time matrix
POST https://routes.googleapis.com/distanceMatrix/v2:computeRouteMatrix
X-Goog-FieldMask: originIndex,destinationIndex,duration,distanceMeters,condition

{
  "origins": [{ "waypoint": { "location": { "latLng": {
      "latitude": 39.2511, "longitude": -94.6316 }}}}],
  "destinations": [
    { "waypoint": { "placeId": "ChIJ..KCI" }},
    { "waypoint": { "placeId": "ChIJ..ZonaRosa" }},
    { "waypoint": { "placeId": "ChIJ..StLukesN" }},
    { "waypoint": { "placeId": "ChIJ..DowntownKC" }}
  ],
  "travelMode": "DRIVE",
  "routingPreference": "TRAFFIC_AWARE",
  "departureTime": "2026-07-15T13:30:00Z"   // weekday 08:30 CT
}
GETAPI-10 · Roads snapToRoads — frontage segment IDsSKU: RoadsPOWERS → §07 AADT join
GET https://roads.googleapis.com/v1/snapToRoads
    ?path=39.2515,-94.6316|39.2507,-94.6316&interpolate=true&key={SERVER_KEY}
// → placeId per road segment → joined to MoDOT TMS station AADT in li_traffic_counts
diligence plane · optional enrichers
GETAPI-11 · Solar buildingInsights — roof yieldSKU: SolarPOWERS → §09 C-1 opex angle
GET https://solar.googleapis.com/v1/buildingInsights:findClosest
    ?location.latitude=39.2511&location.longitude=-94.6316&key={SERVER_KEY}
// → maxArrayAreaMeters2, yearlyEnergyDcKwh — investor memo opex-reduction line
GETAPI-12 · Air Quality currentConditions — wellness angleSKU: Air QualityPOWERS → medical / wellness copy
POST https://airquality.googleapis.com/v1/currentConditions:lookup
{ "location": { "latitude": 39.2511, "longitude": -94.6316 } }
POSTAPI-13 · Aerial View — cinematic assetSKU: Aerial View (preview)POWERS → §09 video creative
POST https://aerialview.googleapis.com/v1/videos:renderVideo
{ "address": "8630 N Green Hills Rd, Kansas City, MO 64154" }
// poll videos:lookupVideo until ACTIVE → mp4 URIs for LinkedIn ad unit
POSTAPI-14 · Address Validation — CASS-clean mail mergeSKU: Address ValidationPOWERS → §08 direct-mail wave
POST https://addressvalidation.googleapis.com/v1:validateAddress
{ "address": { "regionCode": "US", "addressLines": ["8630 N Green Hills Rd, Kansas City MO 64154"] },
  "enableUspsCass": true }
data plane · warehouse & config
SQLDATA-01 · BigQuery — Places Insights density benchmarkdataset: places_insights___usPOWERS → §04 ρbench
-- category density inside the 3-mi study circle vs KC-North benchmark circle
WITH study AS (
  SELECT COUNT(*) n, 'study' ring
  FROM `places_insights___us.places`
  WHERE 'doctor' IN UNNEST(types)
    AND ST_DWITHIN(point, ST_GEOGPOINT(-94.6316, 39.2511), 4828)
), bench AS (
  SELECT COUNT(*) n, 'bench' ring
  FROM `places_insights___us.places`
  WHERE 'doctor' IN UNNEST(types)
    AND ST_DWITHIN(point, ST_GEOGPOINT(-94.6096, 39.2154), 4828)  -- KC-North centroid
)
SELECT * FROM study UNION ALL SELECT * FROM bench;
Run once per quarter per category; the ratio feeds ρ/ρbench. Everything else on this page runs at request time.
SQLDATA-02 · Supabase schema — where every number landspostgres 15 · postgisPOWERS → all data-bind-source tags
create table li_runs (
  id text primary key,                 -- 'LI-1616772-0714'
  property_id bigint not null,        -- 1616772
  centroid geography(Point,4326), run_at timestamptz default now(),
  config jsonb                        -- frozen scoring_config.json snapshot
);
create table li_pois (
  id text primary key, run_id text references li_runs,
  place_id text, name text, cat text, types text[],
  loc geography(Point,4326), dist_mi numeric, ring text,
  rating numeric, reviews int, src text default 'places'   -- 'places' | 'parcel'
);
create index on li_pois using gist(loc);
create table li_use_cases        (id text primary key, label text, grp text, gate numeric);
create table li_use_case_scores  (run_id text, uc_id text,
  dg int, df int, tv int, cs int, cp int, zb int, pa int, cm int,
  lus numeric generated always as (/* §04 formula in SQL */) stored,
  primary key(run_id, uc_id));
create table li_demographics     (run_id text, radius_mi int, pop int, hh int,
  hhi numeric, med_age numeric, growth numeric, pct_65 numeric);
create table li_traffic_counts   (run_id text, segment text, aadt_lo int, aadt_hi int,
  source text, is_estimate boolean, road_place_id text);
create table li_assets_streetview(run_id text, heading int, pano_id text,
  captured_on date, storage_url text);
create table li_prospect_matches (run_id text, prospect text, uc_id text,
  prospect_score int, tb numeric, msg_cell text);
-- RLS: enable on all; policy = auth.jwt() ->> 'org' = 'windfield'
CFGDATA-03 · scoring_config.json — the model, versionedfrozen per run into li_runs.configPOWERS → §04 · §05
{
  "version": "lus-1.0",
  "weights": { "dg": 0.22, "zb": 0.15, "df": 0.15, "tv": 0.12,
               "cs": 0.12, "cp": 0.12, "pa": 0.06, "cm": 0.06 },
  "gates": { "as_of_right": 1.00, "conditional": 0.85, "conversion": 0.80,
             "assembly": 0.75, "unverified": 0.62 },
  "tiers": { "A": [80,100], "B": [60,79], "C": [40,59], "D": [20,39] },
  "tb_blend": { "prospect": 0.6, "lus": 0.4 },
  "rings_mi": [0.5, 1, 3], "competitive_ring_mi": 2
}
SSEDATA-04 · Edge Function li-run — live pipeline streamsupabase functions · deno · text/event-streamPOWERS → §00 console · auto-runs · exports
GET https://{project}.functions.supabase.co/li-run?property=1616772
Accept: text/event-stream

// NDJSON events — exactly what the §00 console renders:
data: {"t":"stage", "id":"sweep", "n":2, "of":7}
data: {"t":"call", "api":"places:searchNearby", "cat":"medical", "rows":12, "ms":284}
data: {"t":"gap",  "probe":"med spa", "rows":0, "ring_mi":2}
data: {"t":"score", "uc":"profsvc", "lus":86.4, "tier":"A"}
data: {"t":"done", "run":"LI-1616772-0714-r2", "dur_s":9.8}

// row inserts fan out on Realtime — the page patches map / census / rankings:
supabase.channel('li:1616772')
  .on('postgres_changes', { event: 'INSERT', table: 'li_pois' }, patchMap)
  .on('postgres_changes', { event: 'INSERT', table: 'li_use_case_scores' }, patchRanks)
  .subscribe();

// automations — same function on a schedule, or fired by webhooks:
select cron.schedule('li-nightly', '0 6 * * *', $$ select net.http_post(edge_url) $$);
Exports render server-side from the same payload the §00 buttons download client-side: JSON is the li_* row set verbatim, CSV is li_use_case_scores flattened, and the HTML report is a template pass over the payload (open → print for PDF). A run is immutable once snapshotted; §08's TB blend reads the promoted run only, so campaign math never drifts under an unreviewed re-score.