ArcGIS FeatureServer Extractor avatar

ArcGIS FeatureServer Extractor

Pricing

from $0.35 / 1,000 features

Go to Apify Store
ArcGIS FeatureServer Extractor

ArcGIS FeatureServer Extractor

Point at ANY Esri ArcGIS REST layer (FeatureServer/MapServer) behind US cities, counties, DOTs, HUD & USGS. Pages a layer's /query via resultOffset honoring exceededTransferLimit, or enumerates a service root. Flat rows: every attribute as a column + geometry + lon/lat + raw. Pay per feature.

Pricing

from $0.35 / 1,000 features

Rating

0.0

(0)

Developer

Datamule

Datamule

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Point at ANY Esri ArcGIS REST layer and get clean, flat feature rows.

The ArcGIS REST API (…/FeatureServer/<id>/query and …/MapServer/<id>/query) is the single most common government / civic GIS surface in North America. Practically every US city, county, DPW, state DOT, MPO, HUD, USGS office and utility publishes its open data through an Esri ArcGIS Server or ArcGIS Online instance — that's thousands of layers behind one uniform protocol. The Apify Store has only per-instance clones; this is the generic runner. One actor turns any ArcGIS layer into structured rows — no per-site scraper.

What it does

  1. Accepts a layer query URL, a layer URL, or a service root. Give it …/FeatureServer/0/query, …/FeatureServer/0, or a bare …/FeatureServer / …/MapServer root — a root is enumerated into all of its layers automatically.
  2. Pages the layer via the standard resultOffset + resultRecordCount, honoring the layer's maxRecordCount and following exceededTransferLimit until the result set is exhausted or your cap is hit. f=json is always sent explicitly.
  3. Flattens every feature into one row: every attribute becomes its own column, plus the Esri geometry (_geometry), a computed bounding box (_bbox), _longitude/_latitude for point layers (reprojected from Web Mercator to WGS84 when needed), provenance (_serviceUrl, _layerId, _layerName, _objectId), and a lossless _raw copy of the original Esri feature.

Modes

  • Layer catalog — turn on List layers only and give a service root: the actor reads the service descriptor and emits one row per layer (id, name, geometry type, min/max scale, query URL). A cheap map of what a service exposes — then point at a specific layer's /query.
  • Features — give one or more layer query URLs (or a root, which expands to all layers), optionally a where clause and an outFields list, and it pages every matching feature.

Input

FieldDescription
ArcGIS REST URL(s) (required)One or more layer query URLs, layer URLs, or service roots. A root is enumerated into its layers. Pre-existing query params (e.g. a token) are preserved.
WHERE clauseSQL-style filter, e.g. STATE = 'CA' or POP > 100000. Default 1=1 (all rows).
Output fieldsComma-separated field names, e.g. OBJECTID,NAME,POP. Default * (all fields).
Return geometryInclude the Esri geometry, _bbox and derived lon/lat. Default on.
List layers onlyDiscovery: enumerate a service root's layers, fetch no features.
Max records (total)Cap across all layers/pages. One billable event per feature.
Page sizeServer-side records per /query call (resultRecordCount).
ArcGIS tokenOptional ?token= for secured services. Never logged.
Bearer token / Extra headersOptional auth for proxied deployments. Never logged.

Output

One row per feature. Every source attribute is promoted to a top-level column; derived and provenance fields are _-prefixed so a source column can never collide with them:

{
"OBJECTID": 1,
"PROPERTY_NAME_TEXT": "Capitol Oaks Senior Residences",
"HUB_NAME_TEXT": "Atlanta",
"PLACED_BASE_CITY_NAME_TEXT": "Atlanta",
"_serviceUrl": "https://services.arcgis.com/VTyQ9soqVukalItT/arcgis/rest/services/Multifamily_Properties_Assisted/FeatureServer/0/query",
"_layerId": "0",
"_objectId": 1,
"_geometryType": "esriGeometryPoint",
"_spatialReferenceWkid": 3857,
"_longitude": -84.4241,
"_latitude": 33.7182,
"_bbox": [-9398049.15, 3991019.62, -9398049.15, 3991019.62],
"_attributeKeys": ["HUB_NAME_TEXT", "OBJECTID", "PLACED_BASE_CITY_NAME_TEXT", "PROPERTY_NAME_TEXT"],
"_attributeCount": 4,
"_geometry": { "x": -9398049.1585, "y": 3991019.6226 },
"_raw": { }
}

Point geometries are reprojected to WGS84 _longitude/_latitude; polygon/polyline features get a computed _bbox (in the layer's native SR) and _longitude/_latitude of null. Catalog rows (_mode: "layer") carry _layerName, geometryType, type, minScale/maxScale and queryUrl instead.

Resilience

Per-layer, like a batch harvester. ArcGIS returns HTTP 200 with an {"error": …} body on a bad query — that is detected (not mistaken for success) and the offending layer is a skip-with-warning while the run continues. A dead / 403 / 404 service is skipped too; if every target fails the run exits non-zero (91) so nothing broken ships. A reachable layer whose where matches nothing yields 0 rows and a clean exit — the actor never fabricates rows. A server that ignores resultOffset (repeats the first record) is detected and paging stops to avoid a duplicate loop.

Many government ArcGIS hosts sit behind a WAF that blocks obvious bot User-Agents. The actor sends a standard browser User-Agent so it works across the widest range of public deployments.

Pricing

Pay-per-event: one feature charge per emitted row (feature, or layer in catalog mode). Aggressive subscription-tier volume discounts apply.

Examples

US HUD Multifamily Assisted Properties (ArcGIS Online, 23,781 point features):

{
"serviceUrls": ["https://services.arcgis.com/VTyQ9soqVukalItT/arcgis/rest/services/Multifamily_Properties_Assisted/FeatureServer/0/query"],
"where": "1=1",
"maxRecords": 500
}

Enumerate a service root, then extract (City of Chicago ArcGIS Server):

{
"serviceUrls": ["https://gisapps.chicago.gov/arcgis/rest/services/SampleWorldCities/MapServer"],
"listLayersOnly": true
}