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.
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 'https://hub.arcgis.com/api/v3/datasets?page%5Bsize%5D=1&q=parks'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);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()){
"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": [
"OBJECTIDParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q | query | Optional | Full-text search across titles, descriptions and tags. parks |
page[size] | query | Optional | Results per page. Send it URL-encoded as `page%5Bsize%5D`. 1 |
page[number] | query | Optional | Page number, also bracket-encoded. 2 |
filter[tags] | query | Optional | Restrict by tag. transportation |
filter[openData] | query | Optional | Restrict to items flagged as open data. true |
fields[datasets] | query | Optional | Sparse 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
GeoJSON to KML Converter
Convert GeoJSON or JSON to KML for Google Earth, free in your browser. Points, lines, polygons, multi-geometries and feature properties supported. No upload.
JSON Path Finder
Evaluate a dot/bracket path against your JSON and list every leaf path for discovery. Free online JSON path finder that runs 100% in your browser.
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
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.