# PlugShare EV Charging Station Scraper (`crawlerbros/plugshare-scraper`) Actor

Scrape PlugShare's crowd-sourced EV charging station map - user check-ins, reviews, ratings, live outlet-availability status, PlugScore, and user photos, alongside station address, connectors, network, and pricing.

- **URL**: https://apify.com/crawlerbros/plugshare-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## PlugShare EV Charging Station Scraper

Scrape PlugShare — the largest crowd-sourced EV charging station locator,
built on driver check-ins, reviews, and photos rather than a static
directory. Search by location or coordinates, or pull full station detail,
community reviews, or user photos by station ID. No login, no API key, no
paid proxy required.

### What this actor does

- **Four modes:** `search` (location + radius), `byId` (direct station
  lookup), `reviews` (flattened community check-ins/reviews), `photos`
  (flattened user photos)
- **Location input:** exact latitude/longitude, or a free-text place name
  (automatically geocoded)
- **Community data, front and center:** driver check-ins with a
  working/broken rating, free-text comments, reported problems, the
  vehicle used, operator replies, helpful-vote counts, a 0-10 "PlugScore"
  community confidence rating, and user-submitted photos
- **Live-ish station detail:** per-outlet status (available / charging /
  out of order) and the timestamp of the last community-reported update
- **Filters:** connector type, network/operator, min/max power, access
  type, free-charging only, currently-available only, minimum PlugScore,
  minimum review count, nearby amenities, point-of-interest type, parking
  attributes, and brand-restriction exclusions
- **Empty fields are omitted** — every record contains only the data
  PlugShare's community actually contributed for that station

### How this differs from our Open Charge Map scraper

Our [Open Charge Map scraper](https://apify.com/crawlerbros/openchargemap-scraper)
covers Open Charge Map's global **static directory** of charging stations —
address, connectors, and operator-published metadata contributed once and
rarely updated. This actor instead scrapes **PlugShare**, an EV-driver
community app: its data is built from real driver check-ins, so every
record here can carry a PlugScore confidence rating, dated driver
reviews/ratings, reported outlet problems, operator replies to those
reviews, community-submitted photos, and outlet-level availability status
as last reported by an actual driver — none of which exist in a
static-directory dataset.

### Output per charging station (mode=search / byId)

- `locationId`, `sourceUrl` — PlugShare's station page
- `name`, `address`, `latitude`, `longitude`, `distanceKm` (mode=search)
- `poiType` — e.g. "Parking Garage/Lot", "Shopping Center"
- `accessType` — Public / Restricted / Private Home
- `accessRestrictions[]` — e.g. "Tesla Only", "Customers Only"
- `status`, `comingSoon`, `underRepair`, `confidenceLevel`
- `stationCount`, `connectorTypes[]`, `isFastCharger`
- `hasCost`, `costDescription`, `hasDynamicPricing`
- `parkingType`, `parkingAttributes[]`, `amenities[]`
- `open247`, `regularHours`, `phone`, `overheadClearanceMeters`
- `plugscore` — PlugShare's 0-10 community confidence rating
- `totalReviews`, `totalPhotos`
- `networks[]` — distinct charging-network operators on site
- `stations[]` — one entry per physical charging point: `stationId`,
  `name`, `networkName`, `networkUrl`, `cpoName`, `availableCount`,
  `lastAvailabilityUpdate`, `kilowatts`, `costPerUnit`, `costDescription`,
  `outlets[]` (`connectorType`, `status`, `kilowatts`, `amps`, `volts`,
  `isDcFastCharge`)
- `reviews[]` — community check-ins: `reviewId`, `createdAt`, `rating`,
  `ratingLabel` (Confirmed Working / Reported Problem / Comment),
  `problemType`, `comment`, `connectorType`, `kilowatts`, `amps`, `volts`,
  `reportedWaiting`, `vehicleName`, `vehicleMake`, `reviewerDisplayName`,
  `operatorResponse` (title/message/date), `helpfulVotes`, `language`
- `photos[]` — `photoId`, `photoUrl`, `thumbnailUrl`, `thumbnailUrl2x`,
  `caption`, `createdAt`, `language`
- `createdAt`, `updatedAt`
- `recordType: "chargingStation"`, `scrapedAt`

### Output per review (mode=reviews)

Same review fields as above, plus `locationId`, `locationName`,
`sourceUrl`, `stationId`; `recordType: "review"`.

### Output per photo (mode=photos)

Same photo fields as above, plus `locationId`, `locationName`,
`sourceUrl`; `recordType: "photo"`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byId` / `reviews` / `photos` |
| `locationQuery` | string | `Los Angeles, CA` | Place name to geocode (mode=search) |
| `latitude` / `longitude` | number | – | Exact search center; overrides `locationQuery` |
| `radiusKm` | integer | `25` | Search radius in km (mode=search) |
| `stationIds` | array | – | Numeric PlugShare location IDs, or full station URLs (mode=byId/reviews/photos) |
| `connectorTypes` | array (enum) | – | Filter by connector type(s) |
| `networks` | array (enum) | – | Filter by charging network(s) (curated common list) |
| `minPowerKW` / `maxPowerKW` | integer | – | Filter by fastest outlet's power |
| `accessType` | string (enum) | `publicAndRestricted` | Public / Public+Restricted / all (incl. private home) |
| `freeOnly` | boolean | `false` | Only stations with no published cost |
| `availableNowOnly` | boolean | `false` | Only stations with an outlet reported available now |
| `minStationCount` | integer | – | Minimum physical stations at the location |
| `minPlugscore` | integer | – | Minimum PlugScore (0-10) |
| `minReviewCount` | integer | – | Minimum community review count |
| `amenities` | array (enum) | – | Filter by nearby amenities |
| `poiTypes` | array (enum) | – | Filter by point-of-interest type |
| `parkingAttributes` | array (enum) | – | Filter by parking attributes |
| `excludeAccessRestrictions` | array (enum) | – | Exclude brand-restricted stations (e.g. Tesla-only) |
| `includeReviews` | boolean | `true` | Embed community reviews/check-ins in each station record |
| `includePhotos` | boolean | `true` | Embed user photos in each station record |
| `maxReviewsPerStation` | integer | `10` | Cap on embedded/emitted reviews per station |
| `maxPhotosPerStation` | integer | `5` | Cap on embedded/emitted photos per station |
| `maxItems` | integer | `20` | Hard cap on emitted records (1-500) |

#### Example: fast chargers near a city, with community data

```json
{
  "mode": "search",
  "locationQuery": "Austin, TX",
  "radiusKm": 20,
  "connectorTypes": ["ccs1", "nacsTesla"],
  "minPlugscore": 6,
  "maxItems": 30
}
```

#### Example: read the community reviews for specific stations

```json
{
  "mode": "reviews",
  "stationIds": ["7057", "478737"],
  "maxItems": 50
}
```

#### Example: pull user-submitted photos for a station

```json
{
  "mode": "photos",
  "stationIds": ["7057"]
}
```

#### Example: look up specific stations by ID

```json
{
  "mode": "byId",
  "stationIds": ["7057", "478737"]
}
```

### Use cases

- **EV route planning tools** — layer in real driver-confirmed
  availability, not just a static connector list
- **Trust & reliability research** — surface reported problems and
  operator responses per network or per location
- **Fleet management** — check current outlet status and recent check-ins
  before routing a vehicle to a charger
- **Market research** — compare community sentiment (PlugScore, review
  volume) across networks or regions
- **Site selection** — assess EV charging density and driver satisfaction
  around a property

### Data source / limitations

This actor uses PlugShare's public v3 REST API (`api.plugshare.com/v3`) —
the same backing API PlugShare's own web map at plugshare.com calls from
every visitor's browser. It does not require a PlugShare account: the
actor uses the same public client identity PlugShare's own web app ships
to every anonymous visitor, so every user of this actor gets full public
data access with zero configuration. Registering a PlugShare account only
unlocks extra personal features (trip planning, saved vehicles); it is not
required for any data this actor returns.

- **Per-query cap:** PlugShare's `/locations/nearby` endpoint returns at
  most 500 stations per search, which is why `maxItems` is capped at 500.
- **Network filter is curated, not exhaustive.** PlugShare tracks
  hundreds of distinct network records; the `networks` filter covers the
  most commonly searched ones. Every station's own `networks` output
  field is still returned regardless of whether it matches the filter.
- **Geocoding:** free-text `locationQuery` values are resolved to
  coordinates via the public OpenStreetMap Nominatim API (also keyless).
- **Community data is only as complete as PlugShare's contributors.**
  `plugscore`, `totalReviews`, `reviews[]`, and `photos[]` are omitted for
  stations with no community activity yet — this reflects PlugShare's own
  data, not a scraping gap.
- **Reviewer identity:** only each reviewer's public PlugShare display
  name is included (the same name shown on plugshare.com itself); no
  private contact information is ever exposed by PlugShare's public API.

### FAQ

**Do I need a PlugShare account or API key?** No. This actor works out of
the box with no registration.

**Can I search by coordinates instead of a place name?** Yes — set
`latitude`/`longitude` directly; they take priority over `locationQuery`.

**Can I paste a PlugShare station URL instead of finding its numeric ID?**
Yes — `stationIds` accepts either the bare ID (`7057`) or the full URL
(`https://www.plugshare.com/location/7057`).

**What is PlugScore?** PlugShare's own 0-10 community confidence rating
for a station, derived from driver check-ins and reviews over time.

**What does `ratingLabel` mean on a review?** PlugShare unifies check-ins
and reviews into one activity type: "Confirmed Working" (driver
successfully charged), "Reported Problem" (driver could not charge, with
a `problemType`), or "Comment" (a note with no charge attempt).

**Why do some stations have no `reviews` or `photos`?** PlugShare is
crowd-sourced; not every station has received a community check-in,
review, or photo yet. The fields are only included when they exist.

**How fresh is the availability data?** Each physical station's
`stations[].lastAvailabilityUpdate` shows when the community last
reported that station's outlet status.

**Can I get just the reviews or just the photos without the full station
record?** Yes — use `mode=reviews` or `mode=photos` with `stationIds`.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `locationQuery` (type: `string`):

Free-text place name to search near (city, address, landmark). Geocoded automatically. Ignored if `latitude`/`longitude` are set.

## `latitude` (type: `number`):

Exact search-center latitude. Overrides `locationQuery` when set together with `longitude`.

## `longitude` (type: `number`):

Exact search-center longitude. Overrides `locationQuery` when set together with `latitude`.

## `radiusKm` (type: `integer`):

Only emit stations within this distance of the search center (mode=search).

## `stationIds` (type: `array`):

Numeric PlugShare location IDs, e.g. `7057`, or full PlugShare station URLs, e.g. `https://www.plugshare.com/location/7057` (either form works).

## `connectorTypes` (type: `array`):

Only emit stations offering at least one of these connector types (mode=search).

## `networks` (type: `array`):

Only emit stations on these charging networks (mode=search). Curated list of common networks — a station's own `networks` output field is populated regardless of this filter.

## `minPowerKW` (type: `integer`):

Drop stations whose fastest outlet is below this power.

## `maxPowerKW` (type: `integer`):

Drop stations whose fastest outlet is above this power.

## `accessType` (type: `string`):

Which access levels to include.

## `freeOnly` (type: `boolean`):

Only emit stations with no published charging cost.

## `availableNowOnly` (type: `boolean`):

Only emit stations with at least one outlet currently reported available by the community.

## `minStationCount` (type: `integer`):

Drop locations with fewer physical charging stations than this.

## `minPlugscore` (type: `integer`):

Drop stations below this PlugShare community confidence score (0-10 scale, based on check-ins and reviews).

## `minReviewCount` (type: `integer`):

Only emit stations with at least this many community reviews/check-ins.

## `amenities` (type: `array`):

Only emit stations tagged with at least one of these nearby amenities.

## `poiTypes` (type: `array`):

Only emit stations located at one of these point-of-interest types.

## `parkingAttributes` (type: `array`):

Only emit stations with at least one of these parking attributes.

## `excludeAccessRestrictions` (type: `array`):

Drop stations restricted to these vehicle brands only.

## `includeReviews` (type: `boolean`):

Embed each station's community check-ins/reviews (rating, comment, reported problem, vehicle, operator response) in the output.

## `includePhotos` (type: `boolean`):

Embed each station's user-submitted photos in the output.

## `maxReviewsPerStation` (type: `integer`):

Cap on embedded reviews/check-ins per station (mode=search / byId), or per station in mode=reviews.

## `maxPhotosPerStation` (type: `integer`):

Cap on embedded photos per station (mode=search / byId), or per station in mode=photos.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "locationQuery": "Los Angeles, CA",
  "radiusKm": 25,
  "stationIds": [],
  "connectorTypes": [],
  "networks": [],
  "accessType": "publicAndRestricted",
  "freeOnly": false,
  "availableNowOnly": false,
  "amenities": [],
  "poiTypes": [],
  "parkingAttributes": [],
  "excludeAccessRestrictions": [],
  "includeReviews": true,
  "includePhotos": true,
  "maxReviewsPerStation": 10,
  "maxPhotosPerStation": 5,
  "maxItems": 20
}
```

# Actor output Schema

## `chargingStations` (type: `string`):

Dataset containing all scraped PlugShare records.

# 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 = {
    "mode": "search",
    "locationQuery": "Los Angeles, CA",
    "radiusKm": 25,
    "stationIds": [],
    "connectorTypes": [],
    "networks": [],
    "accessType": "publicAndRestricted",
    "freeOnly": false,
    "availableNowOnly": false,
    "amenities": [],
    "poiTypes": [],
    "parkingAttributes": [],
    "excludeAccessRestrictions": [],
    "includeReviews": true,
    "includePhotos": true,
    "maxReviewsPerStation": 10,
    "maxPhotosPerStation": 5,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/plugshare-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 = {
    "mode": "search",
    "locationQuery": "Los Angeles, CA",
    "radiusKm": 25,
    "stationIds": [],
    "connectorTypes": [],
    "networks": [],
    "accessType": "publicAndRestricted",
    "freeOnly": False,
    "availableNowOnly": False,
    "amenities": [],
    "poiTypes": [],
    "parkingAttributes": [],
    "excludeAccessRestrictions": [],
    "includeReviews": True,
    "includePhotos": True,
    "maxReviewsPerStation": 10,
    "maxPhotosPerStation": 5,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/plugshare-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "search",
  "locationQuery": "Los Angeles, CA",
  "radiusKm": 25,
  "stationIds": [],
  "connectorTypes": [],
  "networks": [],
  "accessType": "publicAndRestricted",
  "freeOnly": false,
  "availableNowOnly": false,
  "amenities": [],
  "poiTypes": [],
  "parkingAttributes": [],
  "excludeAccessRestrictions": [],
  "includeReviews": true,
  "includePhotos": true,
  "maxReviewsPerStation": 10,
  "maxPhotosPerStation": 5,
  "maxItems": 20
}' |
apify call crawlerbros/plugshare-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/plugshare-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1XypQESsEnp6PXG2x/builds/JFLvQXhAlb2ebjYX7/openapi.json
