# Calscape California Native Plants Scraper (`jungle_synthesizer/calscape-california-native-plants-scraper`) Actor

Scrape Calscape's full catalog of California native plants — botanical name, water needs, wildlife-attractor flags, county distribution, nursery availability, and 30+ plant attributes. Built for CA nurseries, landscape architects, and ecological garden planners.

- **URL**: https://apify.com/jungle\_synthesizer/calscape-california-native-plants-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Calscape California Native Plants Scraper

Scrapes the full plant catalog from [Calscape](https://calscape.org), California's native plant reference database. Returns botanical name, common name, water needs, sun exposure, native habitat, soil type, wildlife-attractor flags, county distribution, nursery availability, and 20+ additional plant attributes per record — structured JSON, ready to use.

---

### Calscape Scraper Features

- Extracts 28+ structured fields per plant from Calscape's 8,500+ species catalog
- Collects wildlife-attractor flags — bird species attracted, butterfly host plants, bee and hummingbird attractor status
- Returns county-level native distribution data across California
- Captures nursery availability listings for each species
- Collects image URLs from plant detail pages
- Scrapes botanical classification: family, genus, species, plant type
- Handles pagination automatically across Calscape's full catalog
- No browser required — pure HTTP with server-side rendered pages

---

### What Can You Do With Calscape Data?

- **Native plant nurseries** — Build inventory management tools or feed catalog data into e-commerce platforms with accurate species attributes
- **Landscape architects** — Compile project palettes filtered by water needs, sun exposure, and height for drought-tolerant or wildlife gardens
- **Ecological garden planners** — Identify which species attract specific bird and butterfly species, then cross-reference with county native ranges
- **Conservation organizations** — Track which California native species are stocked at nurseries and flag gaps in regional availability
- **County parks and agencies** — Pull habitat restoration candidates filtered by site type, elevation, and native plant communities
- **App developers** — Build plant identification or garden planning tools backed by Calscape's verified native plant database

---

### How Calscape Scraper Works

1. Queries Calscape's plant search API to enumerate the full catalog. The search endpoint returns paginated JSON with plant URLs — 50 plants per page, iterated until your `maxItems` limit is reached.
2. Fetches each plant's detail page over HTTP. Pages are fully server-rendered, so no browser is needed — just fast, clean HTML parsing.
3. Extracts all plant attributes from structured content blocks on each detail page. Size ranges, bloom seasons, wildlife relationships, soil preferences, and county data are all parsed into separate typed fields.
4. Outputs one record per plant to the Apify dataset. Numbers stay numbers, booleans stay booleans.

---

### Input

```json
{
  "maxItems": 50
}
````

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `maxItems` | integer | 10 | Maximum number of plant records to scrape. Set higher for bulk catalog exports. |

***

### Calscape Scraper Output Fields

```json
{
  "slug": "quercus-agrifolia-coast-live-oak",
  "botanical_name": "Quercus agrifolia",
  "common_name": "Coast Live Oak",
  "family": null,
  "genus": "Quercus",
  "species": "agrifolia",
  "plant_type": "Tree",
  "native_habitat": ["Oak Woodland", "Coastal Scrub"],
  "elevation_range": "0 - 5000 ft",
  "sun_exposure": "Full Sun, Part Shade",
  "water_needs": "Low",
  "soil_drainage": "Well Drained",
  "soil_type": ["Loam", "Sandy Loam", "Clay"],
  "max_height_ft": 70,
  "max_width_ft": 70,
  "growth_rate": "Slow",
  "flower_color": ["Yellow"],
  "bloom_months": ["January", "February", "March", "April"],
  "foliage_color": [],
  "evergreen": true,
  "drought_tolerant": null,
  "deer_resistant": null,
  "garden_uses": ["Erosion Control", "Wildlife Garden", "Shade"],
  "bird_attractor_for": [],
  "butterfly_host_for": ["Gold-Hunter's Hairstreak", "California Sister"],
  "bee_attractor": null,
  "hummingbird_attractor": null,
  "native_to_counties": [],
  "nursery_availability": ["Theodore Payne Foundation", "Rancho Santa Ana Botanic Garden"],
  "propagation": "Acorns",
  "description": "Coast Live Oak is one of California's most iconic native trees...",
  "image_urls": ["https://calscape.org/photos/quercus-agrifolia-1.jpg"],
  "calscape_url": "https://www.calscape.org/Quercus-agrifolia-(Coast-Live-Oak)"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `slug` | string | URL-derived identifier for the plant |
| `botanical_name` | string | Scientific name (genus + species) |
| `common_name` | string | Common English name |
| `family` | string | Plant family |
| `genus` | string | Genus name |
| `species` | string | Species epithet |
| `plant_type` | string | Growth form: Tree, Shrub, Perennial, Annual, Vine, Grass, etc. |
| `native_habitat` | string\[] | Site types and plant communities where the species occurs naturally |
| `elevation_range` | string | Elevation range in feet |
| `sun_exposure` | string | Light requirements |
| `water_needs` | string | Irrigation needs: None, Very Low, Low, Moderate, High |
| `soil_drainage` | string | Drainage preference |
| `soil_type` | string\[] | Preferred soil textures |
| `max_height_ft` | number | Maximum mature height in feet |
| `max_width_ft` | number | Maximum mature spread in feet |
| `growth_rate` | string | Slow, Moderate, or Fast |
| `flower_color` | string\[] | Bloom colors |
| `bloom_months` | string\[] | Months when the plant flowers |
| `foliage_color` | string\[] | Foliage colors |
| `evergreen` | boolean | True if evergreen, false if deciduous, null if not listed |
| `drought_tolerant` | boolean | Drought tolerance flag |
| `deer_resistant` | boolean | Deer resistance flag |
| `garden_uses` | string\[] | Recommended garden applications |
| `bird_attractor_for` | string\[] | Bird species this plant attracts |
| `butterfly_host_for` | string\[] | Butterfly species this plant hosts |
| `bee_attractor` | boolean | Attracts bees |
| `hummingbird_attractor` | boolean | Attracts hummingbirds |
| `native_to_counties` | string\[] | California counties where the plant is native |
| `nursery_availability` | string\[] | Nurseries stocking this species |
| `propagation` | string | Propagation method |
| `description` | string | Plant description text |
| `image_urls` | string\[] | Photo URLs from the plant's Calscape page |
| `calscape_url` | string | Direct URL to the plant's Calscape detail page |

***

### 🔍 FAQ

#### How do I scrape California native plant data from Calscape?

Calscape Scraper handles everything. Set `maxItems` to the number of plants you want, run it, and collect the dataset. The actor enumerates the full catalog through Calscape's search API and fetches each plant's detail page automatically.

#### How much does Calscape Scraper cost to run?

The actor uses pay-per-event pricing. A run of 100 plants typically finishes in a few minutes and costs less than a dollar. Residential proxies are required for catalog enumeration and are already accounted for in the pricing — no separate setup needed.

#### What data does Calscape have on California native plants?

Calscape Scraper returns botanical classification, physical dimensions, sun and water requirements, soil preferences, bloom season and flower color, wildlife relationships (birds, butterflies, bees, hummingbirds), native county distribution, nursery availability, and propagation method. That covers 28+ fields per plant across 8,500+ species.

#### Does Calscape Scraper need a browser?

No. Calscape's plant pages are server-rendered HTML, so the actor uses direct HTTP requests throughout. Faster and cheaper than a browser-based approach, and more stable over time.

#### Can I filter by plant type, water needs, or county?

The actor returns full plant records which you can filter in post-processing. Calscape Scraper currently scrapes the full catalog without upfront filter parameters — export the dataset and filter on `plant_type`, `water_needs`, `native_to_counties`, or any other field using Apify's dataset tools or your own code.

***

### Need More Features?

Need filters by plant type, county, or water needs? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use Calscape California Native Plants Scraper?

- **Structured output** — 28+ typed fields per plant with numbers as numbers and booleans as booleans, not raw strings you have to parse yourself
- **Full catalog coverage** — enumerate all 8,500+ species or stop at any count, with consistent results across runs
- **No browser overhead** — pure HTTP means faster runs, lower compute costs, and fewer moving parts to break

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## `maxItems` (type: `integer`):

Maximum number of records to scrape

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/calscape-california-native-plants-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/calscape-california-native-plants-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/calscape-california-native-plants-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/calscape-california-native-plants-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Calscape California Native Plants Scraper",
        "description": "Scrape Calscape's full catalog of California native plants — botanical name, water needs, wildlife-attractor flags, county distribution, nursery availability, and 30+ plant attributes. Built for CA nurseries, landscape architects, and ecological garden planners.",
        "version": "0.1",
        "x-build-id": "1j2RJKTlXYWNMFQZX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~calscape-california-native-plants-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-calscape-california-native-plants-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~calscape-california-native-plants-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-calscape-california-native-plants-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~calscape-california-native-plants-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-calscape-california-native-plants-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxItems"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of records to scrape"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
