{"id":13735077,"url":"https://github.com/stac-utils/stac-fastapi","last_synced_at":"2026-02-10T17:08:33.840Z","repository":{"id":37473981,"uuid":"272869556","full_name":"stac-utils/stac-fastapi","owner":"stac-utils","description":"STAC API implementation with FastAPI. ","archived":false,"fork":false,"pushed_at":"2026-02-10T15:36:36.000Z","size":3138,"stargazers_count":305,"open_issues_count":38,"forks_count":116,"subscribers_count":14,"default_branch":"main","last_synced_at":"2026-02-10T16:22:47.021Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://stac-utils.github.io/stac-fastapi/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stac-utils.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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":"2020-06-17T03:31:20.000Z","updated_at":"2026-02-10T15:35:00.000Z","dependencies_parsed_at":"2023-10-21T00:15:10.509Z","dependency_job_id":"fa298d80-377e-4092-9e16-7c0e69f6607f","html_url":"https://github.com/stac-utils/stac-fastapi","commit_stats":{"total_commits":321,"total_committers":48,"mean_commits":6.6875,"dds":0.6978193146417446,"last_synced_commit":"3b5b0938528925539d4f21ab79c83f9de8f7e939"},"previous_names":["arturo-ai/arturo-stac-api"],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/stac-utils/stac-fastapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stac-utils%2Fstac-fastapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stac-utils%2Fstac-fastapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stac-utils%2Fstac-fastapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stac-utils%2Fstac-fastapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stac-utils","download_url":"https://codeload.github.com/stac-utils/stac-fastapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stac-utils%2Fstac-fastapi/sbom","scorecard":{"id":209863,"data":{"date":"2025-08-04","repo":{"name":"github.com/stac-utils/stac-fastapi","commit":"fa42985255fad0bab7dbe3aadbf1f74cb1635f3a"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":5.4,"checks":[{"name":"Maintained","score":10,"reason":"11 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":6,"reason":"Found 18/30 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/cicd.yaml:1","Warn: no topLevel permission defined: .github/workflows/deploy_mkdocs.yml:1","Warn: no topLevel permission defined: .github/workflows/publish.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/cicd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yaml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/cicd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yaml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/cicd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yaml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/cicd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yaml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/cicd.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cicd.yaml:85: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/cicd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_mkdocs.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/deploy_mkdocs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_mkdocs.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/deploy_mkdocs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/stac-utils/stac-fastapi/publish.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:13","Warn: containerImage not pinned by hash: Dockerfile.docs:1: pin your Docker image by updating python:3.12-slim to python:3.12-slim@sha256:9c1d9ed7593f2552a4ea47362ec0d2ddf5923458a53d0c8e30edf8b398c94a31","Warn: pipCommand not pinned by hash: Dockerfile:19-22","Warn: pipCommand not pinned by hash: Dockerfile.docs:8","Warn: pipCommand not pinned by hash: Dockerfile.docs:14-17","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:29","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:34","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:38","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:42","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:70","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:74","Warn: pipCommand not pinned by hash: .github/workflows/cicd.yaml:78","Warn: pipCommand not pinned by hash: .github/workflows/deploy_mkdocs.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/deploy_mkdocs.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/publish.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/publish.yml:23","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of  14 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T00:35:33.290Z","repository_id":37473981,"created_at":"2025-08-17T00:35:33.290Z","updated_at":"2025-08-17T00:35:33.290Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29309077,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T16:09:25.305Z","status":"ssl_error","status_checked_at":"2026-02-10T16:08:52.170Z","response_time":65,"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"}},"keywords":[],"created_at":"2024-08-03T03:01:02.778Z","updated_at":"2026-02-10T17:08:33.818Z","avatar_url":"https://github.com/stac-utils.png","language":"Python","funding_links":[],"categories":["`Python` processing of optical imagery (non deep learning)","Python"],"sub_categories":["Cloud Native Geospatial"],"readme":"\u003c!-- markdownlint-disable MD033 MD041 --\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/radiantearth/stac-site/raw/master/images/logo/stac-030-long.png\" width=400 alt=\"SpatioTemporal Asset Catalog (STAC) logo\"\u003e\n  \u003cp align=\"center\"\u003eFastAPI implemention of the STAC API spec.\u003c/p\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/stac-utils/stac-fastapi/actions?query=workflow%3Acicd\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://github.com/stac-utils/stac-fastapi/workflows/stac-fastapi/badge.svg\" alt=\"Test\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/stac-utils/stac-fastapi/blob/main/LICENSE\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/license/stac-utils/stac-fastapi.svg\" alt=\"License\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n**Documentation**: [https://stac-utils.github.io/stac-fastapi/](https://stac-utils.github.io/stac-fastapi/)\n\n**Source Code**: [https://github.com/stac-utils/stac-fastapi](https://github.com/stac-utils/stac-fastapi)\n\n---\n\nPython library for building a STAC-compliant FastAPI application.  \n\n`stac-fastapi` was initially developed by [arturo-ai](https://github.com/arturo-ai).\n\nThe project contains several namespace packages:\n\n| Package |  Description | Version |\n| ------- |------------- | ------- |\n| [**stac_fastapi.api**](https://github.com/stac-utils/stac-fastapi/tree/main/stac_fastapi/api) | An API layer which enforces the [stac-api-spec](https://github.com/radiantearth/stac-api-spec). | [![stac-fastapi.api](https://img.shields.io/pypi/v/stac-fastapi.api?color=%2334D058\u0026label=pypi)](https://pypi.org/project/stac-fastapi.api) |\n| [**stac_fastapi.extensions**](https://github.com/stac-utils/stac-fastapi/tree/main/stac_fastapi/extensions) | Abstract base classes for [STAC API extensions](https://github.com/radiantearth/stac-api-spec/blob/master/extensions.md) and third-party extensions. | [![stac-fastapi.extensions](https://img.shields.io/pypi/v/stac-fastapi.extensions?color=%2334D058\u0026label=pypi)](https://pypi.org/project/stac-fastapi.extensions) |\n| [**stac_fastapi.types**](https://github.com/stac-utils/stac-fastapi/tree/main/stac_fastapi/types) | Shared types and abstract base classes used by the library. | [![stac-fastapi.types](https://img.shields.io/pypi/v/stac-fastapi.types?color=%2334D058\u0026label=pypi)](https://pypi.org/project/stac-fastapi.types) |\n\n#### Backends\n\nIn addition to the packages in this repository, a server implemention will also require the selection of a backend to\nconnect with a database for STAC metadata storage. There are several different backend options, and each has their own\nrepository.\n\nThe two most widely-used and supported backends are:\n\n- [stac-fastapi-pgstac](https://github.com/stac-utils/stac-fastapi-pgstac): [PostgreSQL](https://github.com/postgres/postgres) + [PostGIS](https://github.com/postgis/postgis) via [PgSTAC](https://github.com/stac-utils/pgstac).\n- [stac-fastapi-elasticsearch-opensearch](https://github.com/stac-utils/stac-fastapi-elasticsearch-opensearch): [Elasticsearch](https://github.com/elastic/elasticsearch) or [OpenSearch](https://github.com/opensearch-project/OpenSearch)\n\nOther implementations include:\n\n- [stac-fastapi-mongo](https://github.com/Healy-Hyperspatial/stac-fastapi-mongo): [MongoDB](https://github.com/mongodb/mongo)\n- [stac-fastapi-geoparquet)](https://github.com/stac-utils/stac-fastapi-geoparquet): [GeoParquet](https://geoparquet.org) via [stacrs](https://github.com/stac-utils/stacrs) (experimental)\n- [stac-fastapi-duckdb](https://github.com/Healy-Hyperspatial/stac-fastapi-duckdb): [DuckDB](https://github.com/duckdb/duckdb) (experimental)\n- [stac-fastapi-sqlalchemy](https://github.com/stac-utils/stac-fastapi-sqlalchemy): [PostgreSQL](https://github.com/postgres/postgres) + [PostGIS](https://github.com/postgis/postgis) via [SQLAlchemy](https://www.sqlalchemy.org/) (abandoned in favor of stac-fastapi-pgstac)\n\n## Response Model Validation\n\nA common question when using this package is how request and response types are validated?\n\nThis package uses [`stac-pydantic`](https://github.com/stac-utils/stac-pydantic) to validate and document STAC objects. However, by default, validation of response types is turned off and the API will simply forward responses without validating them against the Pydantic model first. This decision was made with the assumption that responses usually come from a (typed) database and can be considered safe. Extra validation would only increase latency, in particular for large payloads.\n\nTo turn on response validation, set `ENABLE_RESPONSE_MODELS` to `True`. Either as an environment variable or directly in the `ApiSettings`.\n\nWith the introduction of Pydantic 2, the extra [time it takes to validate models became negatable](https://github.com/stac-utils/stac-fastapi/pull/625#issuecomment-2045824578). While `ENABLE_RESPONSE_MODELS` still defaults to `False` there should be no penalty for users to turn on this feature but users discretion is advised.\n\n## Installation\n\n```bash\n# Install from PyPI\npython -m pip install stac-fastapi.types stac-fastapi.api stac-fastapi.extensions\n\n# Install a backend of your choice\npython -m pip install stac-fastapi.pgstac\n```\n\nOther backends may be available from other sources, search [PyPI](https://pypi.org/) for more.\n\n## Development\n\nInstall the packages in editable mode:\n\nWe recommand using [`uv`](https://docs.astral.sh/uv) as project manager for development.\n\nSee https://docs.astral.sh/uv/getting-started/installation/ for installation \n\n```shell\nuv sync --dev\n```\n\nTo run the tests:\n\n```shell\nuv run pytest\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md). for detailed contribution instructions.\n\n## Releasing\n\nSee [RELEASING.md](./RELEASING.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstac-utils%2Fstac-fastapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstac-utils%2Fstac-fastapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstac-utils%2Fstac-fastapi/lists"}