ARC Geospatial API

Anonymous query access to the 108 public hosted feature services in the Appalachian Regional Commission's own ArcGIS Online organization (org id nkunl3y8FDxPkXDl, portal arcgov.maps.arcgis.com). This is where ARC's numbers live in machine-readable form: the ARC region boundary, the 423 Appalachian counties keyed on FIPS, the 74 Local Development Districts, congressional districts, rural-urban county types, and the annual county economic-status designations from FY2014 through FY2027 alongside ACS poverty, median household income, SNAP, broadband, education-attainment and population-change series. Returns Esri feature JSON, RFC 7946 GeoJSON or PBF.

Operations 4

GET /services GET /services #
GET /services/{serviceName}/FeatureServer GET /services/{serviceName}/FeatureServer #
GET /services/{serviceName}/FeatureServer/{layerId} GET /services/{serviceName}/FeatureServer/{layerId} #
GET /services/{serviceName}/FeatureServer/{layerId}/query GET /services/{serviceName}/FeatureServer/{layerId}/query #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/arc-geospatial-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

appalachian-regional-commission-geospatial-api-openapi.yml Raw ↑
# method: derived
# x-source-url: https://services.arcgis.com/nkunl3y8FDxPkXDl/arcgis/rest/services?f=json
# generated: '2026-09-07'
# Derived by the API Evangelist enrichment pipeline from the provider's own live
# discovery document. The Appalachian Regional Commission publishes no OpenAPI.
openapi: 3.1.0
info:
  title: ARC Geospatial API (ArcGIS Feature Services)
  version: '12'
  summary: Anonymous query access to the 108 public hosted feature services in the Appalachian Regional Commission's
    ArcGIS Online organization.
  description: 'The Appalachian Regional Commission operates an ArcGIS Online organization — portal name "Appalachian
    Regional Commission", urlKey `ARCgov`, organization id `nkunl3y8FDxPkXDl`, confirmed by https://arcgov.maps.arcgis.com/sharing/rest/portals/self
    on 2026-09-07 — and publishes 108 hosted feature services from it at https://services.arcgis.com/nkunl3y8FDxPkXDl/arcgis/rest/services.
    They are public, anonymous and require no key.


    This is where ARC''s actual regional data lives in machine-readable form: the ARC region boundary, the 423 Appalachian
    counties, the 74 Local Development Districts, congressional districts, rural-urban county types, and the annual
    county economic-status designations (arcfy2014 through arcfy2025 plus the FY2027 distressed-areas series) alongside
    ACS poverty, median household income, SNAP, broadband, education-attainment and population-change series. The
    web maps and PDFs at https://www.arc.gov/research-and-data/ are renderings of these services.


    Every service observed advertises `capabilities: Query` only — read-only, no editing. Layers support GeoJSON
    output, server-side statistics, ordering, distinct values and `resultOffset`/`resultRecordCount` paging, with
    `maxRecordCount` 1000.


    This document was DERIVED by API Evangelist from the live services directory and layer descriptors fetched on
    2026-09-07, and every operation below was called against `arc_counties` to confirm it answers anonymously (`returnCountOnly=true`
    returned 423). ARC publishes no OpenAPI of its own; the ArcGIS REST interface is Esri''s, and this document
    records ARC''s instance of it.'
  contact:
    name: Appalachian Regional Commission
    url: https://www.arc.gov/contact-arc/
  license:
    name: U.S. Government Work
    url: https://www.arc.gov/arc-web-and-privacy-policy/
  x-derived-by: API Evangelist enrichment pipeline
  x-derived-from: https://services.arcgis.com/nkunl3y8FDxPkXDl/arcgis/rest/services?f=json
  x-derived-on: '2026-09-07'
  x-provider-published: false
  x-arcgis-org-id: nkunl3y8FDxPkXDl
  x-arcgis-portal: https://arcgov.maps.arcgis.com
  x-arc-services:
  - ARC_IPEDS_2017
  - Economic_Status_in_Appalachia_FY_2026
  - IPEDS_2021_2022
  - Income_Gini_Index_2007_2011
  - Summarize_ANRC_Participates_within_H_P_Counties
  - Summarize_ANRC_Participates_within_P_P_Counties
  - USA_Major_Cities_in_Appalachia
  - arc_acp_participation_rate_2023_02_01
  - arc_acs_2019_broadband
  - arc_acs_2019_computer_devices
  - arc_acs_2019_county_types
  - arc_acs_2019_education_chg
  - arc_acs_2019_labor_force
  - arc_acs_2019_median_hh_income
  - arc_acs_2019_population_chg
  - arc_acs_2019_poverty_chg
  - arc_acs_2019_poverty_rates
  - arc_acs_2020_SNAP
  - arc_acs_2020_broadband
  - arc_acs_2020_computer_devices
  - arc_acs_2020_education_chg
  - arc_acs_2020_labor_force
  - arc_acs_2020_median_hh_income
  - arc_acs_2020_population
  - arc_acs_2020_population_chg
  - arc_acs_2020_poverty_rates
  - arc_acs_2021_SNAP
  - arc_acs_2021_broadband
  - arc_acs_2021_computer_devices
  - arc_acs_2021_education_chg
  - arc_acs_2021_labor_force
  - arc_acs_2021_median_hh_income
  - arc_acs_2021_population
  - arc_acs_2021_population_chg
  - arc_acs_2021_poverty_rates
  - arc_acs_2022_broadband
  - arc_acs_2022_broadband_chg
  - arc_acs_2022_computer_devices
  - arc_acs_2022_hs_education_chg
  - arc_acs_2022_labor_force
  - arc_acs_2022_median_hh_income
  - arc_acs_2022_poverty_rates
  - arc_acs_2022_snap
  - arc_acs_2023_broadband_500k
  - arc_acs_2023_broadband_chg_500k
  - arc_acs_2023_broadband_chg_tiger
  - arc_acs_2023_broadband_tiger
  - arc_acs_2023_computer_devices_500k
  - arc_acs_2023_computer_devices_tiger
  - arc_acs_2023_hs_education_chg_tiger
  - arc_acs_2023_labor_force_tiger
  - arc_acs_2023_median_hh_income_tiger
  - arc_acs_2023_poverty_rates_tiger
  - arc_acs_2024_broadband_500k
  - arc_acs_2024_broadband_chg_500k
  - arc_acs_2024_computer_devices_500k
  - arc_acs_2024_hs_education_chg_500k
  - arc_acs_2024_labor_force_500k
  - arc_acs_2024_median_hh_income_500k
  - arc_acs_2024_poverty_rates_500k
  - arc_acs_2024_snap_500k
  - arc_boundary
  - arc_boundary_2008
  - arc_boundary_tiger
  - arc_congressional_districts_118th
  - arc_congressional_districts_119th
  - arc_counties
  - arc_counties_2008
  - arc_county_economic_status_fy2027_tiger
  - arc_distressed_areas_fy2027_tiger
  - arc_fcc_auction_904_phase_I_cbgs_per_county
  - arc_fcc_auction_904_phase_I_results
  - arc_high_poverty_counties_500k
  - arc_local_development_districts
  - arc_minority_pop_2018_counties
  - arc_opportunity_zones_2018
  - arc_opportunity_zones_2018_2026
  - arc_persistent_poverty_high_poverty_2020
  - arc_population_2019_county_points
  - arc_population_2022
  - arc_population_2023_tiger
  - arc_population_2024_500k
  - arc_population_chg_2022
  - arc_population_chg_2023_tiger
  - arc_population_chg_2024_500k
  - arc_rural_urban_county_types
  - arc_rural_urban_county_types_2013
  - arc_subregion_counties
  - arc_subregions_2009_counties_420
  - arc_us_states
  - arc_us_states_bnd_no_coastline_20m
  - arc_us_states_bnd_no_coastline_500k
  - arc_us_states_tiger
  - arc_zip_code_tabulation_areas_2020
  - arcfy2012
  - arcfy2013
  - arcfy2014
  - arcfy2015
  - arcfy2016
  - arcfy2017
  - arcfy2018
  - arcfy2019
  - arcfy2020
  - arcfy2021
  - arcfy2022
  - arcfy2023
  - arcfy2024
  - arcfy2025
servers:
- url: https://services.arcgis.com/nkunl3y8FDxPkXDl/arcgis/rest
  description: ARC hosted feature services (ArcGIS Online)
tags:
- name: Geospatial
paths:
  /services:
    get:
      operationId: listFeatureServices
      summary: GET /services
      description: List every service published by the Appalachian Regional Commission ArcGIS Online organization.
        Returned 200 with 108 FeatureServer entries on 2026-09-07.
      tags:
      - Geospatial
      parameters:
      - name: f
        in: query
        required: false
        description: 'Response format. `json` is the Esri feature JSON envelope; `geojson` returns RFC 7946 GeoJSON;
          `pjson` is pretty-printed JSON; `html` is the human-readable services directory. Verified live 2026-09-07:
          `f=json` and `f=geojson` both return 200.'
        schema:
          type: string
          enum:
          - json
          - geojson
          - pjson
          - html
          - pbf
          default: html
      responses:
        '200':
          description: The services directory. `services[]` carries `name`, `type` and the absolute `url` of each
            feature service.
          content:
            application/json:
              schema: {}
        default:
          description: 'The ArcGIS REST API answers errors with HTTP 200 and an error envelope in the body — check
            `error.code`, not the status line. Observed live 2026-09-07: requesting layer 99 of `arc_counties` returned
            `{"error":{"code":400,"message":"","details":["The requested layer (layerId: 99) was not found."]}}`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EsriError'
  /services/{serviceName}/FeatureServer:
    get:
      operationId: getFeatureService
      summary: GET /services/{serviceName}/FeatureServer
      description: 'Describe one feature service: `serviceDescription`, `copyrightText`, `capabilities`, `maxRecordCount`,
        `supportedQueryFormats`, `hasStaticData` and the `layers[]` it contains. Every ARC service observed on 2026-09-07
        advertises `capabilities: Query` only — this is a read-only surface.'
      tags:
      - Geospatial
      parameters:
      - name: serviceName
        in: path
        required: true
        description: Name of one of the 108 public hosted feature services in the Appalachian Regional Commission
          ArcGIS Online organization. See `info.x-arc-services` for the full enumeration read from the services
          directory on 2026-09-07.
        schema:
          type: string
          examples:
          - arc_counties
          - arc_boundary
          - arc_local_development_districts
          - arc_county_economic_status_fy2027_tiger
          - arc_acs_2023_poverty_rates_tiger
      - name: f
        in: query
        required: false
        description: 'Response format. `json` is the Esri feature JSON envelope; `geojson` returns RFC 7946 GeoJSON;
          `pjson` is pretty-printed JSON; `html` is the human-readable services directory. Verified live 2026-09-07:
          `f=json` and `f=geojson` both return 200.'
        schema:
          type: string
          enum:
          - json
          - geojson
          - pjson
          - html
          - pbf
          default: html
      responses:
        '200':
          description: The feature service descriptor.
          content:
            application/json:
              schema: {}
        default:
          description: 'The ArcGIS REST API answers errors with HTTP 200 and an error envelope in the body — check
            `error.code`, not the status line. Observed live 2026-09-07: requesting layer 99 of `arc_counties` returned
            `{"error":{"code":400,"message":"","details":["The requested layer (layerId: 99) was not found."]}}`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EsriError'
  /services/{serviceName}/FeatureServer/{layerId}:
    get:
      operationId: getFeatureLayer
      summary: GET /services/{serviceName}/FeatureServer/{layerId}
      description: 'Describe one feature layer: its `geometryType`, `objectIdField`, the full `fields[]` list with
        Esri field types, `maxRecordCount`, `supportedQueryFormats` (JSON, geoJSON, PBF) and `advancedQueryCapabilities`.
        This is the schema document for the layer.'
      tags:
      - Geospatial
      parameters:
      - name: serviceName
        in: path
        required: true
        description: Name of one of the 108 public hosted feature services in the Appalachian Regional Commission
          ArcGIS Online organization. See `info.x-arc-services` for the full enumeration read from the services
          directory on 2026-09-07.
        schema:
          type: string
          examples:
          - arc_counties
          - arc_boundary
          - arc_local_development_districts
          - arc_county_economic_status_fy2027_tiger
          - arc_acs_2023_poverty_rates_tiger
      - name: layerId
        in: path
        required: true
        description: Zero-based layer index within the feature service. Every ARC service observed on 2026-09-07
          exposes a single layer at index 0.
        schema:
          type: integer
          default: 0
      - name: f
        in: query
        required: false
        description: 'Response format. `json` is the Esri feature JSON envelope; `geojson` returns RFC 7946 GeoJSON;
          `pjson` is pretty-printed JSON; `html` is the human-readable services directory. Verified live 2026-09-07:
          `f=json` and `f=geojson` both return 200.'
        schema:
          type: string
          enum:
          - json
          - geojson
          - pjson
          - html
          - pbf
          default: html
      responses:
        '200':
          description: The feature layer descriptor, including the attribute schema.
          content:
            application/json:
              schema: {}
        default:
          description: 'The ArcGIS REST API answers errors with HTTP 200 and an error envelope in the body — check
            `error.code`, not the status line. Observed live 2026-09-07: requesting layer 99 of `arc_counties` returned
            `{"error":{"code":400,"message":"","details":["The requested layer (layerId: 99) was not found."]}}`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EsriError'
  /services/{serviceName}/FeatureServer/{layerId}/query:
    get:
      operationId: queryFeatureLayer
      summary: GET /services/{serviceName}/FeatureServer/{layerId}/query
      description: 'Query features from a layer by attribute (`where`), by geometry, or both — returning Esri feature
        JSON, GeoJSON or PBF. This is the operation that makes ARC''s regional data callable: county boundaries,
        the ARC region boundary, local development districts, congressional districts, and the county economic-status,
        poverty, median-household-income, SNAP, education and population series by fiscal and ACS year.'
      tags:
      - Geospatial
      parameters:
      - name: serviceName
        in: path
        required: true
        description: Name of one of the 108 public hosted feature services in the Appalachian Regional Commission
          ArcGIS Online organization. See `info.x-arc-services` for the full enumeration read from the services
          directory on 2026-09-07.
        schema:
          type: string
          examples:
          - arc_counties
          - arc_boundary
          - arc_local_development_districts
          - arc_county_economic_status_fy2027_tiger
          - arc_acs_2023_poverty_rates_tiger
      - name: layerId
        in: path
        required: true
        description: Zero-based layer index within the feature service. Every ARC service observed on 2026-09-07
          exposes a single layer at index 0.
        schema:
          type: integer
          default: 0
      - name: where
        in: query
        required: false
        description: SQL-92 WHERE clause applied to the layer's attribute table. Use `1=1` to match every feature.
        schema:
          type: string
          default: 1=1
      - name: objectIds
        in: query
        required: false
        description: Comma-separated list of OBJECTID values to return.
        schema:
          type: string
      - name: geometry
        in: query
        required: false
        description: Geometry used to spatially filter the query, in the format named by `geometryType`.
        schema:
          type: string
      - name: geometryType
        in: query
        required: false
        description: Type of the `geometry` parameter.
        schema:
          type: string
          enum:
          - esriGeometryPoint
          - esriGeometryMultipoint
          - esriGeometryPolyline
          - esriGeometryPolygon
          - esriGeometryEnvelope
          default: esriGeometryEnvelope
      - name: spatialRel
        in: query
        required: false
        description: Spatial relationship applied between the input geometry and the layer's features.
        schema:
          type: string
          enum:
          - esriSpatialRelIntersects
          - esriSpatialRelContains
          - esriSpatialRelWithin
          - esriSpatialRelCrosses
          - esriSpatialRelTouches
          - esriSpatialRelOverlaps
          - esriSpatialRelEnvelopeIntersects
          default: esriSpatialRelIntersects
      - name: inSR
        in: query
        required: false
        description: Spatial reference (WKID) of the input geometry.
        schema:
          type: string
      - name: outSR
        in: query
        required: false
        description: Spatial reference (WKID) requested for the returned geometry.
        schema:
          type: string
      - name: outFields
        in: query
        required: false
        description: Comma-separated attribute fields to return, or `*` for all. `arc_counties` layer 0 exposes
          OBJECTID, FIPS, STATE, COUNTY, ARC, Shape__Area and Shape__Length.
        schema:
          type: string
          default: '*'
      - name: returnGeometry
        in: query
        required: false
        description: Whether to include feature geometry in the response.
        schema:
          type: boolean
          default: true
      - name: returnCountOnly
        in: query
        required: false
        description: 'Return only the matching feature count. Verified live 2026-09-07: `arc_counties` layer 0 returns
          `{"count":423}`, the 423 counties of the Appalachian Region.'
        schema:
          type: boolean
          default: false
      - name: returnIdsOnly
        in: query
        required: false
        description: Return only the matching OBJECTID values.
        schema:
          type: boolean
          default: false
      - name: returnDistinctValues
        in: query
        required: false
        description: 'Return distinct values for the requested `outFields`. The layer descriptor reports `supportsDistinct:
          true`.'
        schema:
          type: boolean
          default: false
      - name: orderByFields
        in: query
        required: false
        description: 'Comma-separated fields to sort by. The layer descriptor reports `supportsOrderBy: true`.'
        schema:
          type: string
      - name: groupByFieldsForStatistics
        in: query
        required: false
        description: Fields to group by when computing `outStatistics`.
        schema:
          type: string
      - name: outStatistics
        in: query
        required: false
        description: 'JSON array of statistic definitions to compute server-side. The layer descriptor reports `supportsStatistics:
          true`.'
        schema:
          type: string
      - name: resultOffset
        in: query
        required: false
        description: 'Zero-based offset into the result set. Paging is the only way past `maxRecordCount`; the layer
          descriptor reports `supportsPagination: true`.'
        schema:
          type: integer
      - name: resultRecordCount
        in: query
        required: false
        description: Maximum features to return in this page. Capped by the service's `maxRecordCount`, which is
          1000 on every ARC layer observed.
        schema:
          type: integer
          maximum: 1000
      - name: f
        in: query
        required: false
        description: 'Response format. `json` is the Esri feature JSON envelope; `geojson` returns RFC 7946 GeoJSON;
          `pjson` is pretty-printed JSON; `html` is the human-readable services directory. Verified live 2026-09-07:
          `f=json` and `f=geojson` both return 200.'
        schema:
          type: string
          enum:
          - json
          - geojson
          - pjson
          - html
          - pbf
          default: html
      responses:
        '200':
          description: Matching features. `f=json` returns the Esri `features[]` envelope; `f=geojson` returns an
            RFC 7946 FeatureCollection. A `properties.exceededTransferLimit` of true means more features remain
            — page with `resultOffset`.
          content:
            application/json:
              schema: {}
        default:
          description: 'The ArcGIS REST API answers errors with HTTP 200 and an error envelope in the body — check
            `error.code`, not the status line. Observed live 2026-09-07: requesting layer 99 of `arc_counties` returned
            `{"error":{"code":400,"message":"","details":["The requested layer (layerId: 99) was not found."]}}`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EsriError'
components:
  schemas:
    EsriError:
      type: object
      description: ArcGIS REST error envelope, returned with HTTP 200.
      properties:
        error:
          type: object
          properties:
            code:
              type: integer
            message:
              type: string
            details:
              type: array
              items:
                type: string