eFloras APIefloras.org ↗
Search plant names across eFloras.org floras, retrieve full taxon treatments, and resolve illustration or photo URLs via a 3-endpoint API.
What is the eFloras API?
The eFloras.org API gives programmatic access to botanical treatments published across multiple regional floras — Flora of China, Flora of North America, Flora of Pakistan, and more — through 3 endpoints. Use search_plants to find taxon records by name, get_plant to retrieve a full treatment including classification, lower taxa, synonyms, and distribution paragraphs, and get_plant_image to resolve illustration or photo objects to direct image URLs.
curl -X GET 'https://api.parse.bot/scraper/755834ff-705a-49b2-a88b-28aafe0e027e/get_plant_image?flora_id=2&object_id=3183' \ -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 efloras-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.
"""Walkthrough: eFloras plant data — search, detail, and image resolution."""
from parse_apis.efloras_org_api import Efloras, InputFormatInvalid
client = Efloras()
# Search for a genus across all floras; cap total items.
for summary in client.plant_summaries.search(query="Ocimum", limit=5):
print(summary.name, summary.flora_id, summary.volume)
# Drill into the first hit's full treatment.
hit = client.plant_summaries.search(query="Hyssopus", limit=1).first()
if hit is not None:
plant = hit.detail()
print(plant.name, plant.heading)
# Walk classification chain (family → genus → …).
for ancestor in plant.classification:
print(" ancestor:", ancestor.name, ancestor.taxon_id)
# Print treatment paragraphs.
for paragraph in plant.treatment:
print(" treatment:", paragraph[:120])
# Resolve the first illustration/photo to its image URL.
if plant.objects:
obj = plant.objects[0]
image = client.plant_images.get(flora_id=plant.flora_id, object_id=obj.object_id)
print(image.taxon_name, image.image_url)
if image.caption is not None:
print(" caption:", image.caption)
# Show the same taxon in other floras.
for ref in plant.other_floras:
try:
other = client.plants.get(flora_id=ref.flora_id, taxon_id=ref.taxon_id)
print("other flora:", other.flora_name, other.name)
except InputFormatInvalid as e:
print("could not fetch flora reference:", e.message)
print("exercised: plant_summaries.search / detail / plants.get / plant_images.get")
Returns the image behind one related object (illustration or photo) listed on a plant treatment: the object type, the taxon it depicts and the direct image URL. One request per call; the site is slow (page responses commonly take 10-30 seconds). Input ids come from get_plant.objects[*].object_id together with the same flora_id.
| Param | Type | Description |
|---|---|---|
| flora_idrequired | string | Numeric flora id of the flora the object belongs to (e.g. 2 = Flora of China); the same flora_id used for get_plant. |
| object_idrequired | string | Numeric object id from get_plant.objects[*].object_id. |
{
"type": "object",
"fields": {
"url": "page the data was read from",
"caption": "caption/link text shown under the image, null when the site shows none",
"taxon_id": "numeric id of the taxon depicted (usable with get_plant)",
"image_url": "absolute URL of the image file",
"taxon_name": "scientific name of the taxon depicted",
"object_type": "kind of object as labelled by the site, e.g. Illustration"
},
"sample": {
"data": {
"url": "http://www.efloras.org/object_page.aspx?object_id=3183&flora_id=2",
"caption": null,
"flora_id": "2",
"taxon_id": "200019719",
"image_url": "https://images.mobot.org/mrsid/176/17606839_001.gif",
"object_id": "3183",
"taxon_name": "Hyssopus cuspidatus",
"object_type": "Illustration"
},
"status": "success"
}
}About the eFloras API
Searching Taxa
search_plants accepts a scientific name or prefix in the query parameter and returns every matching record across all hosted floras in a single unpaginated response. An optional flora_id parameter narrows results to one flora (e.g. 2 for Flora of China). The results array contains accepted-name rows with taxon_id, flora_id, name, local_name, lower_taxa_count, and volume; a separate synonyms array carries synonym rows that include an accepted_name field pointing back to the accepted taxon. Because eFloras treats the same biological taxon separately per flora, the same taxon_id can appear multiple times — once per flora that covers it.
Taxon Treatments
get_plant takes a flora_id and a taxon_id (sourced from search_plants results, or from get_plant.lower_taxa, get_plant.classification, or get_plant.other_floras) and returns the full published treatment. The treatment field is an ordered array of paragraphs as they appear on the page — vernacular name lines, synonyms, morphological description, and habitat/distribution text. The response also includes classification (ancestor taxa from family downward), lower_taxa (infraspecific or child taxa), other_floras (parallel treatments in other hosted floras), and an objects array of associated illustrations and photos, each with an object_id for downstream resolution.
Resolving Illustrations and Photos
get_plant_image resolves one entry from the objects array to a direct image file. Inputs are the flora_id and the object_id from get_plant.objects[*].object_id. The response returns image_url (absolute URL of the image file), taxon_name, taxon_id, object_type (e.g. Illustration), and an optional caption. Note that eFloras.org page responses are slow — 10–30 seconds per request is typical — so batch workflows should account for this latency.
Flora Coverage and Cross-Flora Links
The flora_id parameter is the key to navigating between floras. The get_plant response surfaces other_floras — an array of {flora_id, taxon_id, flora_name} tuples — so you can follow a taxon from Flora of China into Flora of North America or any other hosted flora without re-running a search. Volume information (volume field) is returned where the flora is organized into volumes; it is null for floras that have no volume structure.
The eFloras API is a managed, monitored endpoint for efloras.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when efloras.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 efloras.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 cross-flora synonym resolver by comparing
resultsandsynonymsarrays fromsearch_plantsacross multiple flora_ids. - Aggregate morphological descriptions and distribution paragraphs from
get_plant.treatmentfor machine-learning training datasets. - Download illustration image files in bulk by iterating
get_plant.objectsand callingget_plant_imagefor eachobject_id. - Generate taxon classification trees using the
classificationandlower_taxaarrays returned byget_plant. - Cross-reference how the same species is treated in different regional floras using
get_plant.other_floras. - Populate a herbarium database with accepted names, vernacular names, and volume citations from
search_plantsresults. - Map species distributions by parsing habitat/distribution paragraphs in the ordered
treatmentarray fromget_plant.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does eFloras.org have an official developer API?+
What does search_plants return, and how does it handle synonyms?+
search_plants returns two separate arrays in one response: results for accepted-name rows and synonyms for synonym rows. Each synonym row carries an accepted_name field identifying the name it resolves to. The total field counts both accepted and synonym rows combined. Results are not paginated — the full match list is returned in a single call.How slow are responses from get_plant_image?+
get_plant_image commonly take 10–30 seconds. Any workflow that resolves many object_id values should treat each call as a slow, sequential operation rather than a fast lookup.Does the API return full-text treatment prose, or only structured metadata?+
get_plant returns both. The treatment field is an ordered array of raw paragraphs — vernacular names, synonyms, morphological description, habitat and distribution text — exactly as they appear in the published treatment. Structured metadata (classification, lower_taxa, other_floras, volume, objects) is returned alongside this text.Can I retrieve a list of all available floras or browse flora contents by volume?+
search_plants and get_plant, and image resolution via get_plant_image. There is no endpoint that enumerates all flora IDs or walks a flora's volume/chapter structure. You can fork this API on Parse and revise it to add a flora-listing or volume-browsing endpoint.