ParseForge Scrapers

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.

Run this scraper See the API call
Total users
1
Monthly active
0
Total runs
106
Bookmarked
0
Rating
Not rated yet
Last modified
9 days ago

Overview

ParseForge

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

  1. Create a free Apify account with $5 in credit.
  2. Open the NYC 311 Service Requests Scraper.
  3. Set your inputs and any filters, then click Start.
  4. 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

FieldTypeWhat it doesDefault
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 forWhat it isPrice 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.

POST Β· run and get results
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.

input.json
{
  "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.

Related scrapers

Run NYC 311 Service Requests Scraper on Apify All scrapers