# EV Charging Stations Scraper — San Francisco (`sian.agency/ev-charging-stations-scraper`) Actor

Find EV charging station listings near San Francisco. Export one completed-search record with the full station array, addresses, coordinates and available listing details. Billing is per completed search, including zero-station searches. Includes an HTML report.

- **URL**: https://apify.com/sian.agency/ev-charging-stations-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Business, Travel, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $125.72 / 1,000 completed station search records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EV Charging Stations — San Francisco ⚡

[![SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Local Business Data Scraper](https://img.shields.io/badge/Store-Local%20Business%20Data%20Scraper-1AE392)](https://apify.com/sian.agency/local-business-data-scraper?fpr=sian) [![Google Search Scraper](https://img.shields.io/badge/Store-Google%20Search%20Scraper-1AE392)](https://apify.com/sian.agency/google-serp-scraper?fpr=sian) [![Google Maps Photos Scraper](https://img.shields.io/badge/Store-Google%20Maps%20Photos%20Scraper-1AE392)](https://apify.com/sian.agency/google-maps-photos-scraper?fpr=sian)

#### 📍 A fixed station listing search near San Francisco

##### Structured snapshots for location researchers, fleet teams and analysts

### 🔎 What is the EV Charging Stations — San Francisco — and when should you use it?

The **EV Charging Stations — San Francisco** turns fixed San Francisco station listing snapshots into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** you need complete returned station objects, names, addresses and coordinates near San Francisco.

**Use something else when:** you need ordinary local businesses rather than these EV station searches. Use [Local Business Data Scraper](https://apify.com/sian.agency/local-business-data-scraper?fpr=sian) for public business listings and details. This pilot supports only a fixed San Francisco search for up to three listings; it does not promise live connector availability or arbitrary-place searches.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/ev-charging-stations-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. One completed search is charged once, including a valid zero-station response. Failed retrievals or distant fallback responses have no search-event charge. A separate run-start fee applies.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want a station listing snapshot near San Francisco using the Apify Actor `sian.agency/ev-charging-stations-scraper`.

Use it when I need: you need complete returned station objects, names, addresses and coordinates near San Francisco.

Don't use it when: you need ordinary local businesses rather than these EV station searches — use local-business-data-scraper instead.

How to call it: use the empty input or set operation to search. The actor requests up to three San Francisco listings and returns one completed-search receipt with the complete stations array.

Start with this input:
{}

Ask me whether to run the fixed San Francisco snapshot, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Find up to three station listings near San Francisco.*
- *Export the San Francisco station listings with their addresses and coordinates.*
- *Prepare a station shortlist for separate verification with operators.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/ev-charging-stations-scraper.md](https://apify.com/sian.agency/ev-charging-stations-scraper.md).

### 📋 Overview

EV Charging Stations Scraper finds station listings near San Francisco. One completed-search record contains every station returned by that search, with names, addresses, coordinates and available listing details.

This pilot requests up to three listings near San Francisco. It has no location or limit controls. Every returned coordinate must be within 100 km of 37.7749, -122.4194 before the response is delivered or the search event is charged.

- ✅ **Fixed San Francisco search**: Run one focused listing snapshot.
- ⚡ **Complete returned objects**: Keep station photos, contact fields and nested data when present.
- 🧾 **Predictable search billing**: One event includes every returned station, even if the list is empty.
- 📍 **Geographic validation**: Distant fallback results fail the complete search before delivery and its search charge.
- 📄 **Processing report**: Read station names, addresses and coordinates in the included HTML table.

A result is neither an exhaustive city registry nor a precise city-boundary search. Connector arrays were empty in the verified samples. Live availability, access and charging speed are not promised; confirm those with the station operator.

### ✨ Features

- 🌉 **San Francisco scope**: One fixed search area, with no place selector.
- 🔢 **Fixed maximum**: Request up to three listings per run.
- 📦 **One search record**: Keep the entire returned list together with the fixed search settings.
- 🏢 **Station details**: Retain the actual names, addresses, coordinates, Maps links and available contact fields.
- 🖼️ **Photo preview**: Display the first returned station photo when available.
- 📍 **Distance guard**: Reject responses containing a station more than 100 km from the San Francisco center.
- 🧾 **Explicit empty receipt**: Represent a valid zero-station response with a count of zero and an empty array.
- 📊 **Exportable snapshots**: Use complete JSON in your own research or dashboards.

### 🎬 Quick Start

Open the Input tab and start the fixed San Francisco search. The dataset contains one search record with all returned station objects, up to three listings.

```bash
curl --request POST \
  'https://api.apify.com/v2/acts/sian.agency~ev-charging-stations-scraper/runs?token=YOUR_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{}'
```

This starts a run. Wait for completion and retrieve its default dataset. The empty input uses the same fixed search. Unknown fields are rejected before retrieval; the platform run-start fee still applies.

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Check the scope

This actor searches only near San Francisco, with a fixed maximum of three listings. No input is needed.

#### Step 2: Check the price

Review the completed-search price, separate run-start fee and maximum charge before starting.

#### Step 3: Run and inspect

Check the maximum charge and current pricing, then start the actor. Use the Output tab for the processing report or export JSON for the complete station objects.

Free Apify accounts can run searches from the Console or MCP. Direct API runs require a paying Apify account. A blocked API run performs no search and has no completed-search charge; the platform run-start fee still applies.

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | Run the fixed San Francisco search. Defaults to search. Up to three listings are requested and the complete response is retained. |

```json
{}
```

There are no location, limit, address, coordinate, network, connector, power or availability controls. Unsupported fields are rejected before retrieval. Free Apify accounts use the Console or MCP; direct API runs require a paying account.

### 📤 Output

One row is one completed search, including a valid search with zero stations. The stations are nested in `stations`; they are not separate billed dataset rows.

| Field | Type | Meaning |
|---|---|---|
| `location` | string | Fixed San Francisco area |
| `locationLabel` | string | Search location |
| `resultsCount` | integer | Stations returned |
| `complete` | boolean | Search completed |
| `recordType` | string | Record type |
| `stations` | array | Complete station objects |
| `stationNames` | array | Station name list |
| `firstStationName` | string or null | First station |
| `firstStationPhoto` | string or null | First station photo |
| `firstStationAddress` | string or null | First station address |
| `searchParameters` | object | Applied search settings |
| `status` | string | Status |
| `errorMessage` | string or null | Reason |
| `_operation` | string | Operation |
| `_fetchedAt` | string | Retrieved at |

**Recorded San Francisco example, shortened to one station:**

```json
{
  "location": "san-francisco",
  "locationLabel": "San Francisco, CA, USA",
  "resultsCount": 3,
  "complete": true,
  "recordType": "completed-search",
  "stations": [
    {
      "id": "0x808f7e24f4752c8d:0x80da0ceaec87654e",
      "name": "EVgo Charging Station",
      "connectors": [],
      "formatted_address": "2860 16th St, San Francisco, CA 94103",
      "address_components": {
        "district": "Mission District",
        "street_address": "2860 16th St",
        "city": "San Francisco",
        "zipcode": "94103",
        "state": "California",
        "country": "US"
      },
      "latitude": 37.7654906,
      "longitude": -122.4167301,
      "place_link": "https://www.google.com/maps/place/data=!3m1!4b1!4m2!3m1!1s0x808f7e24f4752c8d:0x80da0ceaec87654e",
      "phone_number": "+18774943833",
      "opening_hours": {},
      "rating": 4.2,
      "review_count": 42,
      "website": "https://www.evgo.com/find-a-charger/ca/san-francisco/54059",
      "photo": "https://lh3.googleusercontent.com/grass-cs/AABkmLfaL4__SinW6I2F7rT0YZUvOV_fNiPUa5fRs5IAXhYz5FZXRxAuMtt9vQX8Rbj3BOfrnnfNpQyYM_6vuytfDavtkCSzR7y1ia1Xgeu3YmsSgK31qAusEgrVGp8hiOJ11ykhnhIuTw=w1920-h1080-k-no",
      "google_place_id": "ChIJjSx19CR-j4ARTmWH7OoM2oA",
      "google_cid": "9284747784907875662",
      "t": "srp"
    }
  ],
  "stationNames": [
    "EVgo Charging Station",
    "EVgo Charging Station",
    "EVgo Charging Station"
  ],
  "firstStationName": "EVgo Charging Station",
  "firstStationPhoto": "https://lh3.googleusercontent.com/grass-cs/AABkmLfaL4__SinW6I2F7rT0YZUvOV_fNiPUa5fRs5IAXhYz5FZXRxAuMtt9vQX8Rbj3BOfrnnfNpQyYM_6vuytfDavtkCSzR7y1ia1Xgeu3YmsSgK31qAusEgrVGp8hiOJ11ykhnhIuTw=w1920-h1080-k-no",
  "firstStationAddress": "2860 16th St, San Francisco, CA 94103",
  "searchParameters": {
    "near": "San Francisco, CA, USA",
    "limit": 3
  },
  "status": "success",
  "errorMessage": null,
  "_operation": "search"
}
```

The complete recorded search contained three stations. Only the first station object is shown above; real records retain all objects and their returned fields. Fields such as address components, opening hours, phone, website, photo, review count and connector arrays can be absent or empty.

JSON preserves the station objects and nested values. CSV and Excel exports show search-level columns and may serialize arrays as text. The HTML report presents individual station names, addresses and coordinates for inspection.

A valid empty response has `complete=true`, `recordType="completed-search"`, `resultsCount=0` and `stations=[]`. Failed retrievals use `complete=false` and an explanation; they have no completed-search event charge.

### 💼 Use Cases & Examples

#### 1. Location researchers inspecting charging listings

**Input:** The empty input for the fixed San Francisco search.
**Output:** Names, addresses, coordinates and complete station objects.
**Use:** Prepare a location snapshot for further research without treating it as an exhaustive registry.

#### 2. Fleet teams researching charging access

**Input:** The fixed San Francisco snapshot.
**Output:** Station listings and available operator links or contact details.
**Use:** Build a shortlist, then verify vehicle compatibility, access and availability directly with operators.

#### 3. Property analysts reviewing local infrastructure

**Input:** The fixed San Francisco snapshot.
**Output:** Station addresses and geographic coordinates.
**Use:** Add public charging listings to a broader property-location study. The actor does not calculate travel distance from a property.

#### 4. Market analysts examining station operators

**Input:** The fixed San Francisco snapshot.
**Output:** Actual station names and available listing websites.
**Use:** Inspect the networks present in returned results. No operator or network filter is applied.

#### 5. Developers building location dashboards

**Input:** The actor's structured search payload.
**Output:** One JSON receipt with all returned stations and applied search parameters.
**Use:** Plot coordinates in your own application and keep optional listing data alongside them.

#### 6. Analysts maintaining recurring snapshots

**Input:** The empty input on an Apify schedule.
**Output:** Timestamped search receipts.
**Use:** Compare returned listings over time in your database. Different results do not by themselves prove a station opened or closed.

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('sian.agency/ev-charging-stations-scraper').call({
  operation: 'search',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]?.stations);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('sian.agency/ev-charging-stations-scraper').call(run_input={
    'operation': 'search',
})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item.get('stations'))
```

#### cURL: retrieve a completed dataset

```bash
curl 'https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items?format=json&clean=true&token=YOUR_TOKEN'
```

Use the run-start request in Quick Start first. Replace YOUR_DATASET_ID with the completed run's default dataset ID.

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger:** Start a scheduled metro snapshot.
2. **HTTP Request:** Run the actor with empty input for its fixed San Francisco search.
3. **Process:** Wait for completion and retrieve the dataset.
4. **Action:** Save the full receipt or station array to your database, spreadsheet or map.

### 📊 Performance & Pricing

Each completed search costs one **completed-search** event. All returned stations are included, regardless of their count. A valid zero-station search is also billed once. Failed retrievals, including distant fallback responses, have no completed-search charge.

Each run has a separate run-start fee. The completed search must fit the remaining billing budget before retrieval.

| Apify plan | Completed search | Run-start fee | One completed run |
|---|---:|---:|---:|
| FREE | $0.57144 | $0.02 | $0.59144 |
| BRONZE | $0.14286 | $0.005 | $0.14786 |
| SILVER | $0.13429 | $0.005 | $0.13929 |
| GOLD | $0.12572 | $0.005 | $0.13072 |

Enterprise users should check their live Apify event price. FREE names the Apify account plan; the listed actor events still have charges. Runtime varies, and no completion time is guaranteed.

[Check current pricing before running](https://apify.com/sian.agency/ev-charging-stations-scraper?fpr=sian).

### ❓ FAQ

**Which places are supported?**

San Francisco only, with up to three listings per run. Every returned coordinate must be within 100 km of 37.7749, -122.4194. City boundaries are not promised.

**Is live connector availability included?**

No live availability is promised. Verified responses contained empty connector arrays. Listing fields are retained when returned; confirm charging access with the operator.

**What is billed?**

One completed search, including a valid search with zero stations. All returned stations are included. Failed retrievals do not incur the search event. A separate run-start fee applies.

**Can I search by coordinates or filter connector type?**

This pilot has one fixed San Francisco search and no location or limit controls. Coordinate, keyword, connector, power and availability filters are not offered.

**Does this find every station in a city?**

No. It requests up to three listings near San Francisco. A search is a snapshot, not an exhaustive registry or an exact boundary search.

**Which export should I use?**

JSON preserves complete station objects and nested connector/opening-hour data. CSV and Excel show the search-level columns; arrays may be serialized as text.

### 🐛 Troubleshooting

**Unsupported input rejected**

Use empty input or set only operation to search. Remove location, limit and other fields; this pilot uses fixed San Francisco search settings.

**The response is outside the supported metro**

The search is rejected before delivery and its completed-search charge. Retry later or report the run URL through the Issues tab. A run-start fee still applies.

**Connector or opening-hour fields are empty**

The actor retains returned listing data without filling missing details. Confirm compatibility, charging speed, access and availability with the operator.

**No stations returned**

A valid empty search has a count of zero and is billed once. Distinguish it from an error record with `complete=false`.

**Search stops before retrieval**

Read the processing report. Check the maximum charge, available credits and account allowance before retrying. The actor does not automatically repeat a data request.

### ⚖️ Legal Disclaimer

Station listings may include business contact details, photos and other information protected by privacy or intellectual-property rules. Use them for a legitimate purpose and follow applicable laws and service terms. Consult qualified counsel for advice on your own use.

Google and Google Maps are trademarks of Google LLC. SIÁN Agency is independent and is not affiliated with or endorsed by Google or any charging network.

### 🤝 Support

Report reproducible issues through the [Issues tab](https://apify.com/sian.agency/ev-charging-stations-scraper/issues). Include the input and run URL, with sensitive information removed.

- 🛠️ [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian)
- 📧 <apify@sian-agency.online>

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/ev-charging-stations-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Run one fixed San Francisco station search for up to three listings. One output record includes every returned station. A valid zero-station search is billable; failed retrievals and distant responses have no completed-search charge.

## Actor input object example

```json
{
  "operation": "search"
}
```

# Actor output Schema

## `evChargingStationSearches` (type: `string`):

EV charging station searches near San Francisco. The nested stations array preserves all returned fields. Export JSON for station objects, connector arrays and opening hours.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/ev-charging-stations-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 = { "operation": "search" }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/ev-charging-stations-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 '{
  "operation": "search"
}' |
apify call sian.agency/ev-charging-stations-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/ev-charging-stations-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/TUmLMhHm9TMZkc407/builds/ZztG4rXUu0gZ9jXFi/openapi.json
