BYTETOOLS

ArcGIS Hub Search API

Free ArcGIS Hub search API with no key: query datasets across thousands of government open data sites at once, with layer capabilities and download flags. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the ArcGIS Hub Search API?

The ArcGIS Hub search API is a free, key-free endpoint that searches dataset metadata across the thousands of government open data sites built on ArcGIS Hub. Each result carries the layer's query capabilities, field list, categories and whether it can be downloaded.

Most city and county GIS portals in the English-speaking world run on ArcGIS Hub, and every one of them is indexed here. That makes this the geospatial counterpart to Socrata's Discovery API: one query, thousands of publishers, results that tell you not just what exists but what you can do with it. The `advancedQueryCapabilities` block on each record says whether the underlying service supports statistics, SQL expressions, pagination, distance queries and ordering — so you can filter to layers that will actually support the query you intend to run before you write it.

The response is JSON:API shaped: a `data` array of typed objects, each with `id`, `type` and a large `attributes` bag. Be selective. A single record carries composition timestamps, enrichment coverage, display fields, current ArcGIS version and dozens of capability flags, most of which you will never use, and the payloads add up quickly when you page. Timestamps are Unix epoch milliseconds, not ISO strings, which is the usual first bug.

Quick facts

Base URL
https://hub.arcgis.com/api/v3/datasets
Authentication
No key for public content. Private organisational items require an ArcGIS token, which this endpoint does not need for open data.
Rate limit
No published limit. Records are large, so keep page sizes small and cache.
Pricing
Free for public open data. Individual layers carry their publisher's licence.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the ArcGIS Hub Search API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Search government GIS datasets for parks layers

GET https://hub.arcgis.com/api/v3/datasets?page%5Bsize%5D=1&q=parks

curl
curl 'https://hub.arcgis.com/api/v3/datasets?page%5Bsize%5D=1&q=parks'
JavaScript (fetch)
const res = await fetch("https://hub.arcgis.com/api/v3/datasets?page%5Bsize%5D=1&q=parks");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://hub.arcgis.com/api/v3/datasets?page%5Bsize%5D=1&q=parks", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "data": [
    {
      "id": "731b993ca6c3432d9226741d2514a2c2_2",
      "type": "dataset",
      "attributes": {
        "errors": [],
        "access": "public",
        "additionalResources": [],
        "advancedQueryCapabilities": {
          "supportsStatistics": true,
          "supportsSqlExpression": true,
          "supportsReturningQueryExtent": true,
          "supportsTrueCurve": true,
          "supportsOrderBy": true,
          "useStandardizedQueries": false,
          "supportsQueryWithDistance": true,
          "supportsPagination": true,
          "supportsCountDistinct": true,
          "supportsDistinct": true,
          "supportsHavingClause": true
        },
        "collection": [
          "Dataset"
        ],
        "categories": [
          "The Colony",
          "Parks and Recreation"
        ],
        "commentsEnabled": false,
        "composeStatus": {
          "retries": 0,
          "pass": true,
          "lastRetriedAt": 1716482329230
        },
        "composedAt": 1716482329227,
        "content": "Map Service",
        "created": 1556141289000,
        "currentVersion": 10.61,
        "description": "Parks and Rec",
        "displayField": "ParkName",
        "downloadable": true,
        "enrichCoverage": "local",
        "enrichQuality": 66,
        "extent": {
          "coordinates": [
            [
              -96.9608,
              33.0606
            ],
            [
              -96.844,
              33.1358
            ]
          ],
          "type": "envelope"
        },
        "fieldNames": [
          "OBJECTID

Parameters

ParameterTypeRequiredDescription
qqueryOptionalFull-text search across titles, descriptions and tags. parks
page[size]queryOptionalResults per page. Send it URL-encoded as `page%5Bsize%5D`. 1
page[number]queryOptionalPage number, also bracket-encoded. 2
filter[tags]queryOptionalRestrict by tag. transportation
filter[openData]queryOptionalRestrict to items flagged as open data. true
fields[datasets]queryOptionalSparse fieldset — the single most effective way to shrink the response. name,description,url

Response fields

data[].idstring
Composite item ID and layer index, for example `731b993c..._2`.
data[].typestring
`dataset` for open data layers.
attributes.accessstring
`public` for open data; anything else needs an ArcGIS token.
attributes.advancedQueryCapabilitiesobject
Whether the service supports statistics, SQL expressions, pagination, distance queries and ordering.
attributes.categoriesarray
Publisher's own category path, which often reveals the owning department.
attributes.contentstring
`Map Service`, `Feature Service` and similar — determines how you query it.
attributes.downloadableboolean
Whether static exports such as CSV, GeoJSON or shapefile are offered.
attributes.created / composedAtinteger
Unix epoch milliseconds, not ISO 8601 strings.
attributes.displayFieldstring
The field the publisher considers the human label for each feature.

What you can build with the ArcGIS Hub Search API

  • Find which governments publish a given GIS layer type
  • Filter to layers that support server-side statistics before building a query
  • Build a cross-jurisdiction geospatial data search
  • Discover downloadable GeoJSON sources for a mapping project
  • Audit how many authorities publish a mandated layer

Common errors and how to fix them

400 Invalid Parameter Key

A filter key the resource does not accept.

Fix: The message names the bad key. Bracketed parameters must be URL-encoded — `page%5Bsize%5D`, not `page[size]`.

Enormous responses

Every attribute is returned by default.

Fix: Use `fields[datasets]` to request only the attributes you need; it cuts payload size dramatically.

Dates decades in the past or future

Timestamps are epoch milliseconds.

Fix: Divide by 1,000 before passing to a seconds-based date constructor.

Layer URL returns nothing useful

The item is a Map Service rather than a Feature Service.

Fix: Check `attributes.content` — only feature services accept attribute and spatial queries.

ArcGIS Hub Search API — frequently asked questions

Is the ArcGIS Hub search API free?

Yes, for public open data. No key or account is needed. Only private organisational items require an ArcGIS token, and those are outside what this endpoint returns anonymously.

How is this different from a single city's open data feed?

A city feed lists one publisher's catalogue. This searches across the thousands of ArcGIS Hub sites at once, so you can ask which governments publish a given layer rather than whether one particular government does.

What does advancedQueryCapabilities tell me?

Which operations the underlying service will accept — server-side statistics, SQL expressions, pagination, distance filters and ordering. Checking it first saves writing a query the service will reject.

Why are the responses so large?

Each record carries the full ArcGIS item description, including capability flags and field definitions. Use the `fields[datasets]` sparse fieldset parameter to request only the attributes you actually read.

Tools that pair with this API

ArcGIS Hub Search is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.