Plantsforafuture APIplantsforafuture.org ↗
Access the PFAF plant database via API. Search by Latin name, browse alphabetically, and retrieve edibility, medicinal, cultivation, and propagation details.
What is the Plantsforafuture API?
The Plants For A Future API exposes 3 endpoints covering the PFAF plant database of edible and useful plants. Use search_plants to run partial-match queries by Latin name and get back habit, hardiness, soil and moisture preferences, and edible/medicinal/other ratings. Use get_plant_details to retrieve a full plant profile — including geographic range, known hazards, cultivation notes, propagation methods, and detailed use descriptions — for any exact Latin name.
curl -X GET 'https://api.parse.bot/scraper/18f9d0e0-3307-428c-a976-dd138c6806ee/search_plants?query=Rosa' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace plantsforafuture-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.plants_for_a_future_pfaf_api import Pfaf, Plant, PlantSummary, Letter
pfaf = Pfaf()
# Search for plants in the Rosa genus
for summary in pfaf.plantsummaries.search(query="Rosa"):
print(summary.latin_name, summary.common_name, summary.edible, summary.medicinal)
# Get full details for a specific plant
plant = pfaf.plants.get(latin_name="Rosa canina")
print(plant.common_name, plant.family, plant.edible_rating, plant.medicinal_rating)
print(plant.known_hazards, plant.usda_hardiness)
# Browse alphabetically using the Letter enum
for entry in pfaf.plantsummaries.browse(letter=Letter.Q):
print(entry.latin_name, entry.habit, entry.height)
# Navigate from summary to full details
for item in pfaf.plantsummaries.search(query="Allium"):
detail = item.details()
print(detail.latin_name, detail.edible_uses, detail.cultivation)
break
Full-text search over the PFAF plant database by Latin name. Returns a list of matching plants with summary characteristics (habit, height, hardiness, soil/shade/moisture preferences, edible/medicinal/other ratings). Partial matches are supported — searching 'Rosa' returns all species in that genus. Results are not paginated; the full matching set is returned in one response.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Latin name or partial Latin name to search for (e.g. 'Rosa', 'Allium') |
{
"type": "object",
"fields": {
"items": "array of plant summary objects",
"total": "integer count of results returned"
},
"sample": {
"data": {
"items": [
{
"Soil": "LMH",
"Habit": "Shrub",
"Other": "3",
"Shade": "SN",
"Edible": "2",
"Growth": "",
"Height": "2.5",
"Moisture": "M",
"Hardiness": "0-0",
"Medicinal": "2",
"Latin Name": "Rosa acicularis",
"Common Name": "Prickly Rose",
"details_url": "https://pfaf.org/user/Plant.aspx?LatinName=Rosa acicularis",
"latin_name_id": "Rosa acicularis"
}
],
"total": 56
},
"status": "success"
}
}About the Plantsforafuture API
Endpoints and Data Coverage
The API provides three endpoints. search_plants accepts a query string (e.g. 'Rosa' or 'Allium') and returns an array of plant summary objects alongside a total count. Each summary includes habit, height, hardiness zone, soil and shade preferences, moisture tolerance, and numeric ratings for edible, medicinal, and other uses. Partial Latin names are supported, so querying 'Rosa' returns all matching species.
get_plant_details takes an exact latin_name — as it appears in search results — and returns the full PFAF profile for that plant. Response fields include common_name, family, range, habitats, edible_uses, other_uses, cultivation, propagation, other_rating, and known hazards. The latin_name must match the database entry exactly; use search_plants first to confirm the correct spelling before calling this endpoint.
Browsing the Database
browse_plants_alphabetically accepts a single letter parameter (A–Z) and returns every plant in the database whose Latin name starts with that letter. Results are not paginated — the full set for the letter is returned in one response. This is useful for inventory-style queries or when you want to explore the database without a specific species in mind. The items array and total count follow the same structure as search_plants results.
Ratings and Use Fields
Edible, medicinal, and other-use ratings are numeric scores on a 1–5 scale, making them filterable client-side for use-case prioritisation. The edible_uses and other_uses fields in get_plant_details are free-text descriptions sourced from the PFAF database entries, and their length and detail vary by species. Not every plant has values for every field — sparse or missing data reflects the underlying database.
The Plantsforafuture API is a managed, monitored endpoint for plantsforafuture.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when plantsforafuture.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official plantsforafuture.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a foraging reference app that lets users search edible plants by partial Latin name and filter by edible rating
- Generate cultivation guides for a gardening platform using the
cultivationandpropagationfields fromget_plant_details - Populate a medicinal plant index by browsing alphabetically and extracting species with a medicinal rating above a threshold
- Cross-reference known hazards from
get_plant_detailsagainst a list of candidate species for food safety research - Create a plant family taxonomy tool by aggregating the
familyfield across all results frombrowse_plants_alphabetically - Feed habitat and geographic
rangedata into a biodiversity mapping tool for specific plant genera - Build a permaculture plant selector that filters by soil, shade, and moisture preferences from
search_plantssummaries
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Plants For A Future have an official developer API?+
What does `get_plant_details` return, and how does it differ from `search_plants`?+
search_plants returns summary objects — habit, height, hardiness, soil/shade/moisture preferences, and 1–5 ratings for edible, medicinal, and other uses. get_plant_details returns the full profile for one species: edible_uses, other_uses, cultivation, propagation, habitats, range, family, common_name, and known hazards. The latin_name input must match the database exactly, so it is best practice to call search_plants first to confirm the correct form.Does `browse_plants_alphabetically` paginate its results?+
items array and total may be large. If you need a subset, filter the returned array client-side.Does the API return images or photos for plants?+
Are common names searchable, or is search limited to Latin names?+
search_plants endpoint accepts a query parameter matched against Latin names only, and browse_plants_alphabetically indexes by the first letter of the Latin name. Common names are returned as a field in results but cannot be used as search input. You can fork this API on Parse and revise it to add a common-name search endpoint.