File size: 94,527 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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
<!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/adding-data-sources" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.0"><title data-rh=true>Adding New Data Sources - Compliance Checklist | 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/adding-data-sources /><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="Adding New Data Sources - Compliance Checklist | Open Navigator"/><meta data-rh=true name=description content="Before integrating any new data source, work through this checklist to ensure legal compliance, proper attribution, and best practices."/><meta data-rh=true property=og:description content="Before integrating any new data source, work through this checklist to ensure legal compliance, proper attribution, and best practices."/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://www.communityone.com/docs/development/adding-data-sources /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/adding-data-sources hreflang=en /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/adding-data-sources 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/adding-data-sources","name":"Adding New Data Sources","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 menu__link--active" aria-current=page 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 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>Adding New Data Sources</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>Adding New Data Sources - Compliance Checklist</h1></header>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>Use This Checklist</div><div class=admonitionContent_BuS1><p><strong>Before integrating any new data source</strong>, work through this checklist to ensure legal compliance, proper attribution, and best practices.</div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-pre-integration-checklist>βœ… Pre-Integration Checklist<a href=#-pre-integration-checklist class=hash-link aria-label="Direct link to βœ… Pre-Integration Checklist" title="Direct link to βœ… Pre-Integration Checklist" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-legal-review>1. Legal Review<a href=#1-legal-review class=hash-link aria-label="Direct link to 1. Legal Review" title="Direct link to 1. Legal Review" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Find and read the Terms of Service</strong></p>
<ul>
<li class="">API Terms of Service URL: _________________</li>
<li class="">Data Usage Policy URL: _________________</li>
<li class="">Last reviewed: _________________</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Verify the data is legally accessible</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Public domain (U.S. Government data)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Open license (CC0, CC-BY, MIT, etc.)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Free API with terms of service</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Paid API with commercial license</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Check for usage restrictions</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No restrictions on commercial use</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No restrictions on redistribution</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No prohibition on caching/storage</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No requirement for user consent/opt-in</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Identify attribution requirements</strong></p>
<ul>
<li class="">Required attribution text: _________________</li>
<li class="">Logo/trademark requirements: _________________</li>
<li class="">Link-back requirements: _________________</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-api-access--rate-limits>2. API Access & Rate Limits<a href=#2-api-access--rate-limits class=hash-link aria-label="Direct link to 2. API Access & Rate Limits" title="Direct link to 2. API Access & Rate Limits" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>API Key Requirements</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No API key required βœ…</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Free API key (document registration process)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Paid API key (not recommended for open-source project)</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Rate Limits</strong></p>
<ul>
<li class="">Requests per second: _________________</li>
<li class="">Requests per day: _________________</li>
<li class="">Requests per month: _________________</li>
<li class="">Recommended delay between requests: _________________</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>User-Agent Requirements</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Custom User-Agent required</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Contact email required</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Project URL required</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-data-privacy--personal-information>3. Data Privacy & Personal Information<a href=#3-data-privacy--personal-information class=hash-link aria-label="Direct link to 3. Data Privacy & Personal Information" title="Direct link to 3. Data Privacy & Personal Information" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Data Type Classification</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Public records only (government data)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Aggregated statistics only (no individuals)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Individual-level data from public sources</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Personal information requiring consent (AVOID)</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Privacy Compliance</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Data is public record</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No personal financial information</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No health information (PHI)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No authentication required to access original data</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>GDPR Considerations</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Right to be forgotten process documented</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Legal basis identified (public interest, legitimate interest)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Data minimization applied</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=4-technical-requirements>4. Technical Requirements<a href=#4-technical-requirements class=hash-link aria-label="Direct link to 4. Technical Requirements" title="Direct link to 4. Technical Requirements" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>API Documentation</strong></p>
<ul>
<li class="">API documentation URL: _________________</li>
<li class="">SDK/client library available: _________________</li>
<li class="">Code examples available: _________________</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Data Format</strong></p>
<ul>
<li class="">Response format (JSON, XML, CSV): _________________</li>
<li class="">Pagination supported: Yes / No</li>
<li class="">Batch operations supported: Yes / No</li>
</ul>
</li>
<li class=task-list-item>
<p><input type=checkbox disabled/> <strong>Error Handling</strong></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Rate limit error codes documented</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Retry strategy defined</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Timeout handling planned</li>
</ul>
</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-implementation-checklist>πŸ“ Implementation Checklist<a href=#-implementation-checklist class=hash-link aria-label="Direct link to πŸ“ Implementation Checklist" title="Direct link to πŸ“ Implementation Checklist" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-create-integration-module>1. Create Integration Module<a href=#1-create-integration-module class=hash-link aria-label="Direct link to 1. Create Integration Module" title="Direct link to 1. Create Integration Module" translate=no>​</a></h3>
<p>Create file: <code>discovery/{source_name}_integration.py</code></p>
<p><strong>Required docstring elements:</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 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>[Source Name] Integration</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=display:inline-block;color:#e3116c></span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>[Brief description of what this source provides]</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=display:inline-block;color:#e3116c></span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>Data Source: [Official URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>API Documentation: [API docs URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>Terms of Use: [Terms of Service URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>License: [Data license]</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=display:inline-block;color:#e3116c></span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>Key Features:</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>- Feature 1</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>- Feature 2</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>- Feature 3</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=display:inline-block;color:#e3116c></span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>Use Cases:</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>- Use case 1</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>- Use case 2</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=display:inline-block;color:#e3116c></span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>Author: Open Navigator</span><br/></div><div class=token-line style=color:#393A34><span class="token triple-quoted-string string" style=color:#e3116c>License: MIT</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>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-implement-rate-limiting>2. Implement Rate Limiting<a href=#2-implement-rate-limiting class=hash-link aria-label="Direct link to 2. Implement Rate Limiting" title="Direct link to 2. Implement Rate Limiting" 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>import</span><span class="token plain"> time</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> asyncio</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>class</span><span class="token plain"> </span><span class="token class-name">DataSourceClient</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>def</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>__init__</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">self</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">        self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">request_delay </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1.0</span><span class="token plain">  </span><span class="token comment" style=color:#999988;font-style:italic># seconds between requests</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">        self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">last_request_time </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><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>_rate_limit</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">self</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>"""Enforce rate limiting"""</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">        elapsed </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> time</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">time</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"> self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">last_request_time</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"> elapsed </span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain"> self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">request_delay</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>await</span><span class="token plain"> asyncio</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">sleep</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">request_delay </span><span class="token operator" style=color:#393A34>-</span><span class="token plain"> elapsed</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">        self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">last_request_time </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> time</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">time</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=3-set-user-agent-header>3. Set User-Agent Header<a href=#3-set-user-agent-header class=hash-link aria-label="Direct link to 3. Set User-Agent Header" title="Direct link to 3. Set User-Agent Header" 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 plain">self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">session</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">headers</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">update</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>'User-Agent'</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'CommunityOne/1.0 (Civic Engagement Platform; https://communityone.com/)'</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>'Accept'</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>'application/json'</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><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=4-handle-api-keys-securely>4. Handle API Keys Securely<a href=#4-handle-api-keys-securely class=hash-link aria-label="Direct link to 4. Handle API Keys Securely" title="Direct link to 4. Handle API Keys Securely" translate=no>​</a></h3>
<p><strong>Add to <code>.env.example</code>:</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"># [Source Name] API Key</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Get your key at: [Registration URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Free tier: [Quota details]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">[SOURCE]_API_KEY=your-api-key-here</span><br/></div></code></pre></div></div>
<p><strong>Load from environment:</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 keyword" style=color:#00009f>import</span><span class="token plain"> os</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>from</span><span class="token plain"> dotenv </span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> load_dotenv</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">load_dotenv</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">api_key </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> os</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">getenv</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>'[SOURCE]_API_KEY'</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 keyword" style=color:#00009f>not</span><span class="token plain"> api_key</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">    logger</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">warning</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"⚠️  [SOURCE]_API_KEY not found"</span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=5-add-error-handling>5. Add Error Handling<a href=#5-add-error-handling class=hash-link aria-label="Direct link to 5. Add Error Handling" title="Direct link to 5. Add Error Handling" 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>try</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">    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"> self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">session</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">get</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">url</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">    response</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">raise_for_status</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">json</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>except</span><span class="token plain"> httpx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">HTTPStatusError </span><span class="token keyword" style=color:#00009f>as</span><span class="token plain"> e</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"> e</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">status_code </span><span class="token operator" style=color:#393A34>==</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>429</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain">  </span><span class="token comment" style=color:#999988;font-style:italic># Rate limited</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">warning</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-interpolation string" style=color:#e3116c>f"Rate limited, waiting..."</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>await</span><span class="token plain"> asyncio</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">sleep</span><span class="token punctuation" style=color:#393A34>(</span><span class="token number" style=color:#36acaa>60</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"> self</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">_fetch</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">url</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain">  </span><span class="token comment" style=color:#999988;font-style:italic># Retry</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>else</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">        logger</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 string-interpolation string" style=color:#e3116c>f"HTTP error: </span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>}</span><span class="token string-interpolation string" style=color:#e3116c>"</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>raise</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>except</span><span class="token plain"> Exception </span><span class="token keyword" style=color:#00009f>as</span><span class="token plain"> e</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">    logger</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 string-interpolation string" style=color:#e3116c>f"Failed to fetch data: </span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>}</span><span class="token string-interpolation string" style=color:#e3116c>"</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>raise</span><br/></div></code></pre></div></div>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-documentation-checklist>πŸ“š Documentation Checklist<a href=#-documentation-checklist class=hash-link aria-label="Direct link to πŸ“š Documentation Checklist" title="Direct link to πŸ“š Documentation Checklist" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-update-legal-compliance-document>1. Update Legal Compliance Document<a href=#1-update-legal-compliance-document class=hash-link aria-label="Direct link to 1. Update Legal Compliance Document" title="Direct link to 1. Update Legal Compliance Document" translate=no>​</a></h3>
<p>Add to: <code>website/docs/legal-compliance.md</code></p>
<p><strong>Template:</strong></p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token title important punctuation" style=color:#393A34>###</span><span class="token title important"> [Source Name]</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 bold punctuation" style=color:#393A34>**</span><span class="token bold content">Data Type:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> [Description]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token bold content">Source:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> [Official URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token bold content">API Documentation:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> [API docs URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token bold content">License:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> [License type]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token bold content">Terms of Use:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> [ToS URL]</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 bold punctuation" style=color:#393A34>**</span><span class="token bold content">Compliance Status:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> βœ… </span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token bold content">COMPLIANT</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> / ⚠️ </span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token bold content">NOT USED</span><span class="token bold 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 list punctuation" style=color:#393A34>-</span><span class="token plain"> [Key compliance point 1]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token list punctuation" style=color:#393A34>-</span><span class="token plain"> [Key compliance point 2]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token list punctuation" style=color:#393A34>-</span><span class="token plain"> API key requirement: Yes/No</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token list punctuation" style=color:#393A34>-</span><span class="token plain"> Rate limit: [Details]</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 bold punctuation" style=color:#393A34>**</span><span class="token bold content">Implementation:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"> </span><span class="token code-snippet code keyword" style=color:#00009f>`discovery/[filename].py`</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 bold punctuation" style=color:#393A34>**</span><span class="token bold content">Use Policy Key Points:</span><span class="token bold 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 list punctuation" style=color:#393A34>-</span><span class="token plain"> [Policy point 1]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token list punctuation" style=color:#393A34>-</span><span class="token plain"> [Policy point 2]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token list punctuation" style=color:#393A34>-</span><span class="token plain"> [Attribution requirements]</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 bold punctuation" style=color:#393A34>**</span><span class="token bold content">Environment Variable:</span><span class="token bold punctuation" style=color:#393A34>**</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">```bash</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">[SOURCE]_API_KEY=your-api-key-here</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" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">### 2. Update Citations Page</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">Add to: `website/docs/data-sources/citations.md`</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">**Template:**</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">```markdown</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">### [Source Name]</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">**Organization:** [Organization name]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">**What we use:** [Description of how we use this 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">- **Source:** [Official URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">- **API Documentation:** [API docs URL]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">- **Coverage:** [Geographic/temporal coverage]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">- **License:** [License details]</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">- **Access:** [API key requirements]</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">**BibTeX:**</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">```bibtex</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">@misc{[citation_key],</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  author = {{[Organization Name]}},</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  title = {[Dataset/API Name]},</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  year = {2026},</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  url = {[Official URL]},</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">  note = {Accessed: 2026}</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">}</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" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">### 3. Update API Integration Status</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">Add to: `docs/API_INTEGRATION_STATUS.md`</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">Document integration status, free vs paid, key requirements, and code examples.</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. Add Usage Examples</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">Create or update: `examples/demo_[source_name].py`</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">```python</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">#!/usr/bin/env python3</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">Example: [Source Name] Integration</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">Demonstrates how to fetch data from [Source Name] 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" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">import asyncio</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">from discovery.[source_name]_integration import [ClassName]</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">async def main():</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    """Example usage"""</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    client = [ClassName](api_key="your-key-here")</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">    # Example query</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    results = await client.fetch_data(param="value")</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">    print(f"Found {len(results)} results")</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    for item in results[:5]:</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">        print(f"  - {item}")</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 __name__ == "__main__":</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">    asyncio.run(main())</span><br/></div></code></pre></div></div>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-testing-checklist>πŸ§ͺ Testing Checklist<a href=#-testing-checklist class=hash-link aria-label="Direct link to πŸ§ͺ Testing Checklist" title="Direct link to πŸ§ͺ Testing Checklist" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-unit-tests>1. Unit Tests<a href=#1-unit-tests class=hash-link aria-label="Direct link to 1. Unit Tests" title="Direct link to 1. Unit Tests" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test API client initialization</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test successful data fetch</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test rate limiting</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test error handling (404, 500, 429)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test API key validation</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-integration-tests>2. Integration Tests<a href=#2-integration-tests class=hash-link aria-label="Direct link to 2. Integration Tests" title="Direct link to 2. Integration Tests" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test with real API (if free tier available)</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test with demo/sandbox environment</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Verify data format matches schema</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Test pagination (if applicable)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-compliance-tests>3. Compliance Tests<a href=#3-compliance-tests class=hash-link aria-label="Direct link to 3. Compliance Tests" title="Direct link to 3. Compliance Tests" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Verify User-Agent is set correctly</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Verify rate limiting is enforced</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Verify attribution is included in output</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Verify no API keys in logs or code</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-pre-deployment-checklist>πŸš€ Pre-Deployment Checklist<a href=#-pre-deployment-checklist class=hash-link aria-label="Direct link to πŸš€ Pre-Deployment Checklist" title="Direct link to πŸš€ Pre-Deployment Checklist" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-code-review>1. Code Review<a href=#1-code-review class=hash-link aria-label="Direct link to 1. Code Review" title="Direct link to 1. Code Review" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Code follows project style guidelines</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Type hints added for all functions</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Docstrings complete and accurate</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No hardcoded credentials</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No debug print statements</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-documentation-review>2. Documentation Review<a href=#2-documentation-review class=hash-link aria-label="Direct link to 2. Documentation Review" title="Direct link to 2. Documentation Review" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Legal compliance doc updated</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Citations page updated</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->API integration status updated</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Usage examples created</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->README updated (if needed)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-security-review>3. Security Review<a href=#3-security-review class=hash-link aria-label="Direct link to 3. Security Review" title="Direct link to 3. Security Review" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->No API keys in code</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Environment variables documented in <code>.env.example</code></li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->User-Agent identifies project</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Rate limiting prevents abuse</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Error messages don't leak sensitive info</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=4-license-review>4. License Review<a href=#4-license-review class=hash-link aria-label="Direct link to 4. License Review" title="Direct link to 4. License Review" translate=no>​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Data source license compatible with MIT</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Attribution requirements documented</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Terms of service compliance verified</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Commercial use permitted (or documented as reference only)</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-quick-reference-data-source-types>πŸ“‹ Quick Reference: Data Source Types<a href=#-quick-reference-data-source-types class=hash-link aria-label="Direct link to πŸ“‹ Quick Reference: Data Source Types" title="Direct link to πŸ“‹ Quick Reference: Data Source Types" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=-recommended-public-domain-government-data>βœ… RECOMMENDED: Public Domain Government Data<a href=#-recommended-public-domain-government-data class=hash-link aria-label="Direct link to βœ… RECOMMENDED: Public Domain Government Data" title="Direct link to βœ… RECOMMENDED: Public Domain Government Data" translate=no>​</a></h3>
<p><strong>Examples:</strong> IRS, Census Bureau, NCES, Grants.gov</p>
<p><strong>Characteristics:</strong></p>
<ul>
<li class="">No API key required (usually)</li>
<li class="">Public domain - no restrictions</li>
<li class="">Free unlimited access</li>
<li class="">No attribution required (but recommended)</li>
</ul>
<p><strong>Best for:</strong> Production use, open-source projects</p>
<hr/>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=-recommended-free-public-apis-api-key-required>βœ… RECOMMENDED: Free Public APIs (API Key Required)<a href=#-recommended-free-public-apis-api-key-required class=hash-link aria-label="Direct link to βœ… RECOMMENDED: Free Public APIs (API Key Required)" title="Direct link to βœ… RECOMMENDED: Free Public APIs (API Key Required)" translate=no>​</a></h3>
<p><strong>Examples:</strong> Open States, Google Civic API, Wikidata, DBpedia</p>
<p><strong>Characteristics:</strong></p>
<ul>
<li class="">Free API key registration</li>
<li class="">Generous free tier quotas</li>
<li class="">Open license or public domain data</li>
<li class="">Attribution required</li>
</ul>
<p><strong>Best for:</strong> Production use with proper attribution</p>
<hr/>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=️-caution-free-apis-with-restrictions>⚠️ CAUTION: Free APIs with Restrictions<a href=#️-caution-free-apis-with-restrictions class=hash-link aria-label="Direct link to ⚠️ CAUTION: Free APIs with Restrictions" title="Direct link to ⚠️ CAUTION: Free APIs with Restrictions" translate=no>​</a></h3>
<p><strong>Examples:</strong> ProPublica, FEC (contributor restrictions)</p>
<p><strong>Characteristics:</strong></p>
<ul>
<li class="">Free access but with usage restrictions</li>
<li class="">May prohibit commercial use of certain data</li>
<li class="">May have low rate limits</li>
<li class="">May require approval process</li>
</ul>
<p><strong>Best for:</strong> Research, education, limited production use</p>
<hr/>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=-avoid-paid-commercial-apis>❌ AVOID: Paid Commercial APIs<a href=#-avoid-paid-commercial-apis class=hash-link aria-label="Direct link to ❌ AVOID: Paid Commercial APIs" title="Direct link to ❌ AVOID: Paid Commercial APIs" translate=no>​</a></h3>
<p><strong>Examples:</strong> Ballotpedia API, Cicero API</p>
<p><strong>Characteristics:</strong></p>
<ul>
<li class="">Requires paid subscription</li>
<li class="">Not suitable for open-source projects</li>
<li class="">May have restrictive terms</li>
</ul>
<p><strong>Best for:</strong> Reference implementations only, enterprise deployments</p>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-resources>πŸ”— Resources<a href=#-resources class=hash-link aria-label="Direct link to πŸ”— Resources" title="Direct link to πŸ”— Resources" translate=no>​</a></h2>
<ul>
<li class=""><a class="" href=/docs/legal-compliance>Legal Compliance Documentation</a></li>
<li class=""><a class="" href=/docs/data-sources/citations>Citations & Data Sources</a></li>
<li class=""><a href=https://github.com/getcommunityone/open-navigator-for-engagement/blob/main/docs/API_INTEGRATION_STATUS.md target=_blank rel="noopener noreferrer" class="">API Integration Status</a></li>
<li class=""><a href=https://github.com/getcommunityone/open-navigator-for-engagement/blob/main/LICENSE target=_blank rel="noopener noreferrer" class="">Project License (MIT)</a></li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-questions>πŸ“ž Questions?<a href=#-questions class=hash-link aria-label="Direct link to πŸ“ž Questions?" title="Direct link to πŸ“ž Questions?" translate=no>​</a></h2>
<p>If you're unsure about legal compliance for a data source:</p>
<ol>
<li class=""><strong>Check the Terms of Service</strong> - Start here always</li>
<li class=""><strong>Look for similar integrations</strong> - See how other open-source projects use it</li>
<li class=""><strong>Ask the community</strong> - Open a GitHub Discussion</li>
<li class=""><strong>Consult legal counsel</strong> - When in doubt, especially for commercial use</li>
</ol>
<hr/>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 16 16"><path fill-rule=evenodd d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg></span>When in Doubt, Don't Integrate</div><div class=admonitionContent_BuS1><p>If you cannot clearly verify that a data source:<ul>
<li class="">Is legally accessible</li>
<li class="">Permits commercial use and redistribution</li>
<li class="">Has acceptable rate limits and API quotas</li>
<li class="">Doesn't violate privacy laws</li>
</ul><p><strong>DO NOT INTEGRATE IT.</strong> Mark it as "reference only" or find a free alternative.</div></div></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/adding-data-sources.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/events-naming-migration><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>File Migration to Events Naming Convention</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/development/api-logging-errors><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>API Logging & Error Handling Implementation</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=#-pre-integration-checklist class="table-of-contents__link toc-highlight">βœ… Pre-Integration Checklist</a><ul><li><a href=#1-legal-review class="table-of-contents__link toc-highlight">1. Legal Review</a><li><a href=#2-api-access--rate-limits class="table-of-contents__link toc-highlight">2. API Access & Rate Limits</a><li><a href=#3-data-privacy--personal-information class="table-of-contents__link toc-highlight">3. Data Privacy & Personal Information</a><li><a href=#4-technical-requirements class="table-of-contents__link toc-highlight">4. Technical Requirements</a></ul><li><a href=#-implementation-checklist class="table-of-contents__link toc-highlight">πŸ“ Implementation Checklist</a><ul><li><a href=#1-create-integration-module class="table-of-contents__link toc-highlight">1. Create Integration Module</a><li><a href=#2-implement-rate-limiting class="table-of-contents__link toc-highlight">2. Implement Rate Limiting</a><li><a href=#3-set-user-agent-header class="table-of-contents__link toc-highlight">3. Set User-Agent Header</a><li><a href=#4-handle-api-keys-securely class="table-of-contents__link toc-highlight">4. Handle API Keys Securely</a><li><a href=#5-add-error-handling class="table-of-contents__link toc-highlight">5. Add Error Handling</a></ul><li><a href=#-documentation-checklist class="table-of-contents__link toc-highlight">πŸ“š Documentation Checklist</a><ul><li><a href=#1-update-legal-compliance-document class="table-of-contents__link toc-highlight">1. Update Legal Compliance Document</a></ul><li><a href=#-testing-checklist class="table-of-contents__link toc-highlight">πŸ§ͺ Testing Checklist</a><ul><li><a href=#1-unit-tests class="table-of-contents__link toc-highlight">1. Unit Tests</a><li><a href=#2-integration-tests class="table-of-contents__link toc-highlight">2. Integration Tests</a><li><a href=#3-compliance-tests class="table-of-contents__link toc-highlight">3. Compliance Tests</a></ul><li><a href=#-pre-deployment-checklist class="table-of-contents__link toc-highlight">πŸš€ Pre-Deployment Checklist</a><ul><li><a href=#1-code-review class="table-of-contents__link toc-highlight">1. Code Review</a><li><a href=#2-documentation-review class="table-of-contents__link toc-highlight">2. Documentation Review</a><li><a href=#3-security-review class="table-of-contents__link toc-highlight">3. Security Review</a><li><a href=#4-license-review class="table-of-contents__link toc-highlight">4. License Review</a></ul><li><a href=#-quick-reference-data-source-types class="table-of-contents__link toc-highlight">πŸ“‹ Quick Reference: Data Source Types</a><ul><li><a href=#-recommended-public-domain-government-data class="table-of-contents__link toc-highlight">βœ… RECOMMENDED: Public Domain Government Data</a><li><a href=#-recommended-free-public-apis-api-key-required class="table-of-contents__link toc-highlight">βœ… RECOMMENDED: Free Public APIs (API Key Required)</a><li><a href=#️-caution-free-apis-with-restrictions class="table-of-contents__link toc-highlight">⚠️ CAUTION: Free APIs with Restrictions</a><li><a href=#-avoid-paid-commercial-apis class="table-of-contents__link toc-highlight">❌ AVOID: Paid Commercial APIs</a></ul><li><a href=#-resources class="table-of-contents__link toc-highlight">πŸ”— Resources</a><li><a href=#-questions class="table-of-contents__link toc-highlight">πŸ“ž Questions?</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>