Plant API Docs

OVER 10,000+ SPECIES OF PLANTS AVAILABLE

GET BOTANICAL DATA FOR PLANTS

Our plant/botanic API is a custom-built RESTful API designed to help developers/farmers/botanist quickly and easily build agriculture/plant-related services and applications. It provides access to a wealth of plant-based information, including species, care guides, growth stages, images, hardiness zones and much more, making it an ideal choice to create agriculture/plant-related applications and services. Our API also provides many niche farming/botany/botanical resources for varieties like crops, tropical houseplants, sustainable outdoor plants, non-poisonous edible fruits/berries and medical herbs

API Status -
Online
Plant List

GET https://perenual.com/api/species-list?key=[YOUR-API-KEY]
      
Parameter
Key - Required
A secret/unique number to gain access
Page - integer, optional, default is 1
The number page you want to see.
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&page=3
q - optional, string
A string/query consisting of keywords that are used to search for names of species
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&q=monstera
Order - optional, string
Alphabetical order species common name
Order Options - asc, desc
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&order=asc
Edible - optional, boolean, default is NULL
If plant species is edible or not for consumption
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&edible=1
Poisonous - optional, boolean, default is NULL
If plant species is poisonous or not
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&poisonous=1
Cycle - optional, string
The plant cycle of the species.
Options - perennial, annual, biennial, biannual
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&cycle=annual
Watering - optional, string
The watering amount of the species.
Options - frequent, average, minimum, none
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&watering=frequent
Sunlight - optional, string
The sunlight amount of the species.
Options - full_shade, part_shade, sun-part_shade, full_sun
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&sunlight=full_sun
Indoor - optional, boolean, default is NULL
If plant species is indoors
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&indoor=1
Hardiness - optional, integer, Min is 1, Max is 13
Hardiness Zone of plant species
Zone Options - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
https://perenual.com/api/species-list?key=[YOUR-API-KEY]&hardiness=1-13


<!-- Example JSON Response -->

{
    "data": [
        {
            "id": 1,
            "common_name": "European Silver Fir",
            "scientific_name": [
                "Abies alba"
            ],
            "other_name": [
                "Common Silver Fir"
            ],
            "cycle": "Perennial",
            "watering": "Frequent",
            "sunlight": [],
            "default_image": {
                "image_id": 9,
                "license": 5,
                "license_name": "Attribution-ShareAlike License",
                "license_url": "https://creativecommons.org/licenses/by-sa/2.0/",
                "original_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/og/49255769768_df55596553_b.jpg",
                "regular_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/regular/49255769768_df55596553_b.jpg",
                "medium_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/medium/49255769768_df55596553_b.jpg",
                "small_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/small/49255769768_df55596553_b.jpg",
                "thumbnail": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/thumbnail/49255769768_df55596553_b.jpg"
            }
        },
        {
            "id": 2,
            "common_name": "Pyramidalis Silver Fir",
            "scientific_name": [
                "Abies alba 'Pyramidalis'"
            ],
            "cycle": "Perennial",
            "watering": "Frequent",
            "sunlight": [],
            "other_name": null,
            "default_image": {
                "image_id": 9,
                "license": 5,
                "license_name": "Attribution-ShareAlike License",
                "license_url": "https://creativecommons.org/licenses/by-sa/2.0/",
                "original_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/og/49255769768_df55596553_b.jpg",
                "regular_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/regular/49255769768_df55596553_b.jpg",
                "medium_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/medium/49255769768_df55596553_b.jpg",
                "small_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/small/49255769768_df55596553_b.jpg",
                "thumbnail": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/thumbnail/49255769768_df55596553_b.jpg"
            }
        }
        ...
    ],
    "to": 30,
    "per_page": 30,
    "current_page": 1,
    "from": 1,
    "last_page": 405,
    "total": 10104
}

       
Frontend
Backend
// Example React Component import React, { useState, useEffect } from 'react'; import axios from 'axios'; function App() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { try { const response = await axios.get(`https://perenual.com/api/species-list?key=[YOUR-API-KEY]`); setData(response.data); } catch (error) { console.error("Error fetching data:", error); } } fetchData(); }, []); return ( <div> <h1>API Data</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default App;
// Example Next.js Component import { useState } from 'react'; import axios from 'axios'; export default function Home() { const [response, setResponse] = useState(null); const Request = async () => { try { const result = await axios.get(`https://perenual.com/api/species-list?key=[YOUR-API-KEY]`, { someData: 'test' }); // Replace the data with your actual payload setResponse(result.data); } catch (error) { console.error("Error occured:", error); setResponse(error.message); } }; return ( <div> <button onClick={Request}>Upload Image</button> {response && <div>Response: {JSON.stringify(response)}</div>} </div> ); }
// Example Javascript Component var requestOptions = { method: '', redirect: 'follow' }; fetch(`https://perenual.com/api/species-list?key=[YOUR-API-KEY]`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
// Example Python Component import requests url = "https://perenual.com/api/species-list?key=[YOUR-API-KEY]" payload = {} headers = {} response = requests.request("", url, headers=headers, data=payload) print(response.text)
// Example PHP Component <?php $client = new GuzzleHttp\Client(); $url = "https://perenual.com/api/species-list?key=[YOUR-API-KEY]"; $response = $client->request('', $url); echo $response->getBody(); ?>
// Example NodeJS Component const axios = require('axios'); const url = `https://perenual.com/api/species-list?key=[YOUR-API-KEY]`; axios.get(url) .then((response) => { console.log(JSON.stringify(response.data)); }) .catch((error) => { console.log(error); });
// Example Ruby Component require "uri" require "net/http" url = URI("https://perenual.com/api/species-list?key=[YOUR-API-KEY]") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::.new(url) response = http.request(request) puts response.read_body
// Example Java Component Unirest.setTimeouts(0, 0); HttpResponse response = Unirest.get("https://perenual.com/api/species-list?key=[YOUR-API-KEY]") .asString();
// Example C# Component var client = new HttpClient(); var url = $"https://perenual.com/api/species-list?key=[YOUR-API-KEY]"; var response = await client.Async(url); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
// Example Go Component package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://perenual.com/api/species-list?key=[YOUR-API-KEY]" client := &http.Client {} req, err := http.NewRequest("", url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
// Example cURL Component curl --location 'https://perenual.com/api/species-list?key=[YOUR-API-KEY]'
// Example Swift Component let urlString = "https://perenual.com/api/species-list?key=[YOUR-API-KEY]" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url, timeoutInterval: Double.infinity) request.httpMethod = "" let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume()
// Example Dart Component var request = http.Request('', Uri.parse('https://perenual.com/api/species-list?key=[YOUR-API-KEY]')); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { print(await response.stream.bytesToString()); } else { print(response.reasonPhrase); }
// Example Kotlin Component val client = OkHttpClient() val request = Request.Builder() .url("https://perenual.com/api/species-list?key=[YOUR-API-KEY]") .post(RequestBody.create(null, ByteArray(0))) .build() val response = client.newCall(request).execute()
Plant Details

GET https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]
      
Path Parameter
ID - Required, integer
ID of plant species
Parameter
Key - Required
A secret/unique number to gain access


<!-- Example JSON Response -->

  {
      "id": 1,
      "common_name": "European Silver Fir",
      "scientific_name": [
          "Abies alba"
      ],
      "other_name": [
          "Common Silver Fir"
      ],
      "family": "",
      "origin": null,
      "type": "tree",
      "dimensions": {
          "type": null,
          "min_value": 1,
          "max_value": 1.5,
          "unit": "feet"
      },
      "cycle": "Perennial",
      "watering": "Frequent",
      "depth_water_requirement": {
          "unit": "mm",
          "value": "50"
      },
      "volume_water_requirement": {
          "unit": "feet",
          "value": "1"
      },
      "watering_period": "morning",
      "watering_general_benchmark": {
          "value": 5-7,
          "unit": "days"
      },
      "plant_anatomy": [
          "bark":"brown",
          "leaves":"green"
      ],
      "sunlight": [
          "Part shade"
      ],
      "pruning_month": [
          "March",
          "April"
      ],
      "pruning_count": {
          "amount": 1,
          "interval": "yearly"
      },
      "seeds": 0,
      "attracts":[
        "bees",
        "birds",
        "rabbits"
      ],
      "propagation":[
          "seed",
          "cutting"
      ],
      "hardiness": {
          "min": "7",
          "max": "7"
      },
      "hardiness_location": {
        "full_url": "https://perenual.com/api/hardiness-map-sample?map=h&key=[YOUR-API-KEY]",
        "full_iframe": "<iframe src='https://perenual.com/api/hardiness-map-sample?map=1-13&key=[YOUR-API-KEY]'
        width=1000 height=550 ></iframe>"
      },
      "flowers": true,
      "flowering_season": "Spring",
      "color": "",
      "sunlight": [
          "full sun",
          "part shade"
      ],
      "soil": [],
      "pest_susceptibility": null,
      "cones": true,
      "fruits": false,
      "edible_fruit": false,
      "fruit_color": null,
      "fruiting_season": null,
      "harvest_season": null,
      "harvest_method": "cutting",
      "leaf": true,
      "leaf_color": [
          "green"
      ],
      "edible_leaf": false,
      "growth_rate": "High",
      "maintenance": "Low",
      "medicinal": true,
      "poisonous_to_humans": false,
      "poisonous_to_pets": false,
      "drought_tolerant": false,
      "salt_tolerant": false,
      "thorny": false,
      "invasive": false,
      "rare": false,
      "rare_level": "3",
      "tropical": false,
      "cuisine": false,
      "indoor": false,
      "care_level": "Medium",
      "description": "Amazing garden plant that is sure to capture attention...",
      "default_image": {
        "image_id": 9,
        "license": 5,
        "license_name": "Attribution-ShareAlike License",
        "license_url": "https://creativecommons.org/licenses/by-sa/2.0/",
        "original_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/og/49255769768_df55596553_b.jpg",
        "regular_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/regular/49255769768_df55596553_b.jpg",
        "medium_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/medium/49255769768_df55596553_b.jpg",
        "small_url": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/small/49255769768_df55596553_b.jpg",
        "thumbnail": "https://perenual.com/storage/species_image/2_abies_alba_pyramidalis/thumbnail/49255769768_df55596553_b.jpg"
      }
  }

       
Frontend
Backend
// Example React Component import React, { useState, useEffect } from 'react'; import axios from 'axios'; function App() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { try { const response = await axios.get(`https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]`); setData(response.data); } catch (error) { console.error("Error fetching data:", error); } } fetchData(); }, []); return ( <div> <h1>API Data</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default App;
// Example Next.js Component import { useState } from 'react'; import axios from 'axios'; export default function Home() { const [response, setResponse] = useState(null); const Request = async () => { try { const result = await axios.get(`https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]`, { someData: 'test' }); // Replace the data with your actual payload setResponse(result.data); } catch (error) { console.error("Error occured:", error); setResponse(error.message); } }; return ( <div> <button onClick={Request}>Upload Image</button> {response && <div>Response: {JSON.stringify(response)}</div>} </div> ); }
// Example Javascript Component var requestOptions = { method: '', redirect: 'follow' }; fetch(`https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
// Example Python Component import requests url = "https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]" payload = {} headers = {} response = requests.request("", url, headers=headers, data=payload) print(response.text)
// Example PHP Component <?php $client = new GuzzleHttp\Client(); $url = "https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]"; $response = $client->request('', $url); echo $response->getBody(); ?>
// Example NodeJS Component const axios = require('axios'); const url = `https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]`; axios.get(url) .then((response) => { console.log(JSON.stringify(response.data)); }) .catch((error) => { console.log(error); });
// Example Ruby Component require "uri" require "net/http" url = URI("https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::.new(url) response = http.request(request) puts response.read_body
// Example Java Component Unirest.setTimeouts(0, 0); HttpResponse response = Unirest.get("https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]") .asString();
// Example C# Component var client = new HttpClient(); var url = $"https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]"; var response = await client.Async(url); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
// Example Go Component package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]" client := &http.Client {} req, err := http.NewRequest("", url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
// Example cURL Component curl --location 'https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]'
// Example Swift Component let urlString = "https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url, timeoutInterval: Double.infinity) request.httpMethod = "" let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume()
// Example Dart Component var request = http.Request('', Uri.parse('https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]')); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { print(await response.stream.bytesToString()); } else { print(response.reasonPhrase); }
// Example Kotlin Component val client = OkHttpClient() val request = Request.Builder() .url("https://perenual.com/api/species/details/[ID]?key=[YOUR-API-KEY]") .post(RequestBody.create(null, ByteArray(0))) .build() val response = client.newCall(request).execute()
Plant Disease List

GET https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]
      
Parameter
Key - Required
A secret/unique number to gain access
ID - integer, optional
ID of disease species
https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]&id=1
Page - integer, optional, default is 1
The number page you want to see.
https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]&page=3
q - optional, string
A string/query consisting of keywords that are used to search for names of species
https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]&q=monstera


<!-- Example JSON Response -->

    {
        "data": [
            {
                "id": 2,
                "common_name": "Fungi Nuisance",
                "scientific_name": " Panaeolus foenisecii/",
                "other_name": [
                    "Nuisance fungi"
                ],
                "family": null,
                "description": null,
                "solution": null,
                "host": [
                    "all lawn grasses"
                ],
                "images": [
                    {
                        "license": 45,
                        "license_name": "Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)",
                        "license_url": "https://creativecommons.org/licenses/by-sa/3.0/deed.en",
                        "original_url": "https://perenual.com/storage/species_disease/2__/og/Panaeolus_foenisecii_124316833.jpg",
                        "regular_url": "https://perenual.com/storage/species_disease/2__/regular/Panaeolus_foenisecii_124316833.jpg",
                        "medium_url": "https://perenual.com/storage/species_disease/2__/medium/Panaeolus_foenisecii_124316833.jpg",
                        "small_url": "https://perenual.com/storage/species_disease/2__/small/Panaeolus_foenisecii_124316833.jpg",
                        "thumbnail": "https://perenual.com/storage/species_disease/2__/thumbnail/Panaeolus_foenisecii_124316833.jpg"
                    }
                ]
            }
            ...
        ],
        "to": 30,
        "per_page": 30,
        "current_page": 1,
        "from": 1,
        "last_page": 8,
        "total": 239
    }

       
Frontend
Backend
// Example React Component import React, { useState, useEffect } from 'react'; import axios from 'axios'; function App() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { try { const response = await axios.get(`https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]`); setData(response.data); } catch (error) { console.error("Error fetching data:", error); } } fetchData(); }, []); return ( <div> <h1>API Data</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default App;
// Example Next.js Component import { useState } from 'react'; import axios from 'axios'; export default function Home() { const [response, setResponse] = useState(null); const Request = async () => { try { const result = await axios.get(`https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]`, { someData: 'test' }); // Replace the data with your actual payload setResponse(result.data); } catch (error) { console.error("Error occured:", error); setResponse(error.message); } }; return ( <div> <button onClick={Request}>Upload Image</button> {response && <div>Response: {JSON.stringify(response)}</div>} </div> ); }
// Example Javascript Component var requestOptions = { method: '', redirect: 'follow' }; fetch(`https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
// Example Python Component import requests url = "https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]" payload = {} headers = {} response = requests.request("", url, headers=headers, data=payload) print(response.text)
// Example PHP Component <?php $client = new GuzzleHttp\Client(); $url = "https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]"; $response = $client->request('', $url); echo $response->getBody(); ?>
// Example NodeJS Component const axios = require('axios'); const url = `https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]`; axios.get(url) .then((response) => { console.log(JSON.stringify(response.data)); }) .catch((error) => { console.log(error); });
// Example Ruby Component require "uri" require "net/http" url = URI("https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::.new(url) response = http.request(request) puts response.read_body
// Example Java Component Unirest.setTimeouts(0, 0); HttpResponse response = Unirest.get("https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]") .asString();
// Example C# Component var client = new HttpClient(); var url = $"https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]"; var response = await client.Async(url); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
// Example Go Component package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]" client := &http.Client {} req, err := http.NewRequest("", url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
// Example cURL Component curl --location 'https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]'
// Example Swift Component let urlString = "https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url, timeoutInterval: Double.infinity) request.httpMethod = "" let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume()
// Example Dart Component var request = http.Request('', Uri.parse('https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]')); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { print(await response.stream.bytesToString()); } else { print(response.reasonPhrase); }
// Example Kotlin Component val client = OkHttpClient() val request = Request.Builder() .url("https://perenual.com/api/pest-disease-list?key=[YOUR-API-KEY]") .post(RequestBody.create(null, ByteArray(0))) .build() val response = client.newCall(request).execute()
Plant Guides
Supreme User

GET https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]
      
Parameter
Key - Required
A secret/unique number to gain access
Species_ID - integer, optional
ID of species
https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]&species_id=1
Page - integer, optional, default is 1
The number page you want to see.
https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]&page=3
q - optional, string
A string/query consisting of keywords that are used to search for names of species
https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]&q=monstera
Type - optional, string
The type of guide
https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]&type=watering,sunlight


<!-- Example JSON Response -->

{
    "data": [
        {
            "id": 4,
            "species_id": 1,
            "common_name": "European Silver Fir",
            "scientific_name": [
                "Abies alba bra2",
                "Abies alba zas"
            ],
            "section": [
                {
                    "id": 1,
                    "type": "sunlight",
                    "description": "Sunlight is the most important environmental factor controlling the growth and health of European silver fir (Abies alba). This species naturally grows in open, sunny habitats and is adapted to full sunlight or partial shade. Without adequate sunlight, the needles of a silver fir will fail to produce adequate amounts of chlorophyll, a key determinant of essential photosynthesis.\n\nWhen exposed to sunlight, the foliage of a European silver fir is usually thick, dense and lush. The needles are usually a deep green color, although in some areas the needles may take on a bluish hue. Sun-exposed needles are typically more abundant and tightly packed than those in more shaded areas. Furthermore, needles of silver fir trees normally grow more rapidly when exposed to direct sunlight.\n\nThe bark of a European silver fir exposed to direct sunlight typically has a more rugged and weathered appearance. Sun-exposed bark may contain lichens and moss, which act as a natural form of sun protection. In areas where the silver fir is shaded, the bark is typically smoother and lighter in color.\n\nSunlight is essential for the optimal growth and health of a European silver fir. Although this species can survive in both full sun and partial shade, it typically performs best when exposed to adequate sunlight."
                },
                {
                    "id": 3,
                    "type": "watering",
                    "description": "Watering European silver fir trees is essential for them to stay healthy. It is important to provide them with regular watering, especially during their first growing season, as they need to establish a good root system. A weekly deep watering is all they need, but they should be more frequently watered during periods of drought and heat. The soil should always be kept moist but never soggy.\n\nIf they are planted in a container, they should be watered more frequently as they can dry out quickly in containers. The soil should be kept moist but never overly wet. Overwatering can lead to root rot, so be sure not to overwater. When watering a container grown European Silver Fir, wait for the top 1-2 inches of soil to dry out before watering again.\n\nMulching around a European silver fir is a great way to help with water retention and help the soil stay moist. An organic mulch, such as wood chips or shredded bark, can help to keep the soil from drying out and also help reduce the amount of time spent watering. It also helps suppress weeds and keeps the roots protected from extreme temperatures.\n\nOverall, regular and consistent watering is important for young European silver fir trees to help them grow and thrive."
                }
            ]
        }
    ],
    "to": 2,
    "per_page": 30,
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "total": 2
}

       
Frontend
Backend
// Example React Component import React, { useState, useEffect } from 'react'; import axios from 'axios'; function App() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { try { const response = await axios.get(`https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]`); setData(response.data); } catch (error) { console.error("Error fetching data:", error); } } fetchData(); }, []); return ( <div> <h1>API Data</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default App;
// Example Next.js Component import { useState } from 'react'; import axios from 'axios'; export default function Home() { const [response, setResponse] = useState(null); const Request = async () => { try { const result = await axios.get(`https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]`, { someData: 'test' }); // Replace the data with your actual payload setResponse(result.data); } catch (error) { console.error("Error occured:", error); setResponse(error.message); } }; return ( <div> <button onClick={Request}>Upload Image</button> {response && <div>Response: {JSON.stringify(response)}</div>} </div> ); }
// Example Javascript Component var requestOptions = { method: '', redirect: 'follow' }; fetch(`https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
// Example Python Component import requests url = "https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]" payload = {} headers = {} response = requests.request("", url, headers=headers, data=payload) print(response.text)
// Example PHP Component <?php $client = new GuzzleHttp\Client(); $url = "https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]"; $response = $client->request('', $url); echo $response->getBody(); ?>
// Example NodeJS Component const axios = require('axios'); const url = `https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]`; axios.get(url) .then((response) => { console.log(JSON.stringify(response.data)); }) .catch((error) => { console.log(error); });
// Example Ruby Component require "uri" require "net/http" url = URI("https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::.new(url) response = http.request(request) puts response.read_body
// Example Java Component Unirest.setTimeouts(0, 0); HttpResponse response = Unirest.get("https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]") .asString();
// Example C# Component var client = new HttpClient(); var url = $"https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]"; var response = await client.Async(url); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
// Example Go Component package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]" client := &http.Client {} req, err := http.NewRequest("", url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
// Example cURL Component curl --location 'https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]'
// Example Swift Component let urlString = "https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url, timeoutInterval: Double.infinity) request.httpMethod = "" let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume()
// Example Dart Component var request = http.Request('', Uri.parse('https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]')); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { print(await response.stream.bytesToString()); } else { print(response.reasonPhrase); }
// Example Kotlin Component val client = OkHttpClient() val request = Request.Builder() .url("https://perenual.com/api/species-care-guide-list?key=[YOUR-API-KEY]") .post(RequestBody.create(null, ByteArray(0))) .build() val response = client.newCall(request).execute()
Plant Hardiness Map
Supreme User

GET https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]
      
Parameter
Key - Required
A secret/unique number to gain access
Species_ID - Required, integer, optional
ID of species
https://perenual.com/api/hardiness-map?key=[YOUR-API-KEY]&species_id=1
Frontend
Backend
// Example React Component import React, { useState, useEffect } from 'react'; import axios from 'axios'; function App() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { try { const response = await axios.get(`https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]`); setData(response.data); } catch (error) { console.error("Error fetching data:", error); } } fetchData(); }, []); return ( <div> <h1>API Data</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default App;
// Example Next.js Component import { useState } from 'react'; import axios from 'axios'; export default function Home() { const [response, setResponse] = useState(null); const Request = async () => { try { const result = await axios.get(`https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]`, { someData: 'test' }); // Replace the data with your actual payload setResponse(result.data); } catch (error) { console.error("Error occured:", error); setResponse(error.message); } }; return ( <div> <button onClick={Request}>Upload Image</button> {response && <div>Response: {JSON.stringify(response)}</div>} </div> ); }
// Example Javascript Component var requestOptions = { method: '', redirect: 'follow' }; fetch(`https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
// Example Python Component import requests url = "https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]" payload = {} headers = {} response = requests.request("", url, headers=headers, data=payload) print(response.text)
// Example PHP Component <?php $client = new GuzzleHttp\Client(); $url = "https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]"; $response = $client->request('', $url); echo $response->getBody(); ?>
// Example NodeJS Component const axios = require('axios'); const url = `https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]`; axios.get(url) .then((response) => { console.log(JSON.stringify(response.data)); }) .catch((error) => { console.log(error); });
// Example Ruby Component require "uri" require "net/http" url = URI("https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::.new(url) response = http.request(request) puts response.read_body
// Example Java Component Unirest.setTimeouts(0, 0); HttpResponse response = Unirest.get("https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]") .asString();
// Example C# Component var client = new HttpClient(); var url = $"https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]"; var response = await client.Async(url); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
// Example Go Component package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]" client := &http.Client {} req, err := http.NewRequest("", url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
// Example cURL Component curl --location 'https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]'
// Example Swift Component let urlString = "https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url, timeoutInterval: Double.infinity) request.httpMethod = "" let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume()
// Example Dart Component var request = http.Request('', Uri.parse('https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]')); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { print(await response.stream.bytesToString()); } else { print(response.reasonPhrase); }
// Example Kotlin Component val client = OkHttpClient() val request = Request.Builder() .url("https://perenual.com/api/hardiness-map?species_id=[ID]&key=[YOUR-API-KEY]") .post(RequestBody.create(null, ByteArray(0))) .build() val response = client.newCall(request).execute()
Plant FAQ
Supreme User

GET https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]
      
Parameter
Key - Required
A secret/unique number to gain access
ID - integer
ID of article
https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]&id=1
Page - integer, optional, default is 1
The number page you want to see.
https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]&page=3
q - optional, string
A string/query consisting of keywords that are used to search for names of species
https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]&q=monstera


<!-- Example JSON Response -->

{
    "data": [
        {
            "id": 11,
            "question": "Do shade growing plants need any Sunlight?",
            "answer": "Shade growing plants do need sunlight, although they require less than other plants. They need some...",
            "tags": [
                "shade",
                "sunlight",
                "plant",
                "exposure",
                "half sun"
            ],
            "default_image": {
                "license": 451,
                "license_name": "CC0 1.0 Universal (CC0 1.0) Public Domain Dedication",
                "license_url": "https://creativecommons.org/publicdomain/zero/1.0/",
                "original_url": "https://perenual.com/storage/article_faq/faq_11F7qt64024fbc96e2d/og.jpg",
                "regular_url": "https://perenual.com/storage/article_faq/faq_11F7qt64024fbc96e2d/regular.jpg",
                "medium_url": "https://perenual.com/storage/article_faq/faq_11F7qt64024fbc96e2d/medium.jpg"
            }
        },
        {
            "id": 12,
            "question": "How often should you water indoor plants?",
            "answer": "Indoor plants should be watered when the soil feels dry to a depth of about two inches, usually about...",
            "tags": [
                "water willow",
                "water arum",
                "water birch",
                "indoor",
                "water"
            ],
            "default_image": {
                "license": 451,
                "license_name": "CC0 1.0 Universal (CC0 1.0) Public Domain Dedication",
                "license_url": "https://creativecommons.org/publicdomain/zero/1.0/",
                "original_url": "https://perenual.com/storage/article_faq/faq_12oHcT64024fbd1e93f/og.jpg",
                "regular_url": "https://perenual.com/storage/article_faq/faq_12oHcT64024fbd1e93f/regular.jpg",
                "medium_url": "https://perenual.com/storage/article_faq/faq_12oHcT64024fbd1e93f/medium.jpg"
            }
        }
        ...
    ],
    "to": 30,
    "per_page": 30,
    "current_page": 1,
    "from": 1,
    "last_page": 4,
    "total": 96
}

       
Frontend
Backend
// Example React Component import React, { useState, useEffect } from 'react'; import axios from 'axios'; function App() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { try { const response = await axios.get(`https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]`); setData(response.data); } catch (error) { console.error("Error fetching data:", error); } } fetchData(); }, []); return ( <div> <h1>API Data</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default App;
// Example Next.js Component import { useState } from 'react'; import axios from 'axios'; export default function Home() { const [response, setResponse] = useState(null); const Request = async () => { try { const result = await axios.get(`https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]`, { someData: 'test' }); // Replace the data with your actual payload setResponse(result.data); } catch (error) { console.error("Error occured:", error); setResponse(error.message); } }; return ( <div> <button onClick={Request}>Upload Image</button> {response && <div>Response: {JSON.stringify(response)}</div>} </div> ); }
// Example Javascript Component var requestOptions = { method: '', redirect: 'follow' }; fetch(`https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
// Example Python Component import requests url = "https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]" payload = {} headers = {} response = requests.request("", url, headers=headers, data=payload) print(response.text)
// Example PHP Component <?php $client = new GuzzleHttp\Client(); $url = "https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]"; $response = $client->request('', $url); echo $response->getBody(); ?>
// Example NodeJS Component const axios = require('axios'); const url = `https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]`; axios.get(url) .then((response) => { console.log(JSON.stringify(response.data)); }) .catch((error) => { console.log(error); });
// Example Ruby Component require "uri" require "net/http" url = URI("https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::.new(url) response = http.request(request) puts response.read_body
// Example Java Component Unirest.setTimeouts(0, 0); HttpResponse response = Unirest.get("https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]") .asString();
// Example C# Component var client = new HttpClient(); var url = $"https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]"; var response = await client.Async(url); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
// Example Go Component package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]" client := &http.Client {} req, err := http.NewRequest("", url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
// Example cURL Component curl --location 'https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]'
// Example Swift Component let urlString = "https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url, timeoutInterval: Double.infinity) request.httpMethod = "" let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume()
// Example Dart Component var request = http.Request('', Uri.parse('https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]')); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { print(await response.stream.bytesToString()); } else { print(response.reasonPhrase); }
// Example Kotlin Component val client = OkHttpClient() val request = Request.Builder() .url("https://perenual.com/api/article-faq-list?key=[YOUR-API-KEY]") .post(RequestBody.create(null, ByteArray(0))) .build() val response = client.newCall(request).execute()
Plant Article
Supreme User

Coming Soon
      
Fungus List

Coming Soon
      

HELP & SUPPORT

Join our community of coders, get help & ask questions in a collaborative environment!😄

If you got any questions or help, feel free to contact us or reach us on Discord. If you would like to get started, click down below to get access to our API! Happy coding!