Free Plant Care API & Botanical Dataset
Build with the open-source PlantSolve API. No auth or rate limits. Access structured plant care profiles, calculators, and relationship graphs.
{
"id": "plant-monstera",
"name": "Monstera Deliciosa",
"care": {
"difficulty": "Beginner",
"water": "Allow top 2 inches to dry"
}
}
Static & Read-Only
The API is compiled directly during each site build. No active database backend means it's incredibly fast, secure, and reliable.
CORS & Free Access
Wildcard CORS enabled. Fetch directly in client-side apps with zero API keys or rate limits. 100% free forever.
CC BY 4.0 License
Published under Creative Commons. Simply provide clear attribution and a canonical backlink to PlantSolve when used.
Core API Endpoints
To prevent downloading massive files, the API separates discovery from details. Fetch the lightweight index, then grab full profiles.
| Resource | Index Endpoint (List) | Detail Endpoint (Item) |
|---|---|---|
| Plants | /api/v1/plants/index.json | /api/v1/plants/{slug}.json |
| Calculators | /api/v1/calculators/index.json | /api/v1/calculators/{slug}.json |
| Blogs | /api/v1/blogs/index.json | /api/v1/blogs/{slug}.json |
| Fertilizers | /api/v1/fertilizers/index.json | /api/v1/fertilizers/{slug}.json |
| Quizzes | /api/v1/quizzes/index.json | /api/v1/quizzes/{slug}.json |
Open Knowledge Graph
PlantSolve is a connected database. All botanical relationships are exported to the master graph file at /api/v1/relationships.json.
[
{
"source": "fiddle-leaf-fig",
"target": "root-rot",
"relationship": "vulnerability",
"notes": "Highly susceptible..."
}
]
AI & Diagnostics Models
To power custom chatbot experiences or smart interfaces, we expose thematic diagnostic models.
-
Symptom Maps
Diagnoses for issues like
overwateringandheat-stress. /api/v1/problems/index.json -
Topic Clusters
Plant profiles and calculators grouped by theme. /api/v1/topics/index.json
Code Examples
// Fetch all plants and filter by difficulty
async function loadEasyPlants() {
const res = await fetch('https://www.plantsolve.com/api/v1/plants/index.json');
const plants = await res.json();
const easy = plants.filter(p => p.difficulty === 'Beginner');
console.log(`Found ${easy.length} easy plants`);
// Load details for first match
const detail = await fetch(`https://www.plantsolve.com/api/v1/plants/${easy[0].slug}.json`);
const profile = await detail.json();
console.log(profile.care.watering);
}
import urllib.request
import json
# Parse the public relationship graph
url = "https://www.plantsolve.com/api/v1/relationships.json"
res = urllib.request.urlopen(url)
graph = json.loads(res.read().decode())
vulnerabilities = {}
for edge in graph:
if edge['relationship'] == 'vulnerability':
plant = edge['source']
vulnerabilities.setdefault(plant, []).append(edge['target'])
print(vulnerabilities.get('fiddle-leaf-fig'))