File size: 74,063 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
<!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/api-logging-errors" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.0"><title data-rh=true>API Logging & Error Handling Implementation | 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/api-logging-errors /><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="API Logging & Error Handling Implementation | Open Navigator"/><meta data-rh=true name=description content="Summary of Changes"/><meta data-rh=true property=og:description content="Summary of Changes"/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://www.communityone.com/docs/development/api-logging-errors /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/api-logging-errors hreflang=en /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/api-logging-errors 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/api-logging-errors","name":"API Logging & Error Handling Implementation","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 menu__link--active" aria-current=page 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 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>API Logging & Error Handling Implementation</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>API Logging & Error Handling Implementation</h1></header>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=summary-of-changes>Summary of Changes<a href=#summary-of-changes class=hash-link aria-label="Direct link to Summary of Changes" title="Direct link to Summary of Changes" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-comprehensive-logging-configuration-apimainpy>1. <strong>Comprehensive Logging Configuration</strong> (<a class="" href=/docs/development/api/main.py>api/main.py</a>)<a href=#1-comprehensive-logging-configuration-apimainpy class=hash-link aria-label="Direct link to 1-comprehensive-logging-configuration-apimainpy" title="Direct link to 1-comprehensive-logging-configuration-apimainpy" translate=no></a></h3>
<p>Added dual-output logging that appears in both files and container logs:</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># Console output (shows in HuggingFace container logs)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">logger</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">add</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">    sys</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">stderr</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 builtin">format</span><span class="token operator" style=color:#393A34>=</span><span class="token string" style=color:#e3116c>"&lt;green>{time:YYYY-MM-DD HH:mm:ss}&lt;/green> | &lt;level>{level: &lt;8}&lt;/level> | ..."</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">    level</span><span class="token operator" style=color:#393A34>=</span><span class="token plain">settings</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">log_level</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># File output with rotation and retention</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">logger</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">add</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">    settings</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">log_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">    rotation</span><span class="token operator" style=color:#393A34>=</span><span class="token string" style=color:#e3116c>"500 MB"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain">      </span><span class="token comment" style=color:#999988;font-style:italic># New file when size exceeds 500MB</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    retention</span><span class="token operator" style=color:#393A34>=</span><span class="token string" style=color:#e3116c>"10 days"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain">    </span><span class="token comment" style=color:#999988;font-style:italic># Auto-delete logs older than 10 days</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    level</span><span class="token operator" style=color:#393A34>=</span><span class="token plain">settings</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">log_level</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>Benefits:</strong></p>
<ul>
<li class="">✅ Logs visible in HuggingFace Spaces container logs</li>
<li class="">✅ Automatic rotation prevents disk space issues</li>
<li class="">✅ 10-day retention for compliance and debugging</li>
</ul>
<hr/>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-automatic-request-logging-middleware-apimainpy>2. <strong>Automatic Request Logging Middleware</strong> (<a class="" href=/docs/development/api/main.py>api/main.py</a>)<a href=#2-automatic-request-logging-middleware-apimainpy class=hash-link aria-label="Direct link to 2-automatic-request-logging-middleware-apimainpy" title="Direct link to 2-automatic-request-logging-middleware-apimainpy" translate=no></a></h3>
<p>Every API request is automatically logged with:</p>
<ul>
<li class="">Request method & path</li>
<li class="">Client IP address</li>
<li class="">Response status code</li>
<li class="">Request duration (milliseconds)</li>
<li class="">Response size (bytes)</li>
</ul>
<p><strong>Example Log Output:</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">➡️  GET /api/bills?state=ma - Client: 192.168.1.1</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">✅ GET /api/bills?state=ma - Status: 200 - Duration: 45.32ms - Size: 12834 bytes</span><br/></div></code></pre></div></div>
<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">➡️  POST /api/search/ - Client: 10.0.0.5</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">⚠️  POST /api/search/ - Status: 404 - Duration: 12.45ms</span><br/></div></code></pre></div></div>
<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">➡️  GET /api/stats - Client: 172.16.0.1</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">❌ GET /api/stats - Status: 500 - Duration: 234.12ms</span><br/></div></code></pre></div></div>
<hr/>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-startup-data-validation-apimainpy>3. <strong>Startup Data Validation</strong> (<a class="" href=/docs/development/api/main.py>api/main.py</a>)<a href=#3-startup-data-validation-apimainpy class=hash-link aria-label="Direct link to 3-startup-data-validation-apimainpy" title="Direct link to 3-startup-data-validation-apimainpy" translate=no></a></h3>
<p>API now validates data availability on startup:</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">================================================================================</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">🚀 STARTING Open Navigator API</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">Configuration: oral_health.policy_analysis</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">Log Level: INFO</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">Log File: logs/oral-health-policy-pulse.log</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">📊 VALIDATING DATA AVAILABILITY...</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">  ✅ reference/jurisdictions_cities.parquet: 19,502 records (2.45 MB)</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  ✅ reference/jurisdictions_counties.parquet: 3,143 records (0.34 MB)</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  ✅ reference/causes_ntee_codes.parquet: 645 records (0.02 MB)</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">📍 STATE DATA AVAILABILITY:</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  ✅ AL: nonprofits, officials, events</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  ✅ AK: nonprofits, officials</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  ... and 42 more states</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">  📊 Total states with data: 50</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><br/></div><div class=token-line style=color:#393A34><span class="token plain">✅ API READY - 3/3 critical files available</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">================================================================================</span><br/></div></code></pre></div></div>
<p><strong>Benefits:</strong></p>
<ul>
<li class="">Catch missing data files before users encounter errors</li>
<li class="">Clear visibility into what data is available</li>
<li class="">Early warning for data pipeline issues</li>
</ul>
<hr/>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=4-structured-error-responses-apimodelserrorspy>4. <strong>Structured Error Responses</strong> (<a class="" href=/docs/development/api/models/errors.py>api/models/errors.py</a>)<a href=#4-structured-error-responses-apimodelserrorspy class=hash-link aria-label="Direct link to 4-structured-error-responses-apimodelserrorspy" title="Direct link to 4-structured-error-responses-apimodelserrorspy" translate=no></a></h3>
<p>Instead of raw error dumps, users now receive helpful, structured errors:</p>
<p><strong>Old Response (Bad):</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>"detail"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"HTTP Error: HTTP GET error on 'https://huggingface.co/datasets/...' (HTTP 404 Not Found)..."</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>New Response (Good):</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>"message"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"No bills data available for 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>"error_type"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"data_not_found"</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>"technical_details"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Dataset 'CommunityOne/states-ma-bills-bills' not found on HuggingFace.\n\nFull error: HTTP GET error..."</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>"suggestions"</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>"Try a different state - we have data for 50+ 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 string" style=color:#e3116c>"Check /api/bills/map to see which states have bills 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 string" style=color:#e3116c>"Contact support if you believe this data should be available"</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>"metadata"</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>"dataset"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"CommunityOne/states-ma-bills-bills"</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>"data_type"</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"bills"</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>Error Types Handled:</strong></p>
<ul>
<li class=""><code>data_not_found</code> - Missing datasets or files</li>
<li class=""><code>network_error</code> - Timeouts and connection issues</li>
<li class=""><code>query_error</code> - Invalid SQL/DuckDB queries</li>
<li class=""><code>validation_error</code> - Invalid parameters</li>
<li class=""><code>server_error</code> - Unexpected errors</li>
</ul>
<p><strong>Updated Endpoints:</strong></p>
<ul>
<li class=""><code>/api/bills</code> - Bill search</li>
<li class=""><code>/api/bills/sessions</code> - Session list</li>
<li class=""><code>/api/bills/map</code> - Map data</li>
<li class=""><code>/api/search</code> - Unified search</li>
<li class=""><code>/api/search/suggest</code> - Suggestions</li>
</ul>
<hr/>
<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>
<p>The frontend can now show errors like this:</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>// Error response structure</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>interface</span><span class="token plain"> </span><span class="token class-name">ErrorDetail</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">  message</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain">              </span><span class="token comment" style=color:#999988;font-style:italic>// User-friendly message (always show)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  error_type</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain">          </span><span class="token comment" style=color:#999988;font-style:italic>// Error category</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  technical_details</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">string</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain">  </span><span class="token comment" style=color:#999988;font-style:italic>// Full error (show in expandable section)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  suggestions</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">string</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 comment" style=color:#999988;font-style:italic>// Helpful tips</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  metadata</span><span class="token operator" style=color:#393A34>?</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> Record</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token builtin">string</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token builtin">any</span><span class="token operator" 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" 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>// Example usage in React</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>try</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"> api</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/bills?state=MA'</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><span class="token keyword" style=color:#00009f>catch</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">error</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">  </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">error</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">response</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">data</span><span class="token operator" style=color:#393A34>?.</span><span class="token plain">message</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">    </span><span class="token comment" style=color:#999988;font-style:italic>// Show user-friendly message</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    </span><span class="token function" style=color:#d73a49>showError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">error</span><span class="token punctuation" style=color:#393A34>.</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">message</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>// Option to expand technical details</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">error</span><span class="token punctuation" style=color:#393A34>.</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">technical_details</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">      </span><span class="token function" style=color:#d73a49>showExpandableDetails</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">error</span><span class="token punctuation" style=color:#393A34>.</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">technical_details</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><br/></div><div class=token-line style=color:#393A34><span class="token plain">    </span><span class="token comment" style=color:#999988;font-style:italic>// Show suggestions</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">error</span><span class="token punctuation" style=color:#393A34>.</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">suggestions</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">      </span><span class="token function" style=color:#d73a49>showSuggestions</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">error</span><span class="token punctuation" style=color:#393A34>.</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">suggestions</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 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>UI Example:</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">❌ No bills data available for 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">💡 Suggestions:</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  • Try a different state - we have data for 50+ states</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  • Check /api/bills/map to see which states have bills data</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">[Show Technical Details ▼]</span><br/></div></code></pre></div></div>
<p>Expanded:</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">❌ No bills data available for 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">💡 Suggestions:</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  • Try a different state - we have data for 50+ states</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  • Check /api/bills/map to see which states have bills data</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">[Hide Technical Details ▲]</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">Dataset 'CommunityOne/states-ma-bills-bills' not found on HuggingFace.</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">Full error: HTTP GET error on 'https://huggingface.co/datasets/...'</span><br/></div></code></pre></div></div>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=huggingface-container-logs>HuggingFace Container Logs<a href=#huggingface-container-logs class=hash-link aria-label="Direct link to HuggingFace Container Logs" title="Direct link to HuggingFace Container Logs" translate=no></a></h2>
<p><strong>Yes, logs will appear in HuggingFace Spaces container logs!</strong></p>
<p>The <code>logger.add(sys.stderr, ...)</code> configuration ensures all logs are written to stderr, which Docker/HuggingFace captures and displays in the container log console.</p>
<p>You'll see:</p>
<ol>
<li class="">✅ Startup validation logs</li>
<li class="">✅ Request/response logs for every API call</li>
<li class="">✅ Detailed error logs with context</li>
</ol>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=configuration>Configuration<a href=#configuration class=hash-link aria-label="Direct link to Configuration" title="Direct link to Configuration" translate=no></a></h2>
<p>Logging is controlled by environment variables in <code>.env</code>:</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"># Logging Configuration</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">LOG_LEVEL=INFO        # DEBUG, INFO, WARNING, ERROR</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">LOG_FILE=logs/oral-health-policy-pulse.log</span><br/></div></code></pre></div></div>
<p><strong>Log Rotation:</strong></p>
<ul>
<li class="">New file created when size exceeds 500 MB</li>
<li class="">Format: <code>oral-health-policy-pulse.log</code>, <code>oral-health-policy-pulse.log.1</code>, etc.</li>
</ul>
<p><strong>Log Retention:</strong></p>
<ul>
<li class="">Files older than 10 days are automatically deleted</li>
<li class="">Prevents disk space issues in production</li>
</ul>
<hr/>
<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>
<p>Test the new error responses:</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"># Test missing data error</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">curl https://www.communityone.com/api/bills?state=ZZ</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"># Expected response:</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">  "message": "No bills data available for ZZ",</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  "error_type": "data_not_found",</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  "suggestions": ["Try a different state - we have data for 50+ states", ...],</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  "metadata": {"state": "ZZ", "data_type": "bills"}</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">}</span><br/></div></code></pre></div></div>
<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"># View container logs (HuggingFace Spaces)</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Look for:</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># - 🚀 STARTING... header</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># - ➡️ Request logs</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># - ✅/❌ Response logs</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># - 📊 Data validation results</span><br/></div></code></pre></div></div>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=benefits>Benefits<a href=#benefits class=hash-link aria-label="Direct link to Benefits" title="Direct link to Benefits" translate=no></a></h2>
<ol>
<li class="">
<p><strong>Better User Experience</strong></p>
<ul>
<li class="">Clear, actionable error messages</li>
<li class="">Suggestions for next steps</li>
<li class="">Option to see technical details</li>
</ul>
</li>
<li class="">
<p><strong>Easier Debugging</strong></p>
<ul>
<li class="">All requests logged with timing</li>
<li class="">Structured error context</li>
<li class="">Full stack traces in logs</li>
</ul>
</li>
<li class="">
<p><strong>Production Ready</strong></p>
<ul>
<li class="">Automatic log rotation</li>
<li class="">Configurable retention</li>
<li class="">Visible in container logs</li>
</ul>
</li>
<li class="">
<p><strong>Compliance</strong></p>
<ul>
<li class="">Complete audit trail of API usage</li>
<li class="">Automatic cleanup of old logs</li>
<li class="">Configurable log levels</li>
</ul>
</li>
</ol></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/api-logging-errors.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/adding-data-sources><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Adding New Data Sources</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/development/openstates-integration><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>OpenStates Integration & Contribution Opportunities</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=#summary-of-changes class="table-of-contents__link toc-highlight">Summary of Changes</a><ul><li><a href=#1-comprehensive-logging-configuration-apimainpy class="table-of-contents__link toc-highlight">1. <strong>Comprehensive Logging Configuration</strong> (api/main.py)</a><li><a href=#2-automatic-request-logging-middleware-apimainpy class="table-of-contents__link toc-highlight">2. <strong>Automatic Request Logging Middleware</strong> (api/main.py)</a><li><a href=#3-startup-data-validation-apimainpy class="table-of-contents__link toc-highlight">3. <strong>Startup Data Validation</strong> (api/main.py)</a><li><a href=#4-structured-error-responses-apimodelserrorspy class="table-of-contents__link toc-highlight">4. <strong>Structured Error Responses</strong> (api/models/errors.py)</a></ul><li><a href=#frontend-integration class="table-of-contents__link toc-highlight">Frontend Integration</a><li><a href=#huggingface-container-logs class="table-of-contents__link toc-highlight">HuggingFace Container Logs</a><li><a href=#configuration class="table-of-contents__link toc-highlight">Configuration</a><li><a href=#testing class="table-of-contents__link toc-highlight">Testing</a><li><a href=#benefits class="table-of-contents__link toc-highlight">Benefits</a></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>