Case study

Flora API: plant data built for a changing climate.

A plant species API that joins native status, county-level distribution, and climate projections in one place, built because the field had no single source that did.

The Flora API home page, showing a butterfly milkweed species card with county-level distribution
Role
Product strategy, data architecture, API & UX design, full-stack development
Status
Live since October 2025
Stack
Python · FastAPI · PostgreSQL (Supabase) · Redis · Google Cloud Run · Stripe
Product
floraapi.com

The challenge

Anyone building a native plant tool hits the same wall: where does the plant data come from?

We needed reliable plant data for our own tools, starting with a map-based native plant finder. The essentials were clear: whether a plant is native or invasive in a given place, where it actually grows down to the county, and the characteristics that help people grow it, such as height, bloom time, sun, and soil.

Plenty of plant databases existed, but none had everything. Some were expensive, some were incomplete or abandoned, and others were static downloads that were never meant to power an app. Almost none combined native status with county-level distribution, and none looked ahead to how a changing climate would reshape where plants can thrive.

Plenty of plant databases existed. None had everything a native plant tool needs.

That gap wasn't just ours. Researchers, conservation groups, nurseries, landscapers, and app developers were all piecing the same data together by hand. So we set out to build the resource the field was missing, and to make it open to anyone who needs it.

Approach

Good data products are designed, not just collected. Most of the work happened before a single endpoint existed.

Source research and precedence

We spent weeks evaluating public botanical databases, government records, and open scientific sources. The foundation is the USDA PLANTS Database, which covers both county-level records and native status by region. Other public sources add characteristics, growing conditions, and propagation details. Where sources overlapped, we mapped exactly which one to trust for each field, weighing richness against coverage.

Standardizing messy data

Real-world botanical data is inconsistent. One source described a plant's habitat as a sentence ("cool, wet regions in coniferous forests") and the next as a list ("Woodland, Riparian, Marsh"). We designed a controlled vocabulary and normalized every record into clean, filterable tags, so a search for wetland plants returns all of them.

A schema built for scale

The database had to hold 28,000+ species and more than two million county distribution records across 3,200+ U.S. counties, alongside taxonomy, characteristics, and growing conditions, and still answer queries quickly. We designed a normalized PostgreSQL schema with dozens of lookup tables, so filters stay fast and new data slots in cleanly.

A pipeline we can trust

We used a suite of Python scripts to gather data from each source, chaining identifiers from one source to access data in another, and load everything into the new schema. All told, processing took roughly 70 hours.

The work

A production REST API with 30+ data endpoints, documentation written for both developers and non-developers, and a public tool built on top.

Search, species, and distribution

The most-used endpoints search the full database by name, state, flower color, plant type, bloom time, and native or invasive status, and return detailed species profiles. The distribution endpoints show exactly where each species grows at the state and county level, the data that took the most effort to compile and that few other APIs offer. Other endpoints cover native species lists by region, conservation status, edible plants, and related species.

The Flora climate data page comparing Cuyahoga County today with a projected 2050s scenario
Flora's climate data compares which species are viable in a county today with where things are headed.

A climate engine

Our biggest addition turns Flora from a lookup into a planning tool. It combines a 27-variable climate model, built from WorldClim baselines plus derived growing variables such as heat days and chill hours, with each species' climate envelope at county resolution. Projections under the RCP 4.5 and 8.5 scenarios run to the 2050s and 2080s. Nine climate endpoints cover climate match scoring, viability analysis, at-risk species, resilient planting recommendations, migration patterns, and county-level climate reports.

Built-in protection

An open data API needs to stay open without being abused. Flora ships with tiered rate limiting, automated abuse detection that spots coordinated scraping across accounts and throttles before it suspends, client identification that can't be spoofed with forged headers, and an IP blocklist. Real users keep their access, and bad actors don't get a free copy of the database.

Documentation for everyone

Alongside the interactive OpenAPI reference, we wrote a plain-English guide that explains every endpoint without code, so a parks planner can judge what Flora can answer before a developer writes a line.

The Native Plant Finder: a county map of the United States with plant search and ZIP code lookup
The Native Plant Finder, our free public tool, runs on Flora's distribution data.

How it fits together

How Flora API is put together Public botanical and climate sources feed a Python data pipeline that standardizes and validates the data. It loads into a PostgreSQL database on Supabase, which a FastAPI service on Google Cloud Run serves with caching, rate limits, and abuse protection. Developer apps, climate reports, and the Native Plant Finder all use the API. SourcesUSDA PLANTSPublic botanicaldatabasesWorldClim climatebaselines + projections PipelinePython ETLSource precedenceStandardized tagsField mapping~70 hrs processing DatabasePostgreSQLon Supabase28,000+ species2M+ county records3,200+ counties Flora APIFastAPI on Cloud Run30+ data endpointsRedis cacheRate limitsAbuse protection Developer apps280+ accounts Climate reportsParks & planners Native Plant FinderFree public tool
From public sources to the products built on Flora.

Impact

Flora has grown steadily since launch, and it's shaping the tools other teams build.

  • 28,000+plant species
  • 2M+county distribution records
  • 280+developer accounts
  • 2.5×monthly active API users since August

Developers sign up every week, around 20 a month, and the number of accounts actively calling the API each month has grown 2.5× since August.

From a manual list to seconds

One of Flora's most important features came from a single conversation. A municipal parks department in Texas reached out: they were building a list of climate-resilient plant species for their county by hand, and wanted to know if Flora could help. At the time it couldn't. That request led directly to Flora's climate engine, which turns their manual process into a single query that anyone can now run for any county.

Proof that good data, designed well, solves real problems for real people.

Working on something similar?

Let's build something for the planet.

Whether you have a dataset that needs a product, or a product that needs a better experience, we'd love to hear about it.

The Companion Planter chart

Next project

Companion Planter

An interactive companion planting chart and bed planner. Case study coming soon.