Open311 Service Request Extractor
Pricing
from $0.35 / 1,000 records
Open311 Service Request Extractor
Point at any Open311 (GeoReport v2) city for one structured row per 311 service request: id, status, service, description, address, coordinates, media, agency, timestamps. Also pull the service-type catalog and the endpoint discovery — the open municipal-311 standard, anonymous read.
Pricing
from $0.35 / 1,000 records
Rating
0.0
(0)
Developer
Datamule
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
What does Open311 Service Request Extractor do?
Open311 Service Request Extractor turns municipal 311 feeds into structured, agent-ready records. Point it at any compatible Open311 GeoReport v2 jurisdiction to collect public service requests, the jurisdiction's service catalog, or its discovery document. Request rows include the service-request ID, status, service type, description, address, coordinates, media, timestamps, source identity, and the complete source object in _raw.
Run it on Apify to access results through the API, schedule recurring collection, connect datasets to other tools, and monitor runs without maintaining scraper infrastructure.
Why use Open311 Service Request Extractor?
- Municipal operations agents: monitor new or unresolved pothole, sanitation, parking, graffiti, and streetlight reports.
- Civic research: compare issue types, response states, and reporting patterns across compatible jurisdictions.
- Alerts and workflows: feed new requests into a queue, dashboard, geospatial pipeline, or incident-triage agent.
- Service discovery: list valid
service_codevalues before building a filtered request workflow. - Lossless downstream processing: use normalized columns for common analysis while retaining each complete source object in
_raw.
How to use Open311 Service Request Extractor
- Open the Actor's Input tab.
- Paste an Open311 jurisdiction base URL or full JSON endpoint.
- Choose
requests,services, ordiscoverymode. - Keep the default 25-row cap for a small first run, or set another positive cap.
- Start the run and open the Dataset tab to inspect or export the rows.
Try this exact input:
{"jurisdiction":"https://mobile311.sfgov.org","maxRecords":25,"mode":"requests"}
Input
| Field | Type | Description |
|---|---|---|
jurisdiction | string | One Open311 base URL or full requests.json, services.json, or discovery.json endpoint. |
jurisdictions | array | Optional multi-city list. The global row cap applies across all sources. |
mode | string | requests (default), services, or discovery. |
maxRecords | integer | Global output cap. Omitted, invalid, or non-positive values resolve to 25; every explicit positive cap is preserved. |
serviceCode | string | Requests-mode filter passed as service_code. Run services mode to discover valid codes. |
status | string | Requests-mode filter: all, open, or closed. |
startDate, endDate | string | Optional RFC 3339 date-time window for requests. |
serviceRequestId | string | One ID or a comma-separated list of request IDs. |
jurisdictionId | string | Optional identifier for multi-tenant Open311 servers. |
token | secret string | Optional bearer credential for a jurisdiction that requires authentication. It is never logged. |
extraHeaders | object | Optional request headers for a gateway-fronted source. Header values are never logged. |
Output
Fresh local acceptance with the exact try input above returned 25 genuine service requests and stopped at the cap. The following is an abridged row from that San Francisco Open311 run; actual dataset rows include every nullable schema column plus the complete source object in _raw.
{"_type": "service_request","_source": "https://mobile311.sfgov.org","_endpoint": "https://mobile311.sfgov.org/open311/v2/requests.json","_mode": "requests","_software": "open311","serviceRequestId": "101004471550","status": "open","serviceName": "Blocked driveway and illegal parking","serviceCode": "MTA:Parking Enforcement:General Enforcement","description": "Jeep blocking pedestrian path","requestedDatetime": "2026-07-21T02:54:51Z","updatedDatetime": "2026-07-21T02:55:29Z","address": "164 29 Th St","lat": 37.74398683,"long": -122.42360781}
You can download the dataset in formats such as JSON, HTML, CSV, or Excel, or read it through the Apify API.
Data table and field dictionary
| Field | Meaning |
|---|---|
_type | service_request, service, or discovery. |
_source, _jurisdiction | Jurisdiction value supplied to the Actor and optional multi-tenant jurisdiction ID. |
_endpoint | Resolved Open311 JSON endpoint. |
_mode, _software | Normalized mode and open311 software identity. |
serviceRequestId | Jurisdiction-issued request ID. |
status, statusNotes | Current request state and optional status detail. |
serviceName, serviceCode | Human-readable service and machine filter code. |
description | Public issue description supplied by the source. |
requestedDatetime, updatedDatetime, expectedDatetime | Normalized source timestamps when present. |
address, addressId, zipcode, lat, long | Source-provided location fields. |
mediaUrl | Optional public media URL. |
requestToken | Source-provided Open311 request-tracking token, when present. |
agencyResponsible, serviceNotice | Optional routing and service-level information. |
metadata, type, group, keywords | Service-catalog fields used in services mode. |
changeset, contact, keyService, specification, endpointUrls, endpoints | Discovery fields used in discovery mode. |
_raw | Complete, lossless JSON object returned by the source. |
How much does it cost to extract Open311 data?
The active FREE-tier pay-per-event price is $0.0005 per emitted record. The default first run emits at most 25 rows, so its FREE-tier PPE event-charge ceiling is:
25 × $0.0005 = $0.0125
This is an event-charge ceiling, not the total run cost. Apify infrastructure usage, such as compute, storage, or a user-selected proxy, is separate. A smaller positive cap lowers the ceiling; a larger positive cap raises it proportionally.
Tips, coverage, freshness, and limits
- Start with
servicesmode to discover jurisdiction-specific service codes, then useserviceCodein requests mode. - Use
startDate,endDate, andstatusto reduce volume and focus an alerting or monitoring job. maxRecordsis global across a multi-jurisdiction run, not a per-city cap.- Open311 servers control data freshness and retention. Results represent what the source returned at run time; many request feeds default to a recent window.
- Pagination behavior varies because GeoReport v2 does not standardize it. The Actor de-duplicates request IDs and stops when a server repeats a page or the global cap is reached.
- Missing optional fields remain
null; they are not fabricated.
FAQ, public-data scope, troubleshooting, and support
Which sources are supported? Compatible Open311 GeoReport v2 JSON endpoints. A normal website root is accepted only when the standard /open311/v2/ paths exist. If a root is invalid, use the jurisdiction's full JSON endpoint.
Why was a source skipped after returning HTML? The URL is probably a website page, anti-bot interstitial, or non-Open311 endpoint. Confirm that requests.json, services.json, or discovery.json returns JSON.
What if the source requires authentication? Supply your own token or extraHeaders. The Actor does not bypass access controls. Invalid credentials, forbidden replies, and unavailable sources are skipped with a warning; a run where every source is invalid fails clearly.
Why did a valid run return zero rows? The selected date range, status, service code, or request ID may have no matches. Widen or remove filters, try requests mode, or check the source directly. A valid zero-row response is kept distinct from an invalid source.
Is the data private? This Actor is designed for public civic-data endpoints. Records can still contain addresses, free-text descriptions, or media supplied to a municipality. Review the source's terms, applicable privacy rules, and your downstream retention policy before redistributing data.
Open311 implementations differ and can change without notice. Use the Actor's Issues tab to report a source-specific problem or request a custom integration.