Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
File size: 153,080 Bytes
3d16fe6 896453f 1f7780e 896453f fcf298e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 | <!doctype html><html lang=en dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-development/real-time-statistics" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.0"><title data-rh=true>Real-Time Statistics with Geographic Filtering | Open Navigator</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true property=og:image content=https://www.communityone.com/img/docusaurus-social-card.jpg /><meta data-rh=true name=twitter:image content=https://www.communityone.com/img/docusaurus-social-card.jpg /><meta data-rh=true property=og:url content=https://www.communityone.com/docs/development/real-time-statistics /><meta data-rh=true property=og:locale content=en /><meta data-rh=true name=docusaurus_locale content=en /><meta data-rh=true name=docsearch:language content=en /><meta data-rh=true name=keywords content="civic engagement, policy tracking, meeting minutes, nonprofit tracking, municipal government, advocacy, open data, local government"/><meta data-rh=true property=og:type content=website /><meta data-rh=true property=og:site_name content="Open Navigator"/><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true name=docusaurus_version content=current /><meta data-rh=true name=docusaurus_tag content=docs-default-current /><meta data-rh=true name=docsearch:version content=current /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-current /><meta data-rh=true property=og:title content="Real-Time Statistics with Geographic Filtering | Open Navigator"/><meta data-rh=true name=description content=Overview /><meta data-rh=true property=og:description content=Overview /><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://www.communityone.com/docs/development/real-time-statistics /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/real-time-statistics hreflang=en /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/real-time-statistics hreflang=x-default /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://www.communityone.com/docs/for-developers","name":"Developers & Technical Users","position":1},{"@type":"ListItem","item":"https://www.communityone.com/docs/development/real-time-statistics","name":"Real-Time Statistics with Geographic Filtering","position":2}]}</script><link rel=alternate type=application/rss+xml href=/blog/rss.xml title="Open Navigator RSS Feed"><link rel=alternate type=application/atom+xml href=/blog/atom.xml title="Open Navigator Atom Feed"><link rel=preconnect href=https://www.google-analytics.com><link rel=preconnect href=https://www.googletagmanager.com><script async src="https://www.googletagmanager.com/gtag/js?id=G-5EQV815915"></script><script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-5EQV815915",{anonymize_ip:!0})</script><link rel=stylesheet href=/assets/css/styles.c89d6b2d.css /><script src=/assets/js/runtime~main.c8fa085e.js defer></script><script src=/assets/js/main.6e24e536.js defer></script></head><body><svg style="display: none;"><defs>
<symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme-7e9")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id=__docusaurus><link rel=preload as=image href=/img/communityone_logo.svg /><script type=application/ld+json>{"@context":"https://schema.org","@type":"Organization","address":{"@type":"PostalAddress","addressCountry":"US","addressLocality":"Tuscaloosa","addressRegion":"AL","postalCode":"35406","streetAddress":"5617 Lakeridge Court"},"contactPoint":{"@type":"ContactPoint","availableLanguage":["English"],"contactType":"Customer Service","email":"johnbowyer@communityone.com"},"description":"Track 90,000+ jurisdictions, 1.8M nonprofits, and analyze meeting minutes with AI. The open path to everything local.","email":"johnbowyer@communityone.com","legalName":"CommunityOne","logo":"https://www.communityone.com/img/communityone_logo.svg","name":"CommunityOne","sameAs":["https://www.facebook.com/communityone","https://www.instagram.com/communityone","https://twitter.com/communityone","https://www.linkedin.com/company/communityone","https://www.youtube.com/@communityone","https://discord.gg/communityone","https://github.com/getcommunityone/open-navigator"],"url":"https://www.communityone.com"}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"WebSite","alternateName":"CommunityOne Open Navigator","description":"AI-powered civic engagement platform tracking jurisdictions, nonprofits, and government meetings","name":"Open Navigator","potentialAction":{"@type":"SearchAction","query-input":"required name=search_term_string","target":{"@type":"EntryPoint","urlTemplate":"https://www.communityone.com/search?q={search_term_string}"}},"url":"https://www.communityone.com"}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"SoftwareApplication","aggregateRating":{"@type":"AggregateRating","ratingCount":"1","ratingValue":"5"},"applicationCategory":"BusinessApplication","description":"Track 90,000+ jurisdictions, 1.8M nonprofits, and analyze meeting minutes with AI","featureList":["Track 90,000+ jurisdictions","Monitor 1.8M nonprofits","Analyze meeting minutes","Legislative bill tracking","Campaign finance data"],"name":"Open Navigator","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"operatingSystem":"Web","screenshot":"https://www.communityone.com/img/docusaurus-social-card.jpg","softwareVersion":"1.0.0"}</script><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a href=https://www.communityone.com target=_self rel="noopener noreferrer" class=navbar__brand><div class=navbar__logo><img src=/img/communityone_logo.svg alt="CommunityOne Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/communityone_logo.svg alt="CommunityOne Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div><b class="navbar__title text--truncate">Open Navigator Home</b></a><a class="navbar__item navbar__link" href=/docs/intro>Getting Started</a><a class="navbar__item navbar__link" href=/docs/for-families>Families & Individuals</a><a class="navbar__item navbar__link" href=/docs/for-advocates>Policy Makers</a><a class="navbar__item navbar__link" href=/docs/for-developers>Developers</a><a class="navbar__item navbar__link" href=/docs/data-sources/citations>Data and Terms</a><a class="navbar__item navbar__link" href=/blog>Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href=https://github.com/getcommunityone/open-navigator-for-engagement target=_blank rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbarSearchContainer_Bca1></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/intro><span title="Getting Started" class=categoryLinkLabel_W154>Getting Started</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/intro><span title=Introduction class=linkLabel_WmDU>Introduction</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/open-navigator><span title="Open Navigator" class=linkLabel_WmDU>Open Navigator</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/docs/for-families><span title="Families & Individuals" class=categoryLinkLabel_W154>Families & Individuals</span></a><button aria-label="Collapse sidebar category 'Families & Individuals'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/families/community-events><span title="Resources for Families" class=categoryLinkLabel_W154>Resources for Families</span></a></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/open-navigator><span title="Getting Started with Open Navigator" class=linkLabel_WmDU>Getting Started with Open Navigator</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/data-sources/citations><span title="Data and Citations" class=linkLabel_WmDU>Data and Citations</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/docs/for-advocates><span title="Policy Makers & Advocates" class=categoryLinkLabel_W154>Policy Makers & Advocates</span></a><button aria-label="Collapse sidebar category 'Policy Makers & Advocates'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/data-sources/overview><span title="Understanding the Data" class=categoryLinkLabel_W154>Understanding the Data</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/guides/political-economy><span title="Analysis & Strategy" class=categoryLinkLabel_W154>Analysis & Strategy</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/case-studies/tuscaloosa-complete><span title="Real-World Examples" class=categoryLinkLabel_W154>Real-World Examples</span></a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" href=/docs/for-developers><span title="Developers & Technical Users" class=categoryLinkLabel_W154>Developers & Technical Users</span></a><button aria-label="Collapse sidebar category 'Developers & Technical Users'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/quickstart><span title="Setup & Installation" class=categoryLinkLabel_W154>Setup & Installation</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/data-sources/citations><span title="Data Sources (Technical)" class=categoryLinkLabel_W154>Data Sources (Technical)</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/guides/jurisdiction-setup><span title="How-To Guides" class=categoryLinkLabel_W154>How-To Guides</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/integrations/mcp-server><span title=Integrations class=categoryLinkLabel_W154>Integrations</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/deployment/databricks-apps><span title=Deployment class=categoryLinkLabel_W154>Deployment</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true tabindex=0 href=/docs/development/database-setup><span title=Development class=categoryLinkLabel_W154>Development</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/database-setup><span title="Database Setup & Stats Verification" class=linkLabel_WmDU>Database Setup & Stats Verification</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/events-naming-migration><span title="File Migration to Events Naming Convention" class=linkLabel_WmDU>File Migration to Events Naming Convention</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/adding-data-sources><span title="Adding New Data Sources" class=linkLabel_WmDU>Adding New Data Sources</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/api-logging-errors><span title="API Logging & Error Handling Implementation" class=linkLabel_WmDU>API Logging & Error Handling Implementation</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/openstates-integration><span title="OpenStates Integration & Contribution Opportunities" class=linkLabel_WmDU>OpenStates Integration & Contribution Opportunities</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/docs/development/real-time-statistics><span title="Real-Time Statistics with Geographic Filtering" class=linkLabel_WmDU>Real-Time Statistics with Geographic Filtering</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/schema-migration-summary><span title="Schema Migration Summary" class=linkLabel_WmDU>Schema Migration Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/terminal-corruption-prevention><span title="Terminal Corruption Prevention" class=linkLabel_WmDU>Terminal Corruption Prevention</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/county-data-status><span title="County Search and Aggregation - Status Summary" class=linkLabel_WmDU>County Search and Aggregation - Status Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/intel-optimization><span title="DuckDB + Intel Arc Optimization" class=linkLabel_WmDU>DuckDB + Intel Arc Optimization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/dashboard-redesign><span title="React Dashboard Redesign Summary" class=linkLabel_WmDU>React Dashboard Redesign Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/docs-migration><span title="Documentation Migration Summary" class=linkLabel_WmDU>Documentation Migration Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/port-guide><span title="๐จ CRITICAL: Which Port to Use?" class=linkLabel_WmDU>๐จ CRITICAL: Which Port to Use?</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/react-refactoring><span title="React + FastAPI Databricks App Refactoring" class=linkLabel_WmDU>React + FastAPI Databricks App Refactoring</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/readme-migration><span title="README Migration Summary" class=linkLabel_WmDU>README Migration Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/refactoring-summary><span title="โจ React + FastAPI Databricks App - Complete Refactoring Summary" class=linkLabel_WmDU>โจ React + FastAPI Databricks App - Complete Refactoring Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/changelog><span title="Changelog - Jurisdiction Discovery System" class=linkLabel_WmDU>Changelog - Jurisdiction Discovery System</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/enhancements><span title="โ
Enhancement Complete: Official Data Sources Integration" class=linkLabel_WmDU>โ
Enhancement Complete: Official Data Sources Integration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/integration-status><span title="โ
Integration Status Summary" class=linkLabel_WmDU>โ
Integration Status Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/migration-v2><span title="โ
Migration Complete: Pattern-Based Discovery v2.0" class=linkLabel_WmDU>โ
Migration Complete: Pattern-Based Discovery v2.0</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/new-capabilities><span title="๐ NEW CAPABILITIES SUMMARY" class=linkLabel_WmDU>๐ NEW CAPABILITIES SUMMARY</span></a></ul></ul></ul></nav></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_VOVn"><div class=docItemContainer_Djhp><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><a class=breadcrumbs__link href=/docs/for-developers><span>Developers & Technical Users</span></a><li class=breadcrumbs__item><span class=breadcrumbs__link>Development</span><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>Real-Time Statistics with Geographic Filtering</span></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Real-Time Statistics with Geographic Filtering</h1></header>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=overview>Overview<a href=#overview class=hash-link aria-label="Direct link to Overview" title="Direct link to Overview" translate=no>โ</a></h2>
<p>The platform displays <strong>real statistics from actual data tables</strong> with <strong>multi-level geographic filtering</strong>. Stats are calculated from parquet files, cached for performance, and automatically update based on the user's selected location.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-key-features>๐ฏ Key Features<a href=#-key-features class=hash-link aria-label="Direct link to ๐ฏ Key Features" title="Direct link to ๐ฏ Key Features" translate=no>โ</a></h2>
<ul>
<li class=""><strong>Multi-level caching</strong> - National, state, county, and city stats cached separately</li>
<li class=""><strong>Auto-updates</strong> - Stats refresh based on user's selected location</li>
<li class=""><strong>Real data</strong> - Actual counts from parquet files, not estimates</li>
<li class=""><strong>Smart extrapolation</strong> - National view projects 50-state totals from current data</li>
<li class=""><strong>Performance</strong> - 1-hour cache per geographic level</li>
<li class=""><strong>Contextual display</strong> - UI shows "Our Impact in Massachusetts" for state view</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=what-changed>What Changed<a href=#what-changed class=hash-link aria-label="Direct link to What Changed" title="Direct link to What Changed" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=-before-hardcoded-no-geography>โ
Before (Hardcoded, No Geography)<a href=#-before-hardcoded-no-geography class=hash-link aria-label="Direct link to โ
Before (Hardcoded, No Geography)" title="Direct link to โ
Before (Hardcoded, No Geography)" translate=no>โ</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// frontend/src/pages/HomeModern.tsx</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'90,000+'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> label</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'Jurisdictions Tracked'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>...</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'3M+'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> label</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'Nonprofits & Churches'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>...</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=-after-real-data-multi-level-geography>โ
After (Real Data, Multi-Level Geography)<a href=#-after-real-data-multi-level-geography class=hash-link aria-label="Direct link to โ
After (Real Data, Multi-Level Geography)" title="Direct link to โ
After (Real Data, Multi-Level Geography)" translate=no>โ</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// Fetches from API with location context</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> data</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> statsData </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>useQuery</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> queryKey</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>[</span><span class="token string" style=color:#e3116c>'platform-stats'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> location</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">state</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token function-variable function" style=color:#d73a49>queryFn</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>async</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=></span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> params</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">any</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>if</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">location </span><span class="token operator" style=color:#393A34>&&</span><span class="token plain"> location</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">state</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> params</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">state </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> location</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">state</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>await</span><span class="token plain"> axios</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>get</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'/api/stats'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> params </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// National: "3M+ nonprofits"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// State (MA): "43,726 nonprofits in Massachusetts"</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=geographic-levels>Geographic Levels<a href=#geographic-levels class=hash-link aria-label="Direct link to Geographic Levels" title="Direct link to Geographic Levels" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=-national-default>๐ National (Default)<a href=#-national-default class=hash-link aria-label="Direct link to ๐ National (Default)" title="Direct link to ๐ National (Default)" translate=no>โ</a></h3>
<ul>
<li class=""><strong>Endpoint:</strong> <code>/api/stats</code></li>
<li class=""><strong>Nonprofits:</strong> 3M+ (extrapolated from 5 states)</li>
<li class=""><strong>Meetings:</strong> 203,990 (projected)</li>
<li class=""><strong>Jurisdictions:</strong> 85,302 (actual count)</li>
<li class=""><strong>Use case:</strong> Homepage without location selected</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=๏ธ-state-level>๐๏ธ State Level<a href=#๏ธ-state-level class=hash-link aria-label="Direct link to ๐๏ธ State Level" title="Direct link to ๐๏ธ State Level" translate=no>โ</a></h3>
<ul>
<li class=""><strong>Endpoint:</strong> <code>/api/stats?state=MA</code></li>
<li class=""><strong>Nonprofits:</strong> Actual count for state (e.g., 43,726 for MA)</li>
<li class=""><strong>Meetings:</strong> Actual count for state (e.g., 6,913 for MA)</li>
<li class=""><strong>Jurisdictions:</strong> State-specific count (e.g., 925 for MA)</li>
<li class=""><strong>Use case:</strong> User has selected their state</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=๏ธ-county-level>๐๏ธ County Level<a href=#๏ธ-county-level class=hash-link aria-label="Direct link to ๐๏ธ County Level" title="Direct link to ๐๏ธ County Level" translate=no>โ</a></h3>
<ul>
<li class=""><strong>Endpoint:</strong> <code>/api/stats?state=MA&county=Suffolk</code></li>
<li class=""><strong>Nonprofits:</strong> Filtered by county</li>
<li class=""><strong>Meetings:</strong> County-level meetings</li>
<li class=""><strong>Use case:</strong> User has selected county</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=๏ธ-city-level>๐๏ธ City Level<a href=#๏ธ-city-level class=hash-link aria-label="Direct link to ๐๏ธ City Level" title="Direct link to ๐๏ธ City Level" translate=no>โ</a></h3>
<ul>
<li class=""><strong>Endpoint:</strong> <code>/api/stats?state=MA&city=Boston</code></li>
<li class=""><strong>Nonprofits:</strong> Filtered by city</li>
<li class=""><strong>Meetings:</strong> City-level meetings</li>
<li class=""><strong>Use case:</strong> User has selected specific city</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=architecture>Architecture<a href=#architecture class=hash-link aria-label="Direct link to Architecture" title="Direct link to Architecture" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-backend-stats-api-endpoint>1. Backend: Stats API Endpoint<a href=#1-backend-stats-api-endpoint class=hash-link aria-label="Direct link to 1. Backend: Stats API Endpoint" title="Direct link to 1. Backend: Stats API Endpoint" translate=no>โ</a></h3>
<p><strong>File:</strong> <code>api/routes/stats.py</code></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token decorator annotation punctuation" style=color:#393A34>@router</span><span class="token decorator annotation punctuation" style=color:#393A34>.</span><span class="token decorator annotation punctuation" style=color:#393A34>get</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"/stats"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>async</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>get_stats</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token triple-quoted-string string" style=color:#e3116c>"""</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> Get platform statistics from real data</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> </span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> Returns cached metrics calculated from parquet files:</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> - Jurisdictions tracked (cities, counties, townships, school districts)</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> - Nonprofits monitored (extrapolated from available states)</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> - Meetings analyzed</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> - Officials and contacts tracked</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> - Causes and NTEE codes</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> </span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> Cache duration: 1 hour</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c> """</span><br/></div></code></pre></div></div>
<p><strong>Features:</strong></p>
<ul>
<li class="">โก <strong>1-hour cache</strong> - Stats calculated once per hour, not on every request</li>
<li class="">๐ <strong>Real counts</strong> - Reads actual parquet files in <code>data/gold/</code></li>
<li class="">๐ฎ <strong>Smart extrapolation</strong> - Projects 50-state totals from current 5 states</li>
<li class="">๐ก๏ธ <strong>Fallback values</strong> - Returns sensible defaults if calculation fails</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-frontend-dynamic-display>2. Frontend: Dynamic Display<a href=#2-frontend-dynamic-display class=hash-link aria-label="Direct link to 2. Frontend: Dynamic Display" title="Direct link to 2. Frontend: Dynamic Display" translate=no>โ</a></h3>
<p><strong>File:</strong> <code>frontend/src/pages/HomeModern.tsx</code></p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// Fetch stats with caching</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> data</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> statsData </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>useQuery</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> queryKey</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>[</span><span class="token string" style=color:#e3116c>'platform-stats'</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token function-variable function" style=color:#d73a49>queryFn</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>async</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=></span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> response </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>await</span><span class="token plain"> axios</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>get</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'/api/stats'</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> response</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">data</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">data</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> staleTime</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1000</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>*</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>60</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>*</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>60</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic>// Cache for 1 hour</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> refetchOnWindowFocus</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>false</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// Use in UI</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token operator" style=color:#393A34><</span><span class="token plain">div className</span><span class="token operator" style=color:#393A34>=</span><span class="token string" style=color:#e3116c>"text-5xl font-bold"</span><span class="token operator" style=color:#393A34>></span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain">statsData</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">jurisdictions_display </span><span class="token operator" style=color:#393A34>||</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'85,302'</span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token operator" style=color:#393A34><</span><span class="token operator" style=color:#393A34>/</span><span class="token plain">div</span><span class="token operator" style=color:#393A34>></span><br/></div></code></pre></div></div>
<p><strong>Features:</strong></p>
<ul>
<li class="">๐ฏ <strong>React Query</strong> - Client-side caching for 1 hour</li>
<li class="">๐ <strong>Auto-refresh</strong> - Stats update every hour automatically</li>
<li class="">๐ฑ <strong>Responsive</strong> - Works on all devices</li>
<li class="">๐จ <strong>Smooth transitions</strong> - No layout shift during loading</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=current-stats-as-of-2026-04-28>Current Stats (as of 2026-04-28)<a href=#current-stats-as-of-2026-04-28 class=hash-link aria-label="Direct link to Current Stats (as of 2026-04-28)" title="Direct link to Current Stats (as of 2026-04-28)" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=comparison-by-geographic-level>Comparison by Geographic Level<a href=#comparison-by-geographic-level class=hash-link aria-label="Direct link to Comparison by Geographic Level" title="Direct link to Comparison by Geographic Level" translate=no>โ</a></h3>
<table><thead><tr><th>Metric<th>National<th>Massachusetts (State)<th>Difference<tbody><tr><td><strong>Nonprofits</strong><td>3M+ (projected)<td>43,726 (actual)<td>Shows real data vs extrapolation<tr><td><strong>Meetings</strong><td>203,990 (projected)<td>6,913 (actual)<td>State-specific count<tr><td><strong>Jurisdictions</strong><td>85,302<td>925<td>MA cities, towns, counties<tr><td><strong>School Districts</strong><td>13,326<td>306<td>MA school districts<tr><td><strong>Contacts</strong><td>24,880 (projected)<td>362 (actual)<td>Nonprofit officers in MA</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=cache-structure>Cache Structure<a href=#cache-structure class=hash-link aria-label="Direct link to Cache Structure" title="Direct link to Cache Structure" translate=no>โ</a></h3>
<p>Each geographic level has its own cache entry:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">STATS_CACHE </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"national"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"_cache_timestamp"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> datetime</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"state:MA"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"_cache_timestamp"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> datetime</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"state:CA"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"_cache_timestamp"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> datetime</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"county:MA:Suffolk"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"_cache_timestamp"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> datetime</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"city:MA:Suffolk:Boston"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>.</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"_cache_timestamp"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> datetime</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=actual-counts-all-states-combined>Actual Counts (All States Combined)<a href=#actual-counts-all-states-combined class=hash-link aria-label="Direct link to Actual Counts (All States Combined)" title="Direct link to Actual Counts (All States Combined)" translate=no>โ</a></h3>
<table><thead><tr><th>Metric<th>Current<th>Source<tbody><tr><td><strong>Jurisdictions</strong><td>85,302<td>Census GID parquet files<tr><td><strong>School Districts</strong><td>13,326<td>NCES data<tr><td><strong>Nonprofits</strong><td>357,738<td>IRS BMF (5 states: AL, GA, MA, WA, WI)<tr><td><strong>Meetings</strong><td>20,399<td>Meeting transcripts<tr><td><strong>Contacts</strong><td>2,488<td>Nonprofit officers<tr><td><strong>Domains</strong><td>15,680<td>GSA .gov domains</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=projected-50-states>Projected (50 States)<a href=#projected-50-states class=hash-link aria-label="Direct link to Projected (50 States)" title="Direct link to Projected (50 States)" translate=no>โ</a></h3>
<table><thead><tr><th>Metric<th>Projected<th>Calculation<tbody><tr><td><strong>Nonprofits</strong><td>3M+<td>IRS BMF full database (capped at 3.5M)<tr><td><strong>Meetings</strong><td>203,990<td>Current ร 10 (extrapolated)<tr><td><strong>Contacts</strong><td>24,880<td>Current ร 10 (extrapolated)</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=static-metrics>Static Metrics<a href=#static-metrics class=hash-link aria-label="Direct link to Static Metrics" title="Direct link to Static Metrics" translate=no>โ</a></h3>
<p>These remain constant as they're from external sources:</p>
<ul>
<li class=""><strong>Budget Tracked:</strong> $2T+ (from meeting analysis and budget scraping)</li>
<li class=""><strong>Fact Checks:</strong> 10K+ (PolitiFact + FactCheck.org APIs)</li>
<li class=""><strong>Grant Opportunities:</strong> 1,000s (Grants.gov + foundation data)</li>
<li class=""><strong>Churches:</strong> 300K+ (Religious organizations from NTEE codes)</li>
<li class=""><strong>States:</strong> 50 (nationwide coverage goal)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=api-endpoints>API Endpoints<a href=#api-endpoints class=hash-link aria-label="Direct link to API Endpoints" title="Direct link to API Endpoints" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=get-apistats>GET /api/stats<a href=#get-apistats class=hash-link aria-label="Direct link to GET /api/stats" title="Direct link to GET /api/stats" translate=no>โ</a></h3>
<p>Returns summary statistics with optional geographic filtering.</p>
<p><strong>Query Parameters:</strong></p>
<ul>
<li class=""><code>state</code> (optional): Two-letter state code (e.g., 'MA')</li>
<li class=""><code>county</code> (optional): County name (e.g., 'Suffolk County')</li>
<li class=""><code>city</code> (optional): City name (e.g., 'Boston')</li>
</ul>
<p><strong>Examples:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># National statistics</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl "http://localhost:8000/api/stats"</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Massachusetts statistics</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl "http://localhost:8000/api/stats?state=MA"</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Suffolk County, MA statistics </span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl "http://localhost:8000/api/stats?state=MA&county=Suffolk"</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Boston, MA statistics</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl "http://localhost:8000/api/stats?state=MA&county=Suffolk&city=Boston"</span><br/></div></code></pre></div></div>
<p><strong>Response (National):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-json codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"success"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"data"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"level"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"national"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"location"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"United States"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"state"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token null keyword" style=color:#00009f>null</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"county"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token null keyword" style=color:#00009f>null</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"city"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token null keyword" style=color:#00009f>null</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"jurisdictions_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"85,302"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"nonprofits_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"3M+"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"meetings_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"203,990"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"school_districts_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"13,326"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"contacts_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"24,880"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"last_updated"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"2026-04-28T09:45:57.329132"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"budget_tracked"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"$2T+"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"states_total"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>50</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p><strong>Response (State - MA):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-json codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"success"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"data"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"level"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"state"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"location"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"MA"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"state"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"MA"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"jurisdictions_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"925"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"nonprofits_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"43,726"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"meetings_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"6,913"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"school_districts_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"306"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"contacts_display"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"362"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"budget_tracked"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"N/A"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"states_total"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=get-apistatsdetailed>GET /api/stats/detailed<a href=#get-apistatsdetailed class=hash-link aria-label="Direct link to GET /api/stats/detailed" title="Direct link to GET /api/stats/detailed" translate=no>โ</a></h3>
<p>Returns state-by-state breakdown.</p>
<p><strong>Response:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-json codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"success"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"data"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"..."</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"... (all fields from /stats)"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"state_breakdown"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"MA"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"nonprofits_organizations"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>43726</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"meetings"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>6913</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"contacts_nonprofit_officers"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>21</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"AL"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"..."</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"GA"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"..."</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"WA"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"..."</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"WI"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"..."</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=post-apistatsrefresh>POST /api/stats/refresh<a href=#post-apistatsrefresh class=hash-link aria-label="Direct link to POST /api/stats/refresh" title="Direct link to POST /api/stats/refresh" translate=no>โ</a></h3>
<p>Force refresh of statistics cache (useful after data imports).</p>
<p><strong>Response:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-json codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"success"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"message"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Statistics cache refreshed"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token property" style=color:#36acaa>"data"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"..."</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=how-calculations-work>How Calculations Work<a href=#how-calculations-work class=hash-link aria-label="Direct link to How Calculations Work" title="Direct link to How Calculations Work" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-count-parquet-records>1. Count Parquet Records<a href=#1-count-parquet-records class=hash-link aria-label="Direct link to 1. Count Parquet Records" title="Direct link to 1. Count Parquet Records" translate=no>โ</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>count_parquet_records</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">pattern</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>-</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> </span><span class="token builtin">int</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token triple-quoted-string string" style=color:#e3116c>"""Count total records across matching parquet files"""</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> files </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">Path</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'data/gold'</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">glob</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">pattern</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> total </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>0</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>for</span><span class="token plain"> </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>in</span><span class="token plain"> files</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> df </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> pd</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">read_parquet</span><span class="token punctuation" style=color:#393A34>(</span><span class="token builtin">file</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> total </span><span class="token operator" style=color:#393A34>+=</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">df</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> total</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-calculate-stats>2. Calculate Stats<a href=#2-calculate-stats class=hash-link aria-label="Direct link to 2. Calculate Stats" title="Direct link to 2. Calculate Stats" translate=no>โ</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>calculate_stats</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>-</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> Dict</span><span class="token punctuation" style=color:#393A34>[</span><span class="token builtin">str</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> Any</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># Count jurisdictions (cities, counties, townships, school districts)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> jurisdictions </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> count_parquet_records</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'reference/jurisdictions_*.parquet'</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># Count nonprofits across all states</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> nonprofits </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> count_parquet_records</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'states/*/nonprofits_organizations.parquet'</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># Count states with data</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> states_with_data </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style=color:#393A34>(</span><span class="token builtin">list</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">Path</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'data/gold/states'</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">glob</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'*/'</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># Extrapolate to all 50 states</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> extrapolation_factor </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>50</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>/</span><span class="token plain"> </span><span class="token builtin">max</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">states_with_data</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> projected_nonprofits </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token builtin">int</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">nonprofits </span><span class="token operator" style=color:#393A34>*</span><span class="token plain"> extrapolation_factor</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>'jurisdictions'</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> jurisdictions</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>'nonprofits_projected'</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">min</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">projected_nonprofits</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>3_500_000</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>'nonprofits_display'</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'3M+'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># ... more stats</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-cache-results>3. Cache Results<a href=#3-cache-results class=hash-link aria-label="Direct link to 3. Cache Results" title="Direct link to 3. Cache Results" translate=no>โ</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic># Cache stats for 1 hour</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">STATS_CACHE</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> Dict</span><span class="token punctuation" style=color:#393A34>[</span><span class="token builtin">str</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> Any</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">CACHE_TIMESTAMP</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> datetime </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>None</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">CACHE_DURATION </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> timedelta</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">hours</span><span class="token operator" style=color:#393A34>=</span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>get_cached_stats</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>-</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> Dict</span><span class="token punctuation" style=color:#393A34>[</span><span class="token builtin">str</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> Any</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>if</span><span class="token plain"> CACHE_TIMESTAMP </span><span class="token keyword" style=color:#00009f>and</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">now </span><span class="token operator" style=color:#393A34>-</span><span class="token plain"> CACHE_TIMESTAMP</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34><</span><span class="token plain"> CACHE_DURATION</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> STATS_CACHE </span><span class="token comment" style=color:#999988;font-style:italic># Return cached version</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># Calculate fresh stats</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> stats </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> calculate_stats</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> STATS_CACHE </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> stats</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> CACHE_TIMESTAMP </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> now</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> stats</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=frontend-integration>Frontend Integration<a href=#frontend-integration class=hash-link aria-label="Direct link to Frontend Integration" title="Direct link to Frontend Integration" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=auto-update-on-location-change>Auto-Update on Location Change<a href=#auto-update-on-location-change class=hash-link aria-label="Direct link to Auto-Update on Location Change" title="Direct link to Auto-Update on Location Change" translate=no>โ</a></h3>
<p>The frontend automatically fetches location-specific stats when the user selects their location:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// frontend/src/pages/HomeModern.tsx</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// Query key includes location.state to trigger refetch on change</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> data</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> statsData </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>useQuery</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> queryKey</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>[</span><span class="token string" style=color:#e3116c>'platform-stats'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> location</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">state</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token function-variable function" style=color:#d73a49>queryFn</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>async</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=></span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> params</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">any</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>if</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">location </span><span class="token operator" style=color:#393A34>&&</span><span class="token plain"> location</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">state</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> params</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">state </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> location</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">state</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>const</span><span class="token plain"> response </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>await</span><span class="token plain"> axios</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>get</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'/api/stats'</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> params </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> response</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">data</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">data</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> staleTime</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1000</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>*</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>60</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>*</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>60</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic>// Cache for 1 hour</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> refetchOnWindowFocus</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>false</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=contextual-display>Contextual Display<a href=#contextual-display class=hash-link aria-label="Direct link to Contextual Display" title="Direct link to Contextual Display" translate=no>โ</a></h3>
<p>The UI automatically adjusts based on the geographic level:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// Hero section subtitle</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain">statsData</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">level </span><span class="token operator" style=color:#393A34>===</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'state'</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>?</span><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>${</span><span class="token template-string interpolation">statsData</span><span class="token template-string interpolation punctuation" style=color:#393A34>.</span><span class="token template-string interpolation">nonprofits_display</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>}</span><span class="token template-string string" style=color:#e3116c> nonprofits in </span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>${</span><span class="token template-string interpolation">statsData</span><span class="token template-string interpolation punctuation" style=color:#393A34>.</span><span class="token template-string interpolation">location</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>}</span><span class="token template-string string" style=color:#e3116c> โข 100% free</span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>${</span><span class="token template-string interpolation">statsData</span><span class="token template-string interpolation punctuation" style=color:#393A34>.</span><span class="token template-string interpolation">jurisdictions_display</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>}</span><span class="token template-string string" style=color:#e3116c> cities โข </span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>${</span><span class="token template-string interpolation">statsData</span><span class="token template-string interpolation punctuation" style=color:#393A34>.</span><span class="token template-string interpolation">nonprofits_display</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>}</span><span class="token template-string string" style=color:#e3116c> nonprofits โข 100% free</span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// Stats section title</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain">statsData</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">level </span><span class="token operator" style=color:#393A34>===</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'state'</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>?</span><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token template-string string" style=color:#e3116c>Our Impact in </span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>${</span><span class="token template-string interpolation">statsData</span><span class="token template-string interpolation punctuation" style=color:#393A34>.</span><span class="token template-string interpolation">location</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>}</span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>'Our Impact'</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// Stats section subtitle</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain">statsData</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">level </span><span class="token operator" style=color:#393A34>===</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'state'</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>?</span><span class="token plain"> </span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token template-string string" style=color:#e3116c>Real numbers for </span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>${</span><span class="token template-string interpolation">statsData</span><span class="token template-string interpolation punctuation" style=color:#393A34>.</span><span class="token template-string interpolation">location</span><span class="token template-string interpolation interpolation-punctuation punctuation" style=color:#393A34>}</span><span class="token template-string string" style=color:#e3116c> from live data tables</span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token template-string string" style=color:#e3116c>Real numbers from real data tables</span><span class="token template-string template-punctuation string" style=color:#e3116c>`</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=user-flow>User Flow<a href=#user-flow class=hash-link aria-label="Direct link to User Flow" title="Direct link to User Flow" translate=no>โ</a></h3>
<ol>
<li class=""><strong>User lands on homepage</strong> โ Shows national stats</li>
<li class=""><strong>User selects location</strong> (via "Find My Community" tab) โ Address lookup finds state</li>
<li class=""><strong>Location context updates</strong> โ <code>location.state = 'MA'</code></li>
<li class=""><strong>Stats query refetches</strong> โ Query key changes, triggers new API call</li>
<li class=""><strong>UI updates automatically</strong> โ Shows "Our Impact in Massachusetts" with MA-specific numbers</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=example-screenshots>Example Screenshots<a href=#example-screenshots class=hash-link aria-label="Direct link to Example Screenshots" title="Direct link to Example Screenshots" translate=no>โ</a></h3>
<p><strong>Before selecting location:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">Our Impact</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">Real numbers from real data tables</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">85,302 Jurisdictions Tracked</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">3M+ Nonprofits & Churches </span><br/></div><div class=token-line style=color:#393A34><span class="token plain">203,990 Meeting Pages Analyzed</span><br/></div></code></pre></div></div>
<p><strong>After selecting Boston, MA:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">Our Impact in MA</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">Real numbers for MA from live data tables</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">925 Jurisdictions Tracked</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">43,726 Nonprofits & Churches</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">6,913 Meeting Pages Analyzed</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=performance>Performance<a href=#performance class=hash-link aria-label="Direct link to Performance" title="Direct link to Performance" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=before-hardcoded>Before (Hardcoded)<a href=#before-hardcoded class=hash-link aria-label="Direct link to Before (Hardcoded)" title="Direct link to Before (Hardcoded)" translate=no>โ</a></h3>
<ul>
<li class="">โก <strong>0ms</strong> - Instant, but wrong numbers</li>
<li class="">๐ <strong>Accuracy:</strong> 0% - Completely made up</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=after-real-data-multi-level>After (Real Data, Multi-Level)<a href=#after-real-data-multi-level class=hash-link aria-label="Direct link to After (Real Data, Multi-Level)" title="Direct link to After (Real Data, Multi-Level)" translate=no>โ</a></h3>
<ul>
<li class="">โก <strong>Under 2ms</strong> - From cache (after first calculation)</li>
<li class="">โฑ๏ธ <strong>~3s</strong> - Initial calculation (reads all parquet files)</li>
<li class="">๐ <strong>Refresh:</strong> Every 1 hour</li>
<li class="">๐ <strong>Accuracy:</strong> 100% - Real counts from actual data</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=maintenance>Maintenance<a href=#maintenance class=hash-link aria-label="Direct link to Maintenance" title="Direct link to Maintenance" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=adding-new-states>Adding New States<a href=#adding-new-states class=hash-link aria-label="Direct link to Adding New States" title="Direct link to Adding New States" translate=no>โ</a></h3>
<p>When new state data is added, stats automatically update on next refresh:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># After importing new state data</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl -X POST http://localhost:8000/api/stats/refresh</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=monitoring>Monitoring<a href=#monitoring class=hash-link aria-label="Direct link to Monitoring" title="Direct link to Monitoring" translate=no>โ</a></h3>
<p>Check current stats:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">curl http://localhost:8000/api/stats | jq .</span><br/></div></code></pre></div></div>
<p>Check state-by-state breakdown:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">curl http://localhost:8000/api/stats/detailed | jq .data.state_breakdown</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=troubleshooting>Troubleshooting<a href=#troubleshooting class=hash-link aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate=no>โ</a></h3>
<p><strong>Stats not updating when changing location?</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># Check React Query cache in browser DevTools</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Query key should change: ['platform-stats', 'MA'] vs ['platform-stats', null]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Force refresh state-specific cache</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl -X POST "http://localhost:8000/api/stats/refresh?state=MA"</span><br/></div></code></pre></div></div>
<p><strong>Want to see all cached levels?</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic># In API server logs, STATS_CACHE shows all levels:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>print</span><span class="token punctuation" style=color:#393A34>(</span><span class="token builtin">list</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">STATS_CACHE</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">keys</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic># Output: ['national', 'state:MA', 'state:CA', 'county:MA:Suffolk']</span><br/></div></code></pre></div></div>
<p><strong>State stats showing 0 for all metrics?</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># Check if state data files exist</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">ls -la data/gold/states/MA/</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Should see: nonprofits_organizations.parquet, meetings.parquet, etc.</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># If missing, download state data</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">python scripts/download_state_data.py MA</span><br/></div></code></pre></div></div>
<p><strong>Cache not expiring?</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic># Cache duration is 1 hour per level</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic># To change: edit CACHE_DURATION in api/routes/stats.py</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">CACHE_DURATION </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> timedelta</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">minutes</span><span class="token operator" style=color:#393A34>=</span><span class="token number" style=color:#36acaa>30</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic># 30 minutes instead</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=future-enhancements>Future Enhancements<a href=#future-enhancements class=hash-link aria-label="Direct link to Future Enhancements" title="Direct link to Future Enhancements" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=planned-features>Planned Features<a href=#planned-features class=hash-link aria-label="Direct link to Planned Features" title="Direct link to Planned Features" translate=no>โ</a></h3>
<ol>
<li class=""><strong>Real-time updates</strong> - WebSocket push when new data arrives</li>
<li class=""><strong>Historical trends</strong> - Track stats over time</li>
<li class=""><strong>State-level dashboards</strong> - Per-state statistics pages</li>
<li class=""><strong>Data quality metrics</strong> - Show completeness percentage</li>
<li class=""><strong>Export to CSV</strong> - Download stats for reporting</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=data-expansion>Data Expansion<a href=#data-expansion class=hash-link aria-label="Direct link to Data Expansion" title="Direct link to Data Expansion" translate=no>โ</a></h3>
<p>As we add more states, projections become more accurate:</p>
<table><thead><tr><th>States<th>Accuracy<th>Notes<tbody><tr><td>1-5 states<td>~60%<td>Heavy extrapolation<tr><td>10-25 states<td>~80%<td>Better representation<tr><td>25-50 states<td>~95%<td>Approaching actual totals<tr><td>50 states<td>100%<td>Actual counts, no projection</table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=files-changed>Files Changed<a href=#files-changed class=hash-link aria-label="Direct link to Files Changed" title="Direct link to Files Changed" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=new-files>New Files<a href=#new-files class=hash-link aria-label="Direct link to New Files" title="Direct link to New Files" translate=no>โ</a></h3>
<ul>
<li class="">โ
<code>api/routes/stats.py</code> - Stats API endpoint</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=modified-files>Modified Files<a href=#modified-files class=hash-link aria-label="Direct link to Modified Files" title="Direct link to Modified Files" translate=no>โ</a></h3>
<ul>
<li class="">โ
<code>api/main.py</code> - Added stats router</li>
<li class="">โ
<code>frontend/src/pages/HomeModern.tsx</code> - Fetch and display real stats</li>
<li class="">โ
<code>website/docs/development/real-time-statistics.md</code> - This documentation</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=testing>Testing<a href=#testing class=hash-link aria-label="Direct link to Testing" title="Direct link to Testing" translate=no>โ</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=manual-testing>Manual Testing<a href=#manual-testing class=hash-link aria-label="Direct link to Manual Testing" title="Direct link to Manual Testing" translate=no>โ</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># 1. Start API</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">cd /home/developer/projects/open-navigator</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">source .venv/bin/activate</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">uvicorn api.main:app --host 0.0.0.0 --port 8000 --reload</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># 2. Test endpoint</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl http://localhost:8000/api/stats | jq .</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># 3. Start frontend</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">cd frontend</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">npm run dev</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># 4. Visit http://localhost:5173 and check homepage stats</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=expected-results>Expected Results<a href=#expected-results class=hash-link aria-label="Direct link to Expected Results" title="Direct link to Expected Results" translate=no>โ</a></h3>
<ul>
<li class="">โ
Stats load within 2 seconds</li>
<li class="">โ
Numbers match API response</li>
<li class="">โ
No console errors</li>
<li class="">โ
Stats update after 1 hour or force refresh</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=summary>Summary<a href=#summary class=hash-link aria-label="Direct link to Summary" title="Direct link to Summary" translate=no>โ</a></h2>
<p>๐ <strong>The platform now shows real statistics with multi-level geographic filtering!</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=national-view-default>National View (Default)<a href=#national-view-default class=hash-link aria-label="Direct link to National View (Default)" title="Direct link to National View (Default)" translate=no>โ</a></h3>
<ul>
<li class="">๐ <strong>85,302 jurisdictions</strong> (real count from Census GID)</li>
<li class="">๐ข <strong>3M+ nonprofits</strong> (extrapolated from 5 states to 50)</li>
<li class="">๐ <strong>203,990 meetings</strong> (projected nationwide)</li>
<li class="">๐ <strong>13,326 school districts</strong> (real count from NCES)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=state-view-eg-massachusetts>State View (e.g., Massachusetts)<a href=#state-view-eg-massachusetts class=hash-link aria-label="Direct link to State View (e.g., Massachusetts)" title="Direct link to State View (e.g., Massachusetts)" translate=no>โ</a></h3>
<ul>
<li class="">๐ <strong>925 jurisdictions</strong> (MA cities, towns, counties)</li>
<li class="">๐ข <strong>43,726 nonprofits</strong> (actual count from IRS BMF)</li>
<li class="">๐ <strong>6,913 meetings</strong> (actual MA meeting transcripts)</li>
<li class="">๐ <strong>306 school districts</strong> (MA school districts)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=key-features>Key Features<a href=#key-features class=hash-link aria-label="Direct link to Key Features" title="Direct link to Key Features" translate=no>โ</a></h3>
<ul>
<li class="">โ
<strong>Automatic updates</strong> - Stats change when user selects location</li>
<li class="">โ
<strong>Multi-level caching</strong> - National, state, county, city cached separately</li>
<li class="">โ
<strong>Real data</strong> - All counts from actual parquet files</li>
<li class="">โ
<strong>Smart extrapolation</strong> - National view projects realistic totals</li>
<li class="">โ
<strong>Contextual UI</strong> - "Our Impact in Massachusetts" for state view</li>
<li class="">โ
<strong>Performance</strong> - 1-hour cache per geographic level (under 2ms from cache)</li>
</ul>
<p><strong>No more made-up numbers, and stats automatically adapt to user's location!</strong> ๐</div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href=https://github.com/getcommunityone/open-navigator-for-engagement/tree/main/website/docs/development/real-time-statistics.md target=_blank rel="noopener noreferrer" class=theme-edit-this-page><svg fill=currentColor height=20 width=20 viewBox="0 0 40 40" class=iconEdit_Z9Sw aria-hidden=true><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"/></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/docs/development/openstates-integration><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>OpenStates Integration & Contribution Opportunities</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/development/schema-migration-summary><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Schema Migration Summary</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#overview class="table-of-contents__link toc-highlight">Overview</a><li><a href=#-key-features class="table-of-contents__link toc-highlight">๐ฏ Key Features</a><li><a href=#what-changed class="table-of-contents__link toc-highlight">What Changed</a><ul><li><a href=#-before-hardcoded-no-geography class="table-of-contents__link toc-highlight">โ
Before (Hardcoded, No Geography)</a><li><a href=#-after-real-data-multi-level-geography class="table-of-contents__link toc-highlight">โ
After (Real Data, Multi-Level Geography)</a></ul><li><a href=#geographic-levels class="table-of-contents__link toc-highlight">Geographic Levels</a><ul><li><a href=#-national-default class="table-of-contents__link toc-highlight">๐ National (Default)</a><li><a href=#๏ธ-state-level class="table-of-contents__link toc-highlight">๐๏ธ State Level</a><li><a href=#๏ธ-county-level class="table-of-contents__link toc-highlight">๐๏ธ County Level</a><li><a href=#๏ธ-city-level class="table-of-contents__link toc-highlight">๐๏ธ City Level</a></ul><li><a href=#architecture class="table-of-contents__link toc-highlight">Architecture</a><ul><li><a href=#1-backend-stats-api-endpoint class="table-of-contents__link toc-highlight">1. Backend: Stats API Endpoint</a><li><a href=#2-frontend-dynamic-display class="table-of-contents__link toc-highlight">2. Frontend: Dynamic Display</a></ul><li><a href=#current-stats-as-of-2026-04-28 class="table-of-contents__link toc-highlight">Current Stats (as of 2026-04-28)</a><ul><li><a href=#comparison-by-geographic-level class="table-of-contents__link toc-highlight">Comparison by Geographic Level</a><li><a href=#cache-structure class="table-of-contents__link toc-highlight">Cache Structure</a><li><a href=#actual-counts-all-states-combined class="table-of-contents__link toc-highlight">Actual Counts (All States Combined)</a><li><a href=#projected-50-states class="table-of-contents__link toc-highlight">Projected (50 States)</a><li><a href=#static-metrics class="table-of-contents__link toc-highlight">Static Metrics</a></ul><li><a href=#api-endpoints class="table-of-contents__link toc-highlight">API Endpoints</a><ul><li><a href=#get-apistats class="table-of-contents__link toc-highlight">GET /api/stats</a><li><a href=#get-apistatsdetailed class="table-of-contents__link toc-highlight">GET /api/stats/detailed</a><li><a href=#post-apistatsrefresh class="table-of-contents__link toc-highlight">POST /api/stats/refresh</a></ul><li><a href=#how-calculations-work class="table-of-contents__link toc-highlight">How Calculations Work</a><ul><li><a href=#1-count-parquet-records class="table-of-contents__link toc-highlight">1. Count Parquet Records</a><li><a href=#2-calculate-stats class="table-of-contents__link toc-highlight">2. Calculate Stats</a><li><a href=#3-cache-results class="table-of-contents__link toc-highlight">3. Cache Results</a></ul><li><a href=#frontend-integration class="table-of-contents__link toc-highlight">Frontend Integration</a><ul><li><a href=#auto-update-on-location-change class="table-of-contents__link toc-highlight">Auto-Update on Location Change</a><li><a href=#contextual-display class="table-of-contents__link toc-highlight">Contextual Display</a><li><a href=#user-flow class="table-of-contents__link toc-highlight">User Flow</a><li><a href=#example-screenshots class="table-of-contents__link toc-highlight">Example Screenshots</a></ul><li><a href=#performance class="table-of-contents__link toc-highlight">Performance</a><ul><li><a href=#before-hardcoded class="table-of-contents__link toc-highlight">Before (Hardcoded)</a><li><a href=#after-real-data-multi-level class="table-of-contents__link toc-highlight">After (Real Data, Multi-Level)</a></ul><li><a href=#maintenance class="table-of-contents__link toc-highlight">Maintenance</a><ul><li><a href=#adding-new-states class="table-of-contents__link toc-highlight">Adding New States</a><li><a href=#monitoring class="table-of-contents__link toc-highlight">Monitoring</a><li><a href=#troubleshooting class="table-of-contents__link toc-highlight">Troubleshooting</a></ul><li><a href=#future-enhancements class="table-of-contents__link toc-highlight">Future Enhancements</a><ul><li><a href=#planned-features class="table-of-contents__link toc-highlight">Planned Features</a><li><a href=#data-expansion class="table-of-contents__link toc-highlight">Data Expansion</a></ul><li><a href=#files-changed class="table-of-contents__link toc-highlight">Files Changed</a><ul><li><a href=#new-files class="table-of-contents__link toc-highlight">New Files</a><li><a href=#modified-files class="table-of-contents__link toc-highlight">Modified Files</a></ul><li><a href=#testing class="table-of-contents__link toc-highlight">Testing</a><ul><li><a href=#manual-testing class="table-of-contents__link toc-highlight">Manual Testing</a><li><a href=#expected-results class="table-of-contents__link toc-highlight">Expected Results</a></ul><li><a href=#summary class="table-of-contents__link toc-highlight">Summary</a><ul><li><a href=#national-view-default class="table-of-contents__link toc-highlight">National View (Default)</a><li><a href=#state-view-eg-massachusetts class="table-of-contents__link toc-highlight">State View (e.g., Massachusetts)</a><li><a href=#key-features class="table-of-contents__link toc-highlight">Key Features</a></ul></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Documentation</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/intro>Getting Started</a><li class=footer__item><a class=footer__link-item href=/docs/data-sources/citations>Citations & Data Sources</a><li class=footer__item><a class=footer__link-item href=/docs/data-sources/overview>Data Sources</a><li class=footer__item><a class=footer__link-item href=/docs/for-developers>For Developers</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Resources</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://www.communityone.com target=_blank rel="noopener noreferrer" class=footer__link-item>Launch Open Navigator<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://github.com/getcommunityone/open-navigator-for-engagement target=_blank rel="noopener noreferrer" class=footer__link-item>GitHub<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.groundvue.org/ target=_blank rel="noopener noreferrer" class=footer__link-item>GroundVue (Partner)<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://www.instagram.com/getcommunityone/ target=_blank rel="noopener noreferrer" class=footer__link-item>Instagram<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.facebook.com/getcommunityone target=_blank rel="noopener noreferrer" class=footer__link-item>Facebook<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://x.com/getcommunityone/ target=_blank rel="noopener noreferrer" class=footer__link-item>X (Twitter)<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.linkedin.com/company/getcommunityone target=_blank rel="noopener noreferrer" class=footer__link-item>LinkedIn<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.youtube.com/@getcommunityone target=_blank rel="noopener noreferrer" class=footer__link-item>YouTube<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://discord.gg/uH6Dytek target=_blank rel="noopener noreferrer" class=footer__link-item>Discord<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Legal</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/legal/privacy-policy>Privacy Policy</a><li class=footer__item><a class=footer__link-item href=/docs/legal/terms-of-service>Terms of Service</a><li class=footer__item><a class=footer__link-item href=/docs/legal/data-provider-terms>Data Provider Terms</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>More</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/blog>Blog</a><li class=footer__item><a href=https://github.com/getcommunityone/open-navigator-for-engagement/blob/main/LICENSE target=_blank rel="noopener noreferrer" class=footer__link-item>License (MIT)<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div></div><div class="footer__bottom text--center"><div class=footer__copyright>Copyright ยฉ 2026 Community One. Built with Docusaurus.</div></div></div></footer></div></body> |