NYC 311 Service Requests Scraper
parseforge/nyc-311-service-requests-scraper
BusinessOtherAutomation
Scrapes NYC 311 service requests from the public data feed. Filter by complaint type, agency, borough, status, ZIP code, and date range, and get each request as a flat row.
- Total users
- 1
- Monthly active
- 0
- Total runs
- 106
- Bookmarked
- 0
- Rating
- Not rated yet
- Last modified
- 9 days ago
Overview
NYC 311 Service Requests Scraper
Scrape NYC 311 service requests by complaint type, agency, borough, or date range, up to a million per run. Each record includes the status, location, and timestamps for every reported issue. No API key or registration required. Export to CSV, JSON, Excel, or XML.
The NYC Open Data portal provides a public API, but it requires pagination handling and has query complexity limits. This Actor reads the 311 service request feed directly, letting you filter by complaint type, responding agency, borough, status, ZIP code, and date range. It returns each matching request in a consistent, flat schema ready for analysis.
| Who uses it | What they scrape NYC 311 for |
|---|---|
| City planners | Analyze neighborhood-level complaint patterns to prioritize infrastructure projects. |
| Journalists | Track response times for specific agencies or complaint types across boroughs. |
| Real estate analysts | Monitor quality-of-life complaints like noise or heating issues in target ZIP codes. |
| Civic hackers | Build dashboards showing open 311 issues by category and geography. |
What it does
This Actor collects NYC 311 service requests from the public data feed and returns each one as a flat row with its status, agency, location, and timestamps.
- ποΈ Agency filter: Narrow results to a specific responding agency, from NYPD to Emergency Management.
- π Date range control: Set opened-from and opened-to dates to capture requests within a precise window.
- πΊοΈ Geographic targeting: Filter by borough or ZIP code to isolate issues in a single neighborhood.
- π Status tracking: Pull only open, in-progress, or closed requests to monitor resolution lifecycles.
Results export to CSV, JSON, Excel, or XML, or straight from the API.
What you can do with NYC 311 data
π Track agency performance.
A policy analyst pulls all closed noise complaints for the NYPD over six months to measure average response time by borough.
ποΈ Assess neighborhood livability.
A real estate researcher collects heating and hot water complaints in a Brooklyn ZIP code to evaluate tenant satisfaction trends.
ποΈ Monitor sanitation issues.
A community board member runs a weekly scrape of DSNY-related requests to identify missed collection hotspots.
π° Investigate city services.
A journalist filters open HPD violations in the Bronx to build a story on housing code enforcement delays.
Why choose this scraper
| What you get | |
|---|---|
| No API key needed | Access the public 311 feed without registration or authentication. |
| Flexible filtering | Combine complaint type, agency, borough, status, and date range in a single run. |
| Structured output | Every request arrives as a clean row with consistent fields for status, location, and timestamps. |
| Scalable collection | Collect up to a million records per run for large-scale historical analysis. |
How it compares
No other Store actor targets NYC 311 the same way, so the honest comparison is with the alternatives teams actually weigh.
| NYC 311 Service Requests Scraper | Build it in-house | By hand | |
|---|---|---|---|
| Setup | Run it now, zero config | Days of engineering | None, but hours per pull |
| When NYC 311 changes | Maintained for you | You fix it | You re-learn the page |
| Proxies, retries, anti-bot | Built in | Your problem | Browser only |
| Output | Fixed JSON schema, CSV/Excel export | Whatever you build | Copy-paste |
| Cost | Pay per result | Engineering time | Analyst hours |
Configure the run
Drive the Actor with complaint type, agency, borough, status, ZIP code, and date range filters, alone or in combination, so only matching requests reach your dataset. The Input tab lists every parameter.
A first run with the defaults:
{
"maxItems": 10,
"sortOrder": "newest"
}
A larger pull:
{
"maxItems": 200,
"sortOrder": "newest"
}
Pricing
Pay-per-result: $0.005 per result collected. You pay only for the results written to your dataset.
| Results collected | Approximate cost |
|---|---|
| 100 results | $0.50 |
| 1,000 results | $5.00 |
| 10,000 results | $50.00 |
New Apify accounts start with $5 in free credit.
Free users
Free-plan runs return up to 10 results as a preview. Upgrade your Apify plan to collect up to 1,000,000 results per run.
Run it
- Create a free Apify account with $5 in credit.
- Open the NYC 311 Service Requests Scraper.
- Set your inputs and any filters, then click Start.
- Export the results as CSV, Excel, JSON, or XML from the Dataset tab.
Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.
Use with AI agents (MCP)
Give an AI agent live access to NYC 311 through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/nyc-311-service-requests-scraper"
Then prompt it in plain language to run the scraper and read back the results.
Troubleshooting
Why am I getting no results?
Check that your filters are not too restrictive. Try removing the complaint type or date range to see if broader queries return data. Also verify that your date format is YYYY-MM-DD.
The run stopped before reaching my maxItems limit.
The Actor stops when there are no more matching records in the feed. Try widening your date range or removing other filters to collect more data.
My complaint type filter is not returning expected results.
Complaint type names must match the exact string used in the 311 system, such as 'Noise - Residential'. Try a partial match or check the NYC Open Data portal for valid type names.
The run is taking a long time.
Large date ranges or high maxItems values will increase run time. Reduce the date window or lower the maximum records to speed up collection.
FAQ
| Question | Answer |
|---|---|
| Does this scraper use the official NYC 311 API? | No, it reads from the public NYC Open Data feed directly. You do not need an API key or app registration. |
| Can I filter by a specific complaint type like noise or illegal parking? | Yes. Use the Complaint Type field to enter a specific category such as 'Noise - Residential' or 'Illegal Parking'. |
| How many service requests can I collect in one run? | You can set the maximum up to 1,000,000 records per run. The Actor will stop when it reaches that limit or exhausts the matching data. |
| What date range can I scrape? | Use the Opened From and Opened To fields in YYYY-MM-DD format to define any window. The feed goes back several years. |
| Can I get only open requests? | Yes. Set the Status filter to 'Open' to retrieve only unresolved service requests. |
| Which agencies can I filter by? | You can select from 19 agencies including NYPD, HPD, DOT, DSNY, DEP, DOB, FDNY, and others. |
| Is it possible to scrape a single ZIP code? | Yes. Enter a five-digit ZIP code in the ZIP code field to restrict results to that area. |
| What format is the exported data? | You can export your dataset in CSV, JSON, Excel, or XML format from the Apify platform. |
| Does this Actor run on a schedule? | You can set up a recurring schedule in Apify to run the Actor daily, weekly, or at any custom interval. |
Related actors
Browse the full ParseForge collection for more scrapers.
π Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.
β οΈ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by City of New York. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.
Input
| Field | Type | What it does | Default |
|---|---|---|---|
| maxItems | integer | Maximum number of service requests to collect per run. | 10 |
| complaintType | string | Filter records to a specific complaint type (e.g. Noise - Residential, HEAT/HOT WATER, Illegal Parking). | not set |
| agency | string (19 options) | Filter by responding city agency code. | not set |
| borough | string (5 options) | Restrict to a single borough. | not set |
| status | string (8 options) | Open, in-progress, or closed records. | not set |
| openedFrom | string | Only records opened on or after this date. | not set |
| openedTo | string | Only records opened on or before this date. | not set |
| zip | string | Filter by incident ZIP code. | not set |
| sortOrder | string (2 options) | Order returned records by creation date. | newest |
Pricing
from $3.75 per 1,000 results
| Charged for | What it is | Price each |
|---|---|---|
| Result Item | Charged once per result collected. | $0.00375 to $0.005 |
Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.
API
One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.
curl -X POST "https://api.apify.com/v2/acts/parseforge~nyc-311-service-requests-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"helloWorld": 123
}' Examples
Input that runs as-is.
{
"helloWorld": 123
} Reviews
No reviews yet. Be the first.
Issues
We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.
Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.
