# Boston 311 Scraper | Export Service Requests CSV/JSON (`parseforge/boston-311-complaints-scraper`) Actor

Scrape Boston 311 service requests with case ID, topic, status, full address, neighborhood, council district, geocoordinates, and resolution timestamps. Covers the live feed plus historical years 2017 to 2026. Filter by year or status. CSV, JSON, Excel.

- **URL**: https://apify.com/parseforge/boston-311-complaints-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Other, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/main/banners/parseforge-banner.jpg?raw=true)

## 🏙️ Boston 311 Complaints Scraper

> 🚀 **Export Boston 311 service requests in seconds.** Case status, addresses, neighborhoods, and timestamps — ready for CSV, Excel, or JSON.

> 🕒 **Last updated:** 2026-05-26 · **📊 30 fields** per record · **City-wide coverage** · **Live + 10 historical years**

The Boston 311 Complaints Scraper pulls service requests from Boston's open data portal (data.boston.gov). Each record covers one constituent report — potholes, street lights, missed trash pickup, graffiti — with full address, neighborhood, council district, assigned department, status, and resolution timestamps.

Live dataset plus archives back to 2017. Hundreds of thousands of records per year, geocoded.

| Target Audience | Use Cases |
|---|---|
| Urban researchers | Track service equity across neighborhoods |
| Civic journalists | Spot trends in response times by district |
| Real estate analysts | Surface complaint density by ZIP code |
| Government affairs | Benchmark city department performance |

### 📋 What the Boston 311 Scraper does

- Pulls live and historical 311 service requests
- Filters by year, case status, and free-text query
- Returns case ID, topic, status, full address, geocoordinates, and timestamps
- Exports CSV, Excel, JSON, XML

> 💡 **Why it matters:** 311 data is the highest-resolution civic signal a city emits. This scraper makes it one click away.

### 🎬 Full Demo

🚧 Coming soon

### ⚙️ Input

<table>
<tr><th>Field</th><th>Type</th><th>Description</th></tr>
<tr><td>maxItems</td><td>integer</td><td>Cap on records (free: 10, paid: up to 1,000,000)</td></tr>
<tr><td>searchQuery</td><td>string</td><td>Free-text filter across all fields</td></tr>
<tr><td>year</td><td>enum</td><td>Live or any year 2017-2026</td></tr>
<tr><td>caseStatus</td><td>enum</td><td>All / Open / Closed / In progress</td></tr>
</table>

```json
{
  "maxItems": 100,
  "year": "current",
  "caseStatus": "Open"
}
````

```json
{
  "maxItems": 500,
  "year": "2025",
  "searchQuery": "pothole"
}
```

> ⚠️ **Good to Know:** the live `current` resource updates every few minutes. Historical year files are snapshots.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🆔 caseId | string | BCS-XXXXXXXX case number |
| 📝 caseTopic | string | Service category |
| 🚦 caseStatus | string | Open / Closed / In progress |
| 📍 fullAddress | string | Street address |
| 🏘️ neighborhood | string | Boston neighborhood |
| 🗳️ cityCouncilDistrict | string | District number |
| 📅 openDate | datetime | When the case was opened |
| 📅 closeDate | datetime | When the case was closed (nullable) |
| 🌐 longitude / latitude | number | Geocoded coordinates |

### ✨ Why choose this Actor

- 🆓 Free public data, no API key required
- 🏙️ City-wide coverage with 10 years of history
- 📐 Geocoded for spatial analysis

### 📈 How it compares to alternatives

| Approach | This Actor | Manual CSV download | Direct CKAN API |
|---|---|---|---|
| Filtering | ✅ | ❌ | ⚠️ (manual params) |
| Pagination | ✅ | ❌ | ⚠️ |
| Multi-year | ✅ | ❌ | ⚠️ |

### 🚀 How to use

1. [Create a free account w/ $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp)
2. Open the actor and fill the input
3. Run and download CSV/JSON

### 💼 Business use cases

- **Real estate**: Score listings by complaint density
- **Operations research**: Benchmark response times
- **Civic tech**: Build dashboards on top of the dataset
- **Insurance**: Identify high-claim areas

### 🔌 Automating Boston 311 Scraper

Use Apify integrations with Make, Zapier, Slack, Gmail, and webhooks to schedule scrapes and pipe data into your stack.

### 🌟 Beyond business use cases

- **Research**: Equity studies across neighborhoods
- **Creative**: Data art and city visualizations
- **Non-profit**: Advocacy for under-served areas
- **Experimentation**: ML training data

### 🤖 Ask an AI assistant about this scraper

Ask any AI assistant: "What can I do with the Boston 311 dataset?"

### ❓ Frequently Asked Questions

- 🔑 **Do I need an API key?** No.
- 📅 **How fresh is the live data?** Updates every few minutes.
- 🗺️ **Are records geocoded?** Yes — lat/lng included.
- 💰 **Is it free?** Free tier returns 10 records.
- 📊 **Export formats?** CSV, Excel, JSON, XML.
- 🏘️ **Neighborhood granularity?** Yes — Boston's official neighborhood labels.
- 🏛️ **Is district included?** Yes — council, police, fire, ward, precinct.
- 📜 **How far back?** 2017-present.
- 🔁 **Can I schedule it?** Yes, via Apify schedules.
- ⚖️ **Is this legal?** The source is open public data.

### 🔌 Integrate with any app

Make, Zapier, Slack, Gmail, Google Sheets, webhooks, REST API.

### 🔗 Recommended Actors

| Actor | Description |
|---|---|
| OurAirports Scraper | Global airport database |
| Census QuickFacts Scraper | US demographic data |
| NY State Salaries Scraper | Public payroll |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more open-data scrapers.

***

*Disclaimer: This actor scrapes only publicly available data from data.boston.gov, an open-data portal operated by the City of Boston. Use the data in accordance with the source's terms.*

# Actor input Schema

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `searchQuery` (type: `string`):

Free-text search across all fields (case topic, address, neighborhood, etc.). Leave blank for all results.

## `year` (type: `string`):

Which yearly dataset to scrape.

## `caseStatus` (type: `string`):

Filter to open or closed cases.

## Actor input object example

```json
{
  "maxItems": 10,
  "year": "current",
  "caseStatus": "all"
}
```

# 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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/boston-311-complaints-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 = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("parseforge/boston-311-complaints-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 '{
  "maxItems": 10
}' |
apify call parseforge/boston-311-complaints-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/boston-311-complaints-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Boston 311 Scraper | Export Service Requests CSV/JSON",
        "description": "Scrape Boston 311 service requests with case ID, topic, status, full address, neighborhood, council district, geocoordinates, and resolution timestamps. Covers the live feed plus historical years 2017 to 2026. Filter by year or status. CSV, JSON, Excel.",
        "version": "0.1",
        "x-build-id": "5c1nFDy3bAinBpz8O"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~boston-311-complaints-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-boston-311-complaints-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/parseforge~boston-311-complaints-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-boston-311-complaints-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/parseforge~boston-311-complaints-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-boston-311-complaints-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",
                "properties": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text search across all fields (case topic, address, neighborhood, etc.). Leave blank for all results."
                    },
                    "year": {
                        "title": "Year",
                        "enum": [
                            "current",
                            "2026",
                            "2025",
                            "2024",
                            "2023",
                            "2022",
                            "2021",
                            "2020",
                            "2019",
                            "2018",
                            "2017"
                        ],
                        "type": "string",
                        "description": "Which yearly dataset to scrape.",
                        "default": "current"
                    },
                    "caseStatus": {
                        "title": "Case status",
                        "enum": [
                            "all",
                            "Open",
                            "Closed",
                            "In progress"
                        ],
                        "type": "string",
                        "description": "Filter to open or closed cases.",
                        "default": "all"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
