{"id":931,"name":"OpenAQ API Version 2","description":"A web-accessible API that provides endpoints to query the real-time and historical air quality measurements on the platform.","url":"https://github.com/openaq/openaq-api-v2","last_synced_at":"2026-04-07T23:30:18.287Z","repository":{"id":37800254,"uuid":"329032562","full_name":"openaq/openaq-api-v2","owner":"openaq","description":"OpenAQ API","archived":false,"fork":false,"pushed_at":"2026-02-07T02:52:45.000Z","size":3519,"stargazers_count":61,"open_issues_count":15,"forks_count":12,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-03-22T03:44:22.309Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://api.openaq.org","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openaq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-01-12T15:39:35.000Z","updated_at":"2026-03-03T21:20:56.000Z","dependencies_parsed_at":"2026-02-15T23:01:44.946Z","dependency_job_id":null,"html_url":"https://github.com/openaq/openaq-api-v2","commit_stats":{"total_commits":350,"total_committers":8,"mean_commits":43.75,"dds":0.3514285714285714,"last_synced_commit":"42af5ec01d86fe770ff2f993390fb7b1eb378aad"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/openaq/openaq-api-v2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openaq","download_url":"https://codeload.github.com/openaq/openaq-api-v2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31160189,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-29T18:55:37.765Z","status":"ssl_error","status_checked_at":"2026-03-29T18:55:04.089Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"openaq","name":"OpenAQ Platform","uuid":"11806583","kind":"organization","description":"An open platform for air quality data","email":"info@openaq.org","website":"https://openaq.org","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11806583?v=4","repositories_count":54,"last_synced_at":"2025-10-24T12:57:21.660Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/openaq","funding_links":["https://github.com/sponsors/openaq"],"total_stars":508,"followers":212,"following":0,"created_at":"2022-11-03T05:56:54.731Z","updated_at":"2025-10-24T12:57:21.660Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openaq","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openaq/repositories"},"packages":[],"commits":{"id":1254487,"full_name":"openaq/openaq-api-v2","default_branch":"main","total_commits":392,"total_committers":8,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":49.0,"dds":0.33673469387755106,"past_year_total_commits":17,"past_year_total_committers":3,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":5.666666666666667,"past_year_dds":0.4117647058823529,"last_synced_at":"2026-04-04T22:01:51.618Z","last_synced_commit":"b52527de10d9a55ca29792e728fee15785432b70","created_at":"2023-03-27T11:48:12.402Z","updated_at":"2026-04-04T22:01:10.312Z","committers":[{"name":"Russ Biggs","email":"russbiggs@gmail.com","login":"russbiggs","count":260},{"name":"Christian Parker","email":"cparker@talloaks-environmental.com","login":"caparker","count":110},{"name":"Gabriel Fosse","email":"67290377+majesticio","login":"majesticio","count":9},{"name":"David Bitner","email":"bitner@dbspatial.com","login":"bitner","count":8},{"name":"Heet Bhimani","email":"heet.datavizz@gmail.com","login":null,"count":2},{"name":"sruti","email":"sruti@openaq.org","login":"sruti","count":1},{"name":"Minh Nghiem","email":"142734747+mngh037","login":"mngh037","count":1},{"name":"Chris Hagerbaumer","email":"101217850+chagerba","login":"chagerba","count":1}],"past_year_committers":[{"name":"Russ Biggs","email":"russbiggs@gmail.com","login":"russbiggs","count":10},{"name":"Christian Parker","email":"c.andrew.parker@gmail.com","login":"caparker","count":6},{"name":"Minh Nghiem","email":"142734747+mngh037","login":"mngh037","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-06T00:00:08.903Z","repositories_count":6211303,"commits_count":920336441,"contributors_count":35661370,"owners_count":1143045,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"openaq/openaq-api-v2","html_url":"https://github.com/openaq/openaq-api-v2","last_synced_at":"2026-03-27T18:01:58.673Z","status":"error","issues_count":118,"pull_requests_count":303,"avg_time_to_close_issue":23301366.359223302,"avg_time_to_close_pull_request":411334.81292517006,"issues_closed_count":103,"pull_requests_closed_count":294,"pull_request_authors_count":8,"issue_authors_count":36,"avg_comments_per_issue":1.1779661016949152,"avg_comments_per_pull_request":0.20462046204620463,"merged_pull_requests_count":282,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":8,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":42107.0,"past_year_avg_time_to_close_pull_request":1091228.875,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":8,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":0.125,"past_year_avg_comments_per_pull_request":0.5454545454545454,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":6,"created_at":"2023-05-09T10:35:58.428Z","updated_at":"2026-03-27T18:01:58.673Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/openaq%2Fopenaq-api-v2/issues","issue_labels_count":{"bug":22,"enhancement":16,"documentation":3,"infrastructure":2,"help wanted":1},"pull_request_labels_count":{"enhancement":3,"bug":1},"issue_author_associations_count":{"MEMBER":53,"NONE":40,"CONTRIBUTOR":21,"COLLABORATOR":4},"pull_request_author_associations_count":{"MEMBER":216,"COLLABORATOR":53,"CONTRIBUTOR":23,"NONE":11},"issue_authors":{"russbiggs":53,"majesticio":16,"sruti":5,"caparker":4,"barronh":3,"MauriceHeinze":3,"iAutom8":2,"davidasboth":2,"SaBaLeRo22":2,"jeffmcwhirter":2,"crx091081gb":1,"sjohny-uh":1,"saschahofmann":1,"kalisio-nicolas":1,"colleenrosales":1,"dhhagan":1,"faiz687":1,"pavlovc2":1,"piaci":1,"Kodiologist":1,"jkagevm":1,"heetu":1,"aishawariya-athawale":1,"ghost":1,"42nick":1,"Isaac-Leonard":1,"zmoon":1,"JGeek00":1,"surfcoders":1,"dolugen":1,"Evanhp":1,"bjsilver":1,"ChristinaLast":1,"zennur":1,"liamhospiq":1,"c-odebroker":1},"pull_request_authors":{"russbiggs":216,"caparker":52,"majesticio":27,"zmoon":2,"heetu":2,"sruti":2,"bitner":1,"JouzefB":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-04T00:00:10.542Z","repositories_count":14077259,"issues_count":34470144,"pull_requests_count":112505099,"authors_count":11225060,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"bug":2},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"MEMBER":5,"NONE":1},"past_year_pull_request_author_associations_count":{"COLLABORATOR":5,"MEMBER":2,"NONE":1},"past_year_issue_authors":{"russbiggs":5,"c-odebroker":1},"past_year_pull_request_authors":{"caparker":5,"russbiggs":2,"JouzefB":1},"maintainers":[{"login":"russbiggs","count":269,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/russbiggs"},{"login":"caparker","count":56,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/caparker"},{"login":"bitner","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/bitner"}],"active_maintainers":[{"login":"russbiggs","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/russbiggs"},{"login":"caparker","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/caparker"}]},"events":{"total":{"ReleaseEvent":2,"DeleteEvent":1,"MemberEvent":1,"PullRequestEvent":15,"ForkEvent":4,"IssuesEvent":43,"WatchEvent":13,"IssueCommentEvent":19,"PushEvent":74,"PullRequestReviewEvent":7,"PullRequestReviewCommentEvent":5,"CreateEvent":9},"last_year":{"ReleaseEvent":2,"DeleteEvent":1,"MemberEvent":1,"PullRequestEvent":9,"ForkEvent":2,"IssuesEvent":13,"WatchEvent":5,"IssueCommentEvent":4,"PushEvent":24,"PullRequestReviewEvent":2,"CreateEvent":5}},"keywords":[],"dependencies":[{"ecosystem":"pypi","filepath":"cdk/setup.py","sha":null,"kind":"manifest","created_at":"2022-06-22T17:15:21.995Z","updated_at":"2022-06-22T17:15:21.995Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/cdk/setup.py","dependencies":[{"id":8673110,"package_name":"docker","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/deploy-staging.yml","sha":null,"kind":"manifest","created_at":"2023-02-14T09:46:34.188Z","updated_at":"2023-02-14T09:46:34.188Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/.github/workflows/deploy-staging.yml","dependencies":[{"id":7653474185,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":7653474186,"package_name":"aws-actions/configure-aws-credentials","ecosystem":"actions","requirements":"master","direct":true,"kind":"composite","optional":false},{"id":7653474187,"package_name":"actions/setup-node","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7653474188,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"cloudfront_logs/requirements.txt","sha":null,"kind":"manifest","created_at":"2023-02-14T09:46:34.248Z","updated_at":"2023-02-14T09:46:34.248Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/cloudfront_logs/requirements.txt","dependencies":[{"id":7653474639,"package_name":"boto3","ecosystem":"pypi","requirements":"==1.24.28","direct":true,"kind":"runtime","optional":false},{"id":7653474640,"package_name":"botocore","ecosystem":"pypi","requirements":"==1.27.28","direct":true,"kind":"runtime","optional":false},{"id":7653474641,"package_name":"jmespath","ecosystem":"pypi","requirements":"==1.0.1","direct":true,"kind":"runtime","optional":false},{"id":7653474642,"package_name":"pydantic","ecosystem":"pypi","requirements":"==1.9.1","direct":true,"kind":"runtime","optional":false},{"id":7653474643,"package_name":"pyhumps","ecosystem":"pypi","requirements":"==3.7.2","direct":true,"kind":"runtime","optional":false},{"id":7653474644,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":true,"kind":"runtime","optional":false},{"id":7653474645,"package_name":"s3transfer","ecosystem":"pypi","requirements":"==0.6.0","direct":true,"kind":"runtime","optional":false},{"id":7653474646,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":true,"kind":"runtime","optional":false},{"id":7653474647,"package_name":"typing_extensions","ecosystem":"pypi","requirements":"==4.3.0","direct":true,"kind":"runtime","optional":false},{"id":7653474648,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.10","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/test.yml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:12:46.564Z","updated_at":"2023-09-21T19:12:46.564Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/.github/workflows/test.yml","dependencies":[{"id":13856548991,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":13856548992,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"cdk/Dockerfile","sha":null,"kind":"manifest","created_at":"2023-09-21T19:12:46.571Z","updated_at":"2023-09-21T19:12:46.571Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/cdk/Dockerfile","dependencies":[{"id":13856548993,"package_name":"public.ecr.aws/sam/build-python3.11","ecosystem":"docker","requirements":"1.97.0-20230905191328-x86_64","direct":true,"kind":"build","optional":false}]},{"ecosystem":"npm","filepath":"pages/package.json","sha":null,"kind":"manifest","created_at":"2023-09-21T19:12:46.586Z","updated_at":"2023-09-21T19:12:46.586Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/pages/package.json","dependencies":[{"id":13856548994,"package_name":"@zxcvbn-ts/core","ecosystem":"npm","requirements":"^2.2.1","direct":true,"kind":"runtime","optional":false},{"id":13856548995,"package_name":"@zxcvbn-ts/language-common","ecosystem":"npm","requirements":"^2.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856548996,"package_name":"@zxcvbn-ts/language-en","ecosystem":"npm","requirements":"^2.1.0","direct":true,"kind":"runtime","optional":false},{"id":13856548997,"package_name":"openaq-design-system","ecosystem":"npm","requirements":"github:openaq/openaq-design-system#v-4.0.0","direct":true,"kind":"runtime","optional":false},{"id":13856548998,"package_name":"lightningcss","ecosystem":"npm","requirements":"^1.18.0","direct":true,"kind":"development","optional":false},{"id":13856548999,"package_name":"sass","ecosystem":"npm","requirements":"^1.59.3","direct":true,"kind":"development","optional":false},{"id":13856549000,"package_name":"vite","ecosystem":"npm","requirements":"^4.2.0","direct":true,"kind":"development","optional":false},{"id":13856549001,"package_name":"vite-plugin-lightningcss","ecosystem":"npm","requirements":"^0.0.3","direct":true,"kind":"development","optional":false},{"id":13856549002,"package_name":"vite-plugin-purgecss","ecosystem":"npm","requirements":"^0.2.12","direct":true,"kind":"development","optional":false}]},{"ecosystem":"npm","filepath":"pages/yarn.lock","sha":null,"kind":"lockfile","created_at":"2023-09-21T19:12:46.693Z","updated_at":"2023-09-21T19:12:46.693Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/pages/yarn.lock","dependencies":[{"id":13856549003,"package_name":"@esbuild/android-arm64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549004,"package_name":"@esbuild/android-arm","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549005,"package_name":"@esbuild/android-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549006,"package_name":"@esbuild/darwin-arm64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549007,"package_name":"@esbuild/darwin-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549008,"package_name":"@esbuild/freebsd-arm64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549009,"package_name":"@esbuild/freebsd-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549010,"package_name":"@esbuild/linux-arm64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549011,"package_name":"@esbuild/linux-arm","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549012,"package_name":"@esbuild/linux-ia32","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549013,"package_name":"@esbuild/linux-loong64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549014,"package_name":"@esbuild/linux-loong64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549015,"package_name":"@esbuild/linux-mips64el","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549016,"package_name":"@esbuild/linux-ppc64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549017,"package_name":"@esbuild/linux-riscv64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549018,"package_name":"@esbuild/linux-s390x","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549019,"package_name":"@esbuild/linux-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549020,"package_name":"@esbuild/netbsd-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549021,"package_name":"@esbuild/openbsd-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549022,"package_name":"@esbuild/sunos-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549023,"package_name":"@esbuild/win32-arm64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549024,"package_name":"@esbuild/win32-ia32","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549025,"package_name":"@esbuild/win32-x64","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549026,"package_name":"@nodelib/fs.scandir","ecosystem":"npm","requirements":"2.1.5","direct":false,"kind":"runtime","optional":false},{"id":13856549027,"package_name":"@nodelib/fs.stat","ecosystem":"npm","requirements":"2.0.5","direct":false,"kind":"runtime","optional":false},{"id":13856549028,"package_name":"@nodelib/fs.walk","ecosystem":"npm","requirements":"1.2.8","direct":false,"kind":"runtime","optional":false},{"id":13856549029,"package_name":"@zxcvbn-ts/core","ecosystem":"npm","requirements":"2.2.1","direct":false,"kind":"runtime","optional":false},{"id":13856549030,"package_name":"@zxcvbn-ts/language-common","ecosystem":"npm","requirements":"2.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549031,"package_name":"@zxcvbn-ts/language-en","ecosystem":"npm","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549032,"package_name":"any-promise","ecosystem":"npm","requirements":"1.3.0","direct":false,"kind":"runtime","optional":false},{"id":13856549033,"package_name":"anymatch","ecosystem":"npm","requirements":"3.1.3","direct":false,"kind":"runtime","optional":false},{"id":13856549034,"package_name":"array-union","ecosystem":"npm","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549035,"package_name":"balanced-match","ecosystem":"npm","requirements":"1.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549036,"package_name":"binary-extensions","ecosystem":"npm","requirements":"2.2.0","direct":false,"kind":"runtime","optional":false},{"id":13856549037,"package_name":"brace-expansion","ecosystem":"npm","requirements":"1.1.11","direct":false,"kind":"runtime","optional":false},{"id":13856549038,"package_name":"braces","ecosystem":"npm","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549039,"package_name":"browserslist","ecosystem":"npm","requirements":"4.21.5","direct":false,"kind":"runtime","optional":false},{"id":13856549040,"package_name":"bundle-require","ecosystem":"npm","requirements":"4.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549041,"package_name":"cac","ecosystem":"npm","requirements":"6.7.14","direct":false,"kind":"runtime","optional":false},{"id":13856549042,"package_name":"caniuse-lite","ecosystem":"npm","requirements":"1.0.30001467","direct":false,"kind":"runtime","optional":false},{"id":13856549043,"package_name":"chokidar","ecosystem":"npm","requirements":"3.5.3","direct":false,"kind":"runtime","optional":false},{"id":13856549044,"package_name":"commander","ecosystem":"npm","requirements":"4.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549045,"package_name":"commander","ecosystem":"npm","requirements":"8.3.0","direct":false,"kind":"runtime","optional":false},{"id":13856549046,"package_name":"concat-map","ecosystem":"npm","requirements":"0.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549047,"package_name":"cross-spawn","ecosystem":"npm","requirements":"7.0.3","direct":false,"kind":"runtime","optional":false},{"id":13856549048,"package_name":"cssesc","ecosystem":"npm","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549049,"package_name":"debug","ecosystem":"npm","requirements":"4.3.4","direct":false,"kind":"runtime","optional":false},{"id":13856549050,"package_name":"detect-libc","ecosystem":"npm","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":13856549051,"package_name":"dir-glob","ecosystem":"npm","requirements":"3.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549052,"package_name":"electron-to-chromium","ecosystem":"npm","requirements":"1.4.333","direct":false,"kind":"runtime","optional":false},{"id":13856549053,"package_name":"esbuild-android-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549054,"package_name":"esbuild-android-arm64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549055,"package_name":"esbuild-darwin-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549056,"package_name":"esbuild-darwin-arm64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549057,"package_name":"esbuild-freebsd-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549058,"package_name":"esbuild-freebsd-arm64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549059,"package_name":"esbuild-linux-32","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549060,"package_name":"esbuild-linux-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549061,"package_name":"esbuild-linux-arm64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549062,"package_name":"esbuild-linux-arm","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549063,"package_name":"esbuild-linux-mips64le","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549064,"package_name":"esbuild-linux-ppc64le","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549065,"package_name":"esbuild-linux-riscv64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549066,"package_name":"esbuild-linux-s390x","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549067,"package_name":"esbuild-netbsd-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549068,"package_name":"esbuild-openbsd-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549069,"package_name":"esbuild-sunos-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549070,"package_name":"esbuild-windows-32","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549071,"package_name":"esbuild-windows-64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549072,"package_name":"esbuild-windows-arm64","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549073,"package_name":"esbuild","ecosystem":"npm","requirements":"0.14.54","direct":false,"kind":"runtime","optional":false},{"id":13856549074,"package_name":"esbuild","ecosystem":"npm","requirements":"0.17.12","direct":false,"kind":"runtime","optional":false},{"id":13856549075,"package_name":"escalade","ecosystem":"npm","requirements":"3.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549076,"package_name":"execa","ecosystem":"npm","requirements":"5.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549077,"package_name":"fast-glob","ecosystem":"npm","requirements":"3.2.12","direct":false,"kind":"runtime","optional":false},{"id":13856549078,"package_name":"fastest-levenshtein","ecosystem":"npm","requirements":"1.0.16","direct":false,"kind":"runtime","optional":false},{"id":13856549079,"package_name":"fastq","ecosystem":"npm","requirements":"1.15.0","direct":false,"kind":"runtime","optional":false},{"id":13856549080,"package_name":"fill-range","ecosystem":"npm","requirements":"7.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549081,"package_name":"fs.realpath","ecosystem":"npm","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549082,"package_name":"fsevents","ecosystem":"npm","requirements":"2.3.2","direct":false,"kind":"runtime","optional":false},{"id":13856549083,"package_name":"function-bind","ecosystem":"npm","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549084,"package_name":"get-stream","ecosystem":"npm","requirements":"6.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549085,"package_name":"glob-parent","ecosystem":"npm","requirements":"5.1.2","direct":false,"kind":"runtime","optional":false},{"id":13856549086,"package_name":"glob","ecosystem":"npm","requirements":"7.1.6","direct":false,"kind":"runtime","optional":false},{"id":13856549087,"package_name":"glob","ecosystem":"npm","requirements":"7.2.3","direct":false,"kind":"runtime","optional":false},{"id":13856549088,"package_name":"globby","ecosystem":"npm","requirements":"11.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549089,"package_name":"has","ecosystem":"npm","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":13856549090,"package_name":"human-signals","ecosystem":"npm","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549091,"package_name":"ignore","ecosystem":"npm","requirements":"5.2.4","direct":false,"kind":"runtime","optional":false},{"id":13856549092,"package_name":"immutable","ecosystem":"npm","requirements":"4.3.0","direct":false,"kind":"runtime","optional":false},{"id":13856549093,"package_name":"inflight","ecosystem":"npm","requirements":"1.0.6","direct":false,"kind":"runtime","optional":false},{"id":13856549094,"package_name":"inherits","ecosystem":"npm","requirements":"2.0.4","direct":false,"kind":"runtime","optional":false},{"id":13856549095,"package_name":"is-binary-path","ecosystem":"npm","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549096,"package_name":"is-core-module","ecosystem":"npm","requirements":"2.11.0","direct":false,"kind":"runtime","optional":false},{"id":13856549097,"package_name":"is-extglob","ecosystem":"npm","requirements":"2.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549098,"package_name":"is-glob","ecosystem":"npm","requirements":"4.0.3","direct":false,"kind":"runtime","optional":false},{"id":13856549099,"package_name":"is-number","ecosystem":"npm","requirements":"7.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549100,"package_name":"is-stream","ecosystem":"npm","requirements":"2.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549101,"package_name":"isexe","ecosystem":"npm","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549102,"package_name":"joycon","ecosystem":"npm","requirements":"3.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549103,"package_name":"lightningcss-darwin-arm64","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549104,"package_name":"lightningcss-darwin-x64","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549105,"package_name":"lightningcss-linux-arm-gnueabihf","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549106,"package_name":"lightningcss-linux-arm64-gnu","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549107,"package_name":"lightningcss-linux-arm64-musl","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549108,"package_name":"lightningcss-linux-x64-gnu","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549109,"package_name":"lightningcss-linux-x64-musl","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549110,"package_name":"lightningcss-win32-x64-msvc","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549111,"package_name":"lightningcss","ecosystem":"npm","requirements":"1.19.0","direct":false,"kind":"runtime","optional":false},{"id":13856549112,"package_name":"lilconfig","ecosystem":"npm","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549113,"package_name":"lines-and-columns","ecosystem":"npm","requirements":"1.2.4","direct":false,"kind":"runtime","optional":false},{"id":13856549114,"package_name":"load-tsconfig","ecosystem":"npm","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":13856549115,"package_name":"lodash.sortby","ecosystem":"npm","requirements":"4.7.0","direct":false,"kind":"runtime","optional":false},{"id":13856549116,"package_name":"merge-stream","ecosystem":"npm","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549117,"package_name":"merge2","ecosystem":"npm","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":13856549118,"package_name":"micromatch","ecosystem":"npm","requirements":"4.0.5","direct":false,"kind":"runtime","optional":false},{"id":13856549119,"package_name":"mimic-fn","ecosystem":"npm","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549120,"package_name":"minimatch","ecosystem":"npm","requirements":"3.1.2","direct":false,"kind":"runtime","optional":false},{"id":13856549121,"package_name":"ms","ecosystem":"npm","requirements":"2.1.2","direct":false,"kind":"runtime","optional":false},{"id":13856549122,"package_name":"mz","ecosystem":"npm","requirements":"2.7.0","direct":false,"kind":"runtime","optional":false},{"id":13856549123,"package_name":"nanoid","ecosystem":"npm","requirements":"3.3.4","direct":false,"kind":"runtime","optional":false},{"id":13856549124,"package_name":"node-releases","ecosystem":"npm","requirements":"2.0.10","direct":false,"kind":"runtime","optional":false},{"id":13856549125,"package_name":"normalize-path","ecosystem":"npm","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549126,"package_name":"npm-run-path","ecosystem":"npm","requirements":"4.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549127,"package_name":"object-assign","ecosystem":"npm","requirements":"4.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549128,"package_name":"once","ecosystem":"npm","requirements":"1.4.0","direct":false,"kind":"runtime","optional":false},{"id":13856549129,"package_name":"onetime","ecosystem":"npm","requirements":"5.1.2","direct":false,"kind":"runtime","optional":false},{"id":13856549130,"package_name":"openaq-design-system","ecosystem":"npm","requirements":"4.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549131,"package_name":"path-is-absolute","ecosystem":"npm","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549132,"package_name":"path-key","ecosystem":"npm","requirements":"3.1.1","direct":false,"kind":"runtime","optional":false},{"id":13856549133,"package_name":"path-parse","ecosystem":"npm","requirements":"1.0.7","direct":false,"kind":"runtime","optional":false},{"id":13856549134,"package_name":"path-type","ecosystem":"npm","requirements":"4.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549135,"package_name":"picocolors","ecosystem":"npm","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549136,"package_name":"picomatch","ecosystem":"npm","requirements":"2.3.1","direct":false,"kind":"runtime","optional":false},{"id":13856549137,"package_name":"pirates","ecosystem":"npm","requirements":"4.0.5","direct":false,"kind":"runtime","optional":false},{"id":13856549138,"package_name":"postcss-load-config","ecosystem":"npm","requirements":"3.1.4","direct":false,"kind":"runtime","optional":false},{"id":13856549139,"package_name":"postcss-selector-parser","ecosystem":"npm","requirements":"6.0.11","direct":false,"kind":"runtime","optional":false},{"id":13856549140,"package_name":"postcss","ecosystem":"npm","requirements":"8.4.21","direct":false,"kind":"runtime","optional":false},{"id":13856549141,"package_name":"punycode","ecosystem":"npm","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":13856549142,"package_name":"purgecss","ecosystem":"npm","requirements":"4.1.3","direct":false,"kind":"runtime","optional":false},{"id":13856549143,"package_name":"queue-microtask","ecosystem":"npm","requirements":"1.2.3","direct":false,"kind":"runtime","optional":false},{"id":13856549144,"package_name":"readdirp","ecosystem":"npm","requirements":"3.6.0","direct":false,"kind":"runtime","optional":false},{"id":13856549145,"package_name":"resolve-from","ecosystem":"npm","requirements":"5.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549146,"package_name":"resolve","ecosystem":"npm","requirements":"1.22.1","direct":false,"kind":"runtime","optional":false},{"id":13856549147,"package_name":"reusify","ecosystem":"npm","requirements":"1.0.4","direct":false,"kind":"runtime","optional":false},{"id":13856549148,"package_name":"rollup","ecosystem":"npm","requirements":"2.77.3","direct":false,"kind":"runtime","optional":false},{"id":13856549149,"package_name":"rollup","ecosystem":"npm","requirements":"3.19.1","direct":false,"kind":"runtime","optional":false},{"id":13856549150,"package_name":"run-parallel","ecosystem":"npm","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":13856549151,"package_name":"sass","ecosystem":"npm","requirements":"1.59.3","direct":false,"kind":"runtime","optional":false},{"id":13856549152,"package_name":"shebang-command","ecosystem":"npm","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549153,"package_name":"shebang-regex","ecosystem":"npm","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549154,"package_name":"signal-exit","ecosystem":"npm","requirements":"3.0.7","direct":false,"kind":"runtime","optional":false},{"id":13856549155,"package_name":"slash","ecosystem":"npm","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549156,"package_name":"source-map-js","ecosystem":"npm","requirements":"1.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549157,"package_name":"source-map","ecosystem":"npm","requirements":"0.8.0-beta.0","direct":false,"kind":"runtime","optional":false},{"id":13856549158,"package_name":"strip-final-newline","ecosystem":"npm","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549159,"package_name":"sucrase","ecosystem":"npm","requirements":"3.29.0","direct":false,"kind":"runtime","optional":false},{"id":13856549160,"package_name":"supports-preserve-symlinks-flag","ecosystem":"npm","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":13856549161,"package_name":"thenify-all","ecosystem":"npm","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":13856549162,"package_name":"thenify","ecosystem":"npm","requirements":"3.3.1","direct":false,"kind":"runtime","optional":false},{"id":13856549163,"package_name":"to-regex-range","ecosystem":"npm","requirements":"5.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549164,"package_name":"tr46","ecosystem":"npm","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":13856549165,"package_name":"tree-kill","ecosystem":"npm","requirements":"1.2.2","direct":false,"kind":"runtime","optional":false},{"id":13856549166,"package_name":"ts-interface-checker","ecosystem":"npm","requirements":"0.1.13","direct":false,"kind":"runtime","optional":false},{"id":13856549167,"package_name":"tsup","ecosystem":"npm","requirements":"6.6.3","direct":false,"kind":"runtime","optional":false},{"id":13856549168,"package_name":"update-browserslist-db","ecosystem":"npm","requirements":"1.0.10","direct":false,"kind":"runtime","optional":false},{"id":13856549169,"package_name":"util-deprecate","ecosystem":"npm","requirements":"1.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549170,"package_name":"vite-plugin-lightningcss","ecosystem":"npm","requirements":"0.0.3","direct":false,"kind":"runtime","optional":false},{"id":13856549171,"package_name":"vite-plugin-purgecss","ecosystem":"npm","requirements":"0.2.12","direct":false,"kind":"runtime","optional":false},{"id":13856549172,"package_name":"vite","ecosystem":"npm","requirements":"2.9.15","direct":false,"kind":"runtime","optional":false},{"id":13856549173,"package_name":"vite","ecosystem":"npm","requirements":"4.2.0","direct":false,"kind":"runtime","optional":false},{"id":13856549174,"package_name":"webidl-conversions","ecosystem":"npm","requirements":"4.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549175,"package_name":"whatwg-url","ecosystem":"npm","requirements":"7.1.0","direct":false,"kind":"runtime","optional":false},{"id":13856549176,"package_name":"which","ecosystem":"npm","requirements":"2.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549177,"package_name":"wrappy","ecosystem":"npm","requirements":"1.0.2","direct":false,"kind":"runtime","optional":false},{"id":13856549178,"package_name":"yaml","ecosystem":"npm","requirements":"1.10.2","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"cdk/requirements.devcontainer.txt","sha":null,"kind":"manifest","created_at":"2023-09-21T19:12:46.832Z","updated_at":"2023-09-21T19:12:46.832Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/cdk/requirements.devcontainer.txt","dependencies":[]},{"ecosystem":"pypi","filepath":"openaq_api/requirements.txt","sha":null,"kind":"manifest","created_at":"2023-09-21T19:12:47.056Z","updated_at":"2023-09-21T19:12:47.056Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/openaq_api/requirements.txt","dependencies":[{"id":13856549179,"package_name":"aiocache","ecosystem":"pypi","requirements":"==0.11.1","direct":true,"kind":"runtime","optional":false},{"id":13856549180,"package_name":"annotated-types","ecosystem":"pypi","requirements":"==0.5.0","direct":true,"kind":"runtime","optional":false},{"id":13856549181,"package_name":"anyio","ecosystem":"pypi","requirements":"==3.6.1","direct":true,"kind":"runtime","optional":false},{"id":13856549182,"package_name":"asgiref","ecosystem":"pypi","requirements":"==3.5.2","direct":true,"kind":"runtime","optional":false},{"id":13856549183,"package_name":"async-timeout","ecosystem":"pypi","requirements":"==4.0.2","direct":true,"kind":"runtime","optional":false},{"id":13856549184,"package_name":"asyncpg","ecosystem":"pypi","requirements":"==0.28.0","direct":true,"kind":"runtime","optional":false},{"id":13856549185,"package_name":"attrs","ecosystem":"pypi","requirements":"==22.1.0","direct":true,"kind":"runtime","optional":false},{"id":13856549186,"package_name":"bcrypt","ecosystem":"pypi","requirements":"==4.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856549187,"package_name":"boto3","ecosystem":"pypi","requirements":"==1.26.101","direct":true,"kind":"runtime","optional":false},{"id":13856549188,"package_name":"botocore","ecosystem":"pypi","requirements":"==1.29.101","direct":true,"kind":"runtime","optional":false},{"id":13856549189,"package_name":"buildpg","ecosystem":"pypi","requirements":"==0.4","direct":true,"kind":"runtime","optional":false},{"id":13856549190,"package_name":"bump-pydantic","ecosystem":"pypi","requirements":"==0.1.0","direct":true,"kind":"runtime","optional":false},{"id":13856549191,"package_name":"certifi","ecosystem":"pypi","requirements":"==2022.12.7","direct":true,"kind":"runtime","optional":false},{"id":13856549192,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"==3.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856549193,"package_name":"click","ecosystem":"pypi","requirements":"==8.1.3","direct":true,"kind":"runtime","optional":false},{"id":13856549194,"package_name":"coverage","ecosystem":"pypi","requirements":"==7.2.7","direct":true,"kind":"runtime","optional":false},{"id":13856549195,"package_name":"dateparser","ecosystem":"pypi","requirements":"==1.1.1","direct":true,"kind":"runtime","optional":false},{"id":13856549196,"package_name":"Deprecated","ecosystem":"pypi","requirements":"==1.2.13","direct":true,"kind":"runtime","optional":false},{"id":13856549197,"package_name":"dnspython","ecosystem":"pypi","requirements":"==2.3.0","direct":true,"kind":"runtime","optional":false},{"id":13856549198,"package_name":"email-validator","ecosystem":"pypi","requirements":"==2.0.0.post2","direct":true,"kind":"runtime","optional":false},{"id":13856549199,"package_name":"exceptiongroup","ecosystem":"pypi","requirements":"==1.0.4","direct":true,"kind":"runtime","optional":false},{"id":13856549200,"package_name":"fastapi","ecosystem":"pypi","requirements":"==0.100.0","direct":true,"kind":"runtime","optional":false},{"id":13856549201,"package_name":"greenlet","ecosystem":"pypi","requirements":"==2.0.2","direct":true,"kind":"runtime","optional":false},{"id":13856549202,"package_name":"h11","ecosystem":"pypi","requirements":"==0.12.0","direct":true,"kind":"runtime","optional":false},{"id":13856549203,"package_name":"httpcore","ecosystem":"pypi","requirements":"==0.14.7","direct":true,"kind":"runtime","optional":false},{"id":13856549204,"package_name":"httpx","ecosystem":"pypi","requirements":"==0.22.0","direct":true,"kind":"runtime","optional":false},{"id":13856549205,"package_name":"idna","ecosystem":"pypi","requirements":"==3.3","direct":true,"kind":"runtime","optional":false},{"id":13856549206,"package_name":"importlib-metadata","ecosystem":"pypi","requirements":"==4.11.4","direct":true,"kind":"runtime","optional":false},{"id":13856549207,"package_name":"iniconfig","ecosystem":"pypi","requirements":"==1.1.1","direct":true,"kind":"runtime","optional":false},{"id":13856549208,"package_name":"Jinja2","ecosystem":"pypi","requirements":"==3.1.2","direct":true,"kind":"runtime","optional":false},{"id":13856549209,"package_name":"jmespath","ecosystem":"pypi","requirements":"==1.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856549210,"package_name":"jq","ecosystem":"pypi","requirements":"==1.5.0","direct":true,"kind":"runtime","optional":false},{"id":13856549211,"package_name":"libcst","ecosystem":"pypi","requirements":"==1.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856549212,"package_name":"mangum","ecosystem":"pypi","requirements":"==0.15.0","direct":true,"kind":"runtime","optional":false},{"id":13856549213,"package_name":"Markdown","ecosystem":"pypi","requirements":"==3.3.7","direct":true,"kind":"runtime","optional":false},{"id":13856549214,"package_name":"markdown-it-py","ecosystem":"pypi","requirements":"==3.0.0","direct":true,"kind":"runtime","optional":false},{"id":13856549215,"package_name":"MarkupSafe","ecosystem":"pypi","requirements":"==2.1.1","direct":true,"kind":"runtime","optional":false},{"id":13856549216,"package_name":"mdurl","ecosystem":"pypi","requirements":"==0.1.2","direct":true,"kind":"runtime","optional":false},{"id":13856549217,"package_name":"msgpack","ecosystem":"pypi","requirements":"==1.0.3","direct":true,"kind":"runtime","optional":false},{"id":13856549218,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":13856549219,"package_name":"orjson","ecosystem":"pypi","requirements":"==3.9.7","direct":true,"kind":"runtime","optional":false},{"id":13856549220,"package_name":"packaging","ecosystem":"pypi","requirements":"==21.3","direct":true,"kind":"runtime","optional":false},{"id":13856549221,"package_name":"passlib","ecosystem":"pypi","requirements":"==1.7.4","direct":true,"kind":"runtime","optional":false},{"id":13856549222,"package_name":"pluggy","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":13856549223,"package_name":"pydantic","ecosystem":"pypi","requirements":"==2.0.2","direct":true,"kind":"runtime","optional":false},{"id":13856549224,"package_name":"pydantic-settings","ecosystem":"pypi","requirements":"==2.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856549225,"package_name":"pydantic_core","ecosystem":"pypi","requirements":"==2.1.2","direct":true,"kind":"runtime","optional":false},{"id":13856549226,"package_name":"Pygments","ecosystem":"pypi","requirements":"==2.15.1","direct":true,"kind":"runtime","optional":false},{"id":13856549227,"package_name":"pyhumps","ecosystem":"pypi","requirements":"==3.7.1","direct":true,"kind":"runtime","optional":false},{"id":13856549228,"package_name":"pyparsing","ecosystem":"pypi","requirements":"==3.0.9","direct":true,"kind":"runtime","optional":false},{"id":13856549229,"package_name":"PyPika","ecosystem":"pypi","requirements":"==0.48.9","direct":true,"kind":"runtime","optional":false},{"id":13856549230,"package_name":"pytest","ecosystem":"pypi","requirements":"==7.2.0","direct":true,"kind":"runtime","optional":false},{"id":13856549231,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"==4.1.0","direct":true,"kind":"runtime","optional":false},{"id":13856549232,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":true,"kind":"runtime","optional":false},{"id":13856549233,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":13856549234,"package_name":"python-multipart","ecosystem":"pypi","requirements":"==0.0.6","direct":true,"kind":"runtime","optional":false},{"id":13856549235,"package_name":"pytz","ecosystem":"pypi","requirements":"==2022.1","direct":true,"kind":"runtime","optional":false},{"id":13856549236,"package_name":"pytz-deprecation-shim","ecosystem":"pypi","requirements":"==0.1.0.post0","direct":true,"kind":"runtime","optional":false},{"id":13856549237,"package_name":"PyYAML","ecosystem":"pypi","requirements":"==6.0","direct":true,"kind":"runtime","optional":false},{"id":13856549238,"package_name":"redis","ecosystem":"pypi","requirements":"==4.3.3","direct":true,"kind":"runtime","optional":false},{"id":13856549239,"package_name":"regex","ecosystem":"pypi","requirements":"==2022.3.2","direct":true,"kind":"runtime","optional":false},{"id":13856549240,"package_name":"rfc3986","ecosystem":"pypi","requirements":"==1.5.0","direct":true,"kind":"runtime","optional":false},{"id":13856549241,"package_name":"rich","ecosystem":"pypi","requirements":"==13.4.2","direct":true,"kind":"runtime","optional":false},{"id":13856549242,"package_name":"s3transfer","ecosystem":"pypi","requirements":"==0.6.0","direct":true,"kind":"runtime","optional":false},{"id":13856549243,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":true,"kind":"runtime","optional":false},{"id":13856549244,"package_name":"sniffio","ecosystem":"pypi","requirements":"==1.2.0","direct":true,"kind":"runtime","optional":false},{"id":13856549245,"package_name":"SQLAlchemy","ecosystem":"pypi","requirements":"==1.4.36","direct":true,"kind":"runtime","optional":false},{"id":13856549246,"package_name":"starlette","ecosystem":"pypi","requirements":"==0.27.0","direct":true,"kind":"runtime","optional":false},{"id":13856549247,"package_name":"tomli","ecosystem":"pypi","requirements":"==2.0.1","direct":true,"kind":"runtime","optional":false},{"id":13856549248,"package_name":"typer","ecosystem":"pypi","requirements":"==0.9.0","direct":true,"kind":"runtime","optional":false},{"id":13856549249,"package_name":"typing-inspect","ecosystem":"pypi","requirements":"==0.9.0","direct":true,"kind":"runtime","optional":false},{"id":13856549250,"package_name":"typing_extensions","ecosystem":"pypi","requirements":"==4.7.1","direct":true,"kind":"runtime","optional":false},{"id":13856549251,"package_name":"tzdata","ecosystem":"pypi","requirements":"==2022.1","direct":true,"kind":"runtime","optional":false},{"id":13856549252,"package_name":"tzlocal","ecosystem":"pypi","requirements":"==4.2","direct":true,"kind":"runtime","optional":false},{"id":13856549253,"package_name":"ujson","ecosystem":"pypi","requirements":"==5.8.0","direct":true,"kind":"runtime","optional":false},{"id":13856549254,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.15","direct":true,"kind":"runtime","optional":false},{"id":13856549255,"package_name":"uvicorn","ecosystem":"pypi","requirements":"==0.17.6","direct":true,"kind":"runtime","optional":false},{"id":13856549256,"package_name":"wrapt","ecosystem":"pypi","requirements":"==1.14.1","direct":true,"kind":"runtime","optional":false},{"id":13856549257,"package_name":"zipp","ecosystem":"pypi","requirements":"==3.8.0","direct":true,"kind":"runtime","optional":false},{"id":13856549258,"package_name":"zxcvbn","ecosystem":"pypi","requirements":"==4.4.28","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"cloudfront_logs/pyproject.toml","sha":null,"kind":"manifest","created_at":"2026-02-15T23:01:41.916Z","updated_at":"2026-02-15T23:01:41.916Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/cloudfront_logs/pyproject.toml","dependencies":[{"id":25819151629,"package_name":"pytest","ecosystem":"pypi","requirements":"^8.3.5","direct":true,"kind":"test","optional":false},{"id":25819151630,"package_name":"httpx","ecosystem":"pypi","requirements":"^0.28.1","direct":true,"kind":"test","optional":false},{"id":25819151631,"package_name":"ruff","ecosystem":"pypi","requirements":"^0.9.10","direct":true,"kind":"lint","optional":false},{"id":25819151632,"package_name":"black","ecosystem":"pypi","requirements":"^25.1.0","direct":true,"kind":"lint","optional":false},{"id":25819151633,"package_name":"pyhumps","ecosystem":"pypi","requirements":"(\u003e=3.8.0,\u003c4.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151634,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"(\u003e=1.1.0,\u003c2.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151635,"package_name":"s3transfer","ecosystem":"pypi","requirements":"(\u003e=0.11.4,\u003c0.12.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151636,"package_name":"six","ecosystem":"pypi","requirements":"(\u003e=1.17.0,\u003c2.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151637,"package_name":"urllib3","ecosystem":"pypi","requirements":"(\u003e=2.3.0,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151638,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"(\u003e=2.9.0.post0,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151639,"package_name":"pydantic","ecosystem":"pypi","requirements":"(\u003e=2.11.0,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151640,"package_name":"pydantic-settings","ecosystem":"pypi","requirements":"(\u003e=2.8.1,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151641,"package_name":"jmespath","ecosystem":"pypi","requirements":"(\u003e=1.0.1,\u003c2.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151642,"package_name":"annotated-types","ecosystem":"pypi","requirements":"(\u003e=0.7.0,\u003c0.8.0)","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2026-02-15T23:01:44.374Z","updated_at":"2026-02-15T23:01:44.374Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/pyproject.toml","dependencies":[{"id":25819151913,"package_name":"aws-cdk-lib","ecosystem":"pypi","requirements":"^2.186.0","direct":true,"kind":"deploy","optional":false},{"id":25819151914,"package_name":"docker","ecosystem":"pypi","requirements":"^7.1.0","direct":true,"kind":"deploy","optional":false},{"id":25819151915,"package_name":"pytest","ecosystem":"pypi","requirements":"^8.3.5","direct":true,"kind":"test","optional":false},{"id":25819151916,"package_name":"httpx","ecosystem":"pypi","requirements":"^0.28.1","direct":true,"kind":"test","optional":false},{"id":25819151917,"package_name":"ruff","ecosystem":"pypi","requirements":"^0.9.10","direct":true,"kind":"lint","optional":false},{"id":25819151918,"package_name":"black","ecosystem":"pypi","requirements":"^25.1.0","direct":true,"kind":"lint","optional":false},{"id":25819151919,"package_name":"fastapi","ecosystem":"pypi","requirements":"(\u003e=0.115.11,\u003c0.116.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151920,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"(\u003e=1.1.0,\u003c2.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151921,"package_name":"pydantic","ecosystem":"pypi","requirements":"(\u003e=2.11.0,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151922,"package_name":"pydantic-settings","ecosystem":"pypi","requirements":"(\u003e=2.8.1,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151923,"package_name":"asyncpg","ecosystem":"pypi","requirements":"(\u003e=0.30.0,\u003c0.31.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151924,"package_name":"orjson","ecosystem":"pypi","requirements":"(\u003e=3.10.15,\u003c4.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151925,"package_name":"redis","ecosystem":"pypi","requirements":"(\u003e=5.2.1,\u003c6.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151926,"package_name":"mangum","ecosystem":"pypi","requirements":"(\u003e=0.19.0,\u003c0.20.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151927,"package_name":"uvicorn","ecosystem":"pypi","requirements":"(\u003e=0.34.0,\u003c0.35.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151928,"package_name":"starlette","ecosystem":"pypi","requirements":"(\u003e=0.46.1,\u003c0.47.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151929,"package_name":"buildpg","ecosystem":"pypi","requirements":"(\u003e=0.4,\u003c0.5)","direct":true,"kind":"runtime","optional":false},{"id":25819151930,"package_name":"aiocache","ecosystem":"pypi","requirements":"(\u003e=0.12.3,\u003c0.13.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151931,"package_name":"pyhumps","ecosystem":"pypi","requirements":"(\u003e=3.8.0,\u003c4.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151932,"package_name":"annotated-types","ecosystem":"pypi","requirements":"(\u003e=0.7.0,\u003c0.8.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151933,"package_name":"jinja2","ecosystem":"pypi","requirements":"(\u003e=3.1.6,\u003c4.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151934,"package_name":"s3transfer","ecosystem":"pypi","requirements":"(\u003e=0.11.4,\u003c0.12.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151935,"package_name":"six","ecosystem":"pypi","requirements":"(\u003e=1.17.0,\u003c2.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151936,"package_name":"urllib3","ecosystem":"pypi","requirements":"(\u003e=2.3.0,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151937,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"(\u003e=2.9.0.post0,\u003c3.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151938,"package_name":"jmespath","ecosystem":"pypi","requirements":"(\u003e=1.0.1,\u003c2.0.0)","direct":true,"kind":"runtime","optional":false},{"id":25819151939,"package_name":"boto3","ecosystem":"pypi","requirements":"(\u003e1.34.0)","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/deploy-aeolus.yml","sha":null,"kind":"manifest","created_at":"2026-02-15T23:01:39.956Z","updated_at":"2026-02-15T23:01:39.956Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/.github/workflows/deploy-aeolus.yml","dependencies":[{"id":25819151439,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25819151441,"package_name":"aws-actions/configure-aws-credentials","ecosystem":"actions","requirements":"master","direct":true,"kind":"composite","optional":false},{"id":25819151471,"package_name":"aws-actions/aws-secretsmanager-get-secrets","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":25819151487,"package_name":"actions/setup-node","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25819151488,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":25819151489,"package_name":"snok/install-poetry","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"cloudfront_logs/poetry.lock","sha":null,"kind":"lockfile","created_at":"2026-02-15T23:01:40.869Z","updated_at":"2026-02-15T23:01:40.869Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/cloudfront_logs/poetry.lock","dependencies":[{"id":25819151520,"package_name":"annotated-types","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":25819151521,"package_name":"anyio","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"test","optional":false},{"id":25819151522,"package_name":"black","ecosystem":"pypi","requirements":"25.1.0","direct":false,"kind":"lint","optional":false},{"id":25819151523,"package_name":"botocore","ecosystem":"pypi","requirements":"1.37.22","direct":false,"kind":"runtime","optional":false},{"id":25819151528,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.1.31","direct":false,"kind":"test","optional":false},{"id":25819151529,"package_name":"click","ecosystem":"pypi","requirements":"8.1.8","direct":false,"kind":"lint","optional":false},{"id":25819151530,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"lint","optional":false},{"id":25819151531,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"test","optional":false},{"id":25819151532,"package_name":"h11","ecosystem":"pypi","requirements":"0.14.0","direct":false,"kind":"test","optional":false},{"id":25819151533,"package_name":"httpcore","ecosystem":"pypi","requirements":"1.0.7","direct":false,"kind":"test","optional":false},{"id":25819151544,"package_name":"httpx","ecosystem":"pypi","requirements":"0.28.1","direct":false,"kind":"test","optional":false},{"id":25819151545,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"test","optional":false},{"id":25819151546,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"test","optional":false},{"id":25819151547,"package_name":"jmespath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":25819151548,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"lint","optional":false},{"id":25819151571,"package_name":"packaging","ecosystem":"pypi","requirements":"24.2","direct":false,"kind":"lint","optional":false},{"id":25819151572,"package_name":"packaging","ecosystem":"pypi","requirements":"24.2","direct":false,"kind":"test","optional":false},{"id":25819151573,"package_name":"pathspec","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"lint","optional":false},{"id":25819151574,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.3.7","direct":false,"kind":"lint","optional":false},{"id":25819151575,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.5.0","direct":false,"kind":"test","optional":false},{"id":25819151576,"package_name":"pydantic","ecosystem":"pypi","requirements":"2.11.0","direct":false,"kind":"runtime","optional":false},{"id":25819151577,"package_name":"pydantic-core","ecosystem":"pypi","requirements":"2.33.0","direct":false,"kind":"runtime","optional":false},{"id":25819151578,"package_name":"pydantic-settings","ecosystem":"pypi","requirements":"2.8.1","direct":false,"kind":"runtime","optional":false},{"id":25819151579,"package_name":"pyhumps","ecosystem":"pypi","requirements":"3.8.0","direct":false,"kind":"runtime","optional":false},{"id":25819151593,"package_name":"pytest","ecosystem":"pypi","requirements":"8.3.5","direct":false,"kind":"test","optional":false},{"id":25819151594,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":25819151595,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25819151596,"package_name":"ruff","ecosystem":"pypi","requirements":"0.9.10","direct":false,"kind":"lint","optional":false},{"id":25819151597,"package_name":"s3transfer","ecosystem":"pypi","requirements":"0.11.4","direct":false,"kind":"runtime","optional":false},{"id":25819151598,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25819151612,"package_name":"sniffio","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"test","optional":false},{"id":25819151613,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.13.0","direct":false,"kind":"runtime","optional":false},{"id":25819151620,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.13.0","direct":false,"kind":"test","optional":false},{"id":25819151621,"package_name":"typing-inspection","ecosystem":"pypi","requirements":"0.4.0","direct":false,"kind":"runtime","optional":false},{"id":25819151622,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"poetry.lock","sha":null,"kind":"lockfile","created_at":"2026-02-15T23:01:42.014Z","updated_at":"2026-02-15T23:01:42.014Z","repository_link":"https://github.com/openaq/openaq-api-v2/blob/main/poetry.lock","dependencies":[{"id":25819151645,"package_name":"aiocache","ecosystem":"pypi","requirements":"0.12.3","direct":false,"kind":"runtime","optional":false},{"id":25819151672,"package_name":"annotated-types","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":25819151673,"package_name":"anyio","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"runtime","optional":false},{"id":25819151674,"package_name":"anyio","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"test","optional":false},{"id":25819151675,"package_name":"async-timeout","ecosystem":"pypi","requirements":"5.0.1","direct":false,"kind":"runtime","optional":false},{"id":25819151680,"package_name":"asyncpg","ecosystem":"pypi","requirements":"0.30.0","direct":false,"kind":"runtime","optional":false},{"id":25819151681,"package_name":"attrs","ecosystem":"pypi","requirements":"25.3.0","direct":false,"kind":"deploy","optional":false},{"id":25819151682,"package_name":"aws-cdk-asset-awscli-v1","ecosystem":"pypi","requirements":"2.2.230","direct":false,"kind":"deploy","optional":false},{"id":25819151688,"package_name":"aws-cdk-asset-node-proxy-agent-v6","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"deploy","optional":false},{"id":25819151708,"package_name":"aws-cdk-cloud-assembly-schema","ecosystem":"pypi","requirements":"41.2.0","direct":false,"kind":"deploy","optional":false},{"id":25819151722,"package_name":"aws-cdk-lib","ecosystem":"pypi","requirements":"2.187.0","direct":false,"kind":"deploy","optional":false},{"id":25819151723,"package_name":"black","ecosystem":"pypi","requirements":"25.1.0","direct":false,"kind":"lint","optional":false},{"id":25819151724,"package_name":"boto3","ecosystem":"pypi","requirements":"1.37.38","direct":false,"kind":"runtime","optional":false},{"id":25819151728,"package_name":"botocore","ecosystem":"pypi","requirements":"1.37.38","direct":false,"kind":"runtime","optional":false},{"id":25819151729,"package_name":"buildpg","ecosystem":"pypi","requirements":"0.4","direct":false,"kind":"runtime","optional":false},{"id":25819151730,"package_name":"cattrs","ecosystem":"pypi","requirements":"24.1.3","direct":false,"kind":"deploy","optional":false},{"id":25819151750,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.1.31","direct":false,"kind":"deploy","optional":false},{"id":25819151751,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.1.31","direct":false,"kind":"test","optional":false},{"id":25819151752,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.1","direct":false,"kind":"deploy","optional":false},{"id":25819151753,"package_name":"click","ecosystem":"pypi","requirements":"8.1.8","direct":false,"kind":"runtime","optional":false},{"id":25819151754,"package_name":"click","ecosystem":"pypi","requirements":"8.1.8","direct":false,"kind":"lint","optional":false},{"id":25819151755,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":25819151756,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"lint","optional":false},{"id":25819151757,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"test","optional":false},{"id":25819151758,"package_name":"constructs","ecosystem":"pypi","requirements":"10.4.2","direct":false,"kind":"deploy","optional":false},{"id":25819151765,"package_name":"docker","ecosystem":"pypi","requirements":"7.1.0","direct":false,"kind":"deploy","optional":false},{"id":25819151766,"package_name":"fastapi","ecosystem":"pypi","requirements":"0.115.12","direct":false,"kind":"runtime","optional":false},{"id":25819151767,"package_name":"h11","ecosystem":"pypi","requirements":"0.14.0","direct":false,"kind":"runtime","optional":false},{"id":25819151768,"package_name":"h11","ecosystem":"pypi","requirements":"0.14.0","direct":false,"kind":"test","optional":false},{"id":25819151769,"package_name":"httpcore","ecosystem":"pypi","requirements":"1.0.7","direct":false,"kind":"test","optional":false},{"id":25819151770,"package_name":"httpx","ecosystem":"pypi","requirements":"0.28.1","direct":false,"kind":"test","optional":false},{"id":25819151771,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"runtime","optional":false},{"id":25819151772,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"deploy","optional":false},{"id":25819151773,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"test","optional":false},{"id":25819151774,"package_name":"importlib-resources","ecosystem":"pypi","requirements":"6.5.2","direct":false,"kind":"deploy","optional":false},{"id":25819151775,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"test","optional":false},{"id":25819151776,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.6","direct":false,"kind":"runtime","optional":false},{"id":25819151777,"package_name":"jmespath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":25819151778,"package_name":"jsii","ecosystem":"pypi","requirements":"1.110.0","direct":false,"kind":"deploy","optional":false},{"id":25819151779,"package_name":"mangum","ecosystem":"pypi","requirements":"0.19.0","direct":false,"kind":"runtime","optional":false},{"id":25819151829,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":25819151830,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"lint","optional":false},{"id":25819151831,"package_name":"orjson","ecosystem":"pypi","requirements":"3.10.16","direct":false,"kind":"runtime","optional":false},{"id":25819151832,"package_name":"packaging","ecosystem":"pypi","requirements":"24.2","direct":false,"kind":"lint","optional":false},{"id":25819151833,"package_name":"packaging","ecosystem":"pypi","requirements":"24.2","direct":false,"kind":"test","optional":false},{"id":25819151834,"package_name":"pathspec","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"lint","optional":false},{"id":25819151835,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.3.7","direct":false,"kind":"lint","optional":false},{"id":25819151836,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.5.0","direct":false,"kind":"test","optional":false},{"id":25819151837,"package_name":"publication","ecosystem":"pypi","requirements":"0.0.3","direct":false,"kind":"deploy","optional":false},{"id":25819151840,"package_name":"pydantic","ecosystem":"pypi","requirements":"2.11.1","direct":false,"kind":"runtime","optional":false},{"id":25819151841,"package_name":"pydantic-core","ecosystem":"pypi","requirements":"2.33.0","direct":false,"kind":"runtime","optional":false},{"id":25819151842,"package_name":"pydantic-settings","ecosystem":"pypi","requirements":"2.8.1","direct":false,"kind":"runtime","optional":false},{"id":25819151843,"package_name":"pyhumps","ecosystem":"pypi","requirements":"3.8.0","direct":false,"kind":"runtime","optional":false},{"id":25819151844,"package_name":"pytest","ecosystem":"pypi","requirements":"8.3.5","direct":false,"kind":"test","optional":false},{"id":25819151845,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":25819151846,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"deploy","optional":false},{"id":25819151847,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25819151848,"package_name":"pywin32","ecosystem":"pypi","requirements":"310","direct":false,"kind":"deploy","optional":false},{"id":25819151849,"package_name":"redis","ecosystem":"pypi","requirements":"5.2.1","direct":false,"kind":"runtime","optional":false},{"id":25819151850,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.3","direct":false,"kind":"deploy","optional":false},{"id":25819151851,"package_name":"ruff","ecosystem":"pypi","requirements":"0.9.10","direct":false,"kind":"lint","optional":false},{"id":25819151852,"package_name":"s3transfer","ecosystem":"pypi","requirements":"0.11.4","direct":false,"kind":"runtime","optional":false},{"id":25819151853,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25819151854,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"deploy","optional":false},{"id":25819151855,"package_name":"sniffio","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"runtime","optional":false},{"id":25819151856,"package_name":"sniffio","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"test","optional":false},{"id":25819151857,"package_name":"starlette","ecosystem":"pypi","requirements":"0.46.1","direct":false,"kind":"runtime","optional":false},{"id":25819151858,"package_name":"typeguard","ecosystem":"pypi","requirements":"2.13.3","direct":false,"kind":"deploy","optional":false},{"id":25819151866,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.13.0","direct":false,"kind":"runtime","optional":false},{"id":25819151867,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.13.0","direct":false,"kind":"deploy","optional":false},{"id":25819151868,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.13.0","direct":false,"kind":"test","optional":false},{"id":25819151869,"package_name":"typing-inspection","ecosystem":"pypi","requirements":"0.4.0","direct":false,"kind":"runtime","optional":false},{"id":25819151870,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":25819151871,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"deploy","optional":false},{"id":25819151872,"package_name":"uvicorn","ecosystem":"pypi","requirements":"0.34.0","direct":false,"kind":"runtime","optional":false}]}],"score":6.410174881966167,"created_at":"2023-09-11T11:54:36.381Z","updated_at":"2026-04-07T23:30:18.297Z","avatar_url":"https://github.com/openaq.png","language":"Python","category":"Natural Resources","sub_category":"Air Quality","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# OpenAQ API\n[![Slack Chat](https://img.shields.io/badge/Chat-Slack-ff69b4.svg \"Join us. Anyone is welcome!\")](https://join.slack.com/t/openaq/shared_invite/zt-yzqlgsva-v6McumTjy2BZnegIK9XCVw)\n\n## Overview\nThis repository contains the source code for the [OpenAQ API](https://api.openaq.org), a publicly-accessible API that provides endpoints to query the real-time and historical air quality measurements on the OpenAQ platform.\n\n\u003e [!NOTE]\n\u003e This repository is for setting up and deploying the OpenAQ API. If you just wish to access the public API to query data from the OpenAQ platform, visit https://api.openaq.org or https://docs.openaq.org to learn more.\n\n## Package management\nWe are currently using [Poetry](https://python-poetry.org/) to manage our dependencies and run locally.\n\n## Local development\nIn production, the OpenAQ API runs on AWS Lambda with the help of the [mangum](https://mangum.io/) library. This allows the application to run in a serverless environment and take advantage of async Python and FastAPI routing. Despite the serverless deployment, running the API locally as a standard FastAPI application is largely unchanged, making local development much easier.\n\n### Settings\nSettings can be loaded using `.env` files, and multiple files can be kept and used. The easiest way to manage multiple environment files is to add an extension describing your environment. For example, if I wanted to keep a production, staging and local environment, I would save them as `.env.production`, `.env.staging` and `.env.local` each with their own settings.\n\n```\nDATABASE_READ_USER=database-read-user\nDATABASE_WRITE_USER=database-write-user\nDATABASE_READ_PASSWORD=database-read-password\nDATABASE_WRITE_PASSWORD=database-write-password\nDATABASE_DB=database-name\nDATABASE_HOST=localhost\nDATABASE_PORT=5432\nLOG_LEVEL=info\n```\n\n### Running locally\nThe easiest way to run the API locally is to use uvicorn. Make sure that you have your settings (`.env`) file setup. Once that is done, you can run the following from the `openaq_api` directory. Variables from the `.env` files can be overrode by setting them inline.\n\n```bash\n# Run using the default .env file\npoetry run uvicorn openaq_api.main:app --reload --lifespan on\n```\nYou can also specify which `.env` file to load by passing the `ENV` variable. This should not include the `.env.` prefix\n\n```bash\nDOTENV=local poetry run uvicorn openaq_api.main:app --reload --lifespan on\n```\nIf you are connecting to our production environment you will AWS credentials therefor you may need to provdide the profile name to access the right credentials.\n\n```\nAWS_PROFILE=optional-profile-name \\\nDOTENV=production \\\npoetry run uvicorn openaq_api.main:app --reload --lifespan on\n```\nAnd you can always override variables by setting them inline. This is handy for when you want to change something for the purpose of debugging.\n```\n# Run the staging environment and add verbose logging\nENV=staging LOG_LEVEL=debug uvicorn main:app --reload\nDOTENV=staging \\\nLOG_LEVEL=debug \\\npoetry run uvicorn openaq_api.main:app --reload --lifespan on\n```\n\n## Testing\nFrom the root directory\n```bash\nDOTENV=local poetry run pytest tests/\n```\n\n## Rate limiting\n\nIn the production environment, rate limiting is handled in two places, AWS WAF and at the application level with [Starlette Middleware](https://www.starlette.io/middleware/). The application rate limiting is configurable via environment variables. The rate limiting middleware requires access to an instance of a [redis](https://redis.io/) cluster. For local development, [docker](https://www.docker.com/) can be a convenient method to set up a local redis cluster. With docker, use the following command:\n\n```sh\ndocker run -e \"IP=0.0.0.0\" -p 7000-7005:7000-7005 grokzen/redis-cluster:7.0.7\n```\n\nNow a redis instance will be available at ``` http://localhost:7000 ```. Configure the REDIS_HOST to `localhost` and REDIS_PORT to `7000`.\n\n\u003e [!TIP]\n\u003e On some macOS systems port 7000 is used by Airplay which can complicate the mapping of ports from the Docker container. The easiest option is to disable the Airplay reciever in system settings. `System settings -\u003e General -\u003e Airplay receiver (toggle off)`\n\n### Rate limiting values\n\nRate limiting can be toggled off for local develop via the `RATE_LIMITING` environment variable. Other rate limiting values are:\n* `RATE_AMOUNT_KEY` - The number of requests allowed with a valid API key\n* `RATE_TIME` - The number of minutes for the rate\n\ne.g. `RATE_AMOUNT_KEY=5` and `RATE_TIME=1` would allow 5 requests per 1 minute.\n\n\u003e [!NOTE]\n\u003e With AWS WAF, rate limiting also occurs at the cloudfront stage. The application level rate limiting should be less than or equal to the value set at AWS WAF.\n\n\n### Deployment\n\nDeployment is managed with Amazon Web Services (AWS) Cloud Development Kit (CDK). Additional environment variables are required for a full deployment to the AWS Cloud.\n# Deploying\n```python\nAWS_PROFILE=optional-profile-name DOTENV=production cdk deploy openaq-api-production\n```\n\n## Platform Overview\n\n[openaq-fetch](https://github.com/openaq/openaq-fetch) and [openaq-fetch-lcs](https://github.com/openaq/openaq-fetch-lcs) take care of fetching new data and writing to [S3](https://openaq-fetches.s3.amazonaws.com/index.html). Lambda functions defined in [openaq-ingestor](https://github.com/openaq/openaq-ingestor), then load data into the database, defined in [openaq-db](https://github.com/openaq/openaq-db).\n\n\n## Contributing\nThere are many ways to contribute to this project; more details can be found in the [contributing guide](CONTRIBUTING.md).\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["air-quality"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/931","html_url":"https://ost.ecosyste.ms/projects/931"}