WMS Capabilities Extractor
Pricing
from $0.35 / 1,000 layers
WMS Capabilities Extractor
Point at any OGC Web Map Service (WMS 1.1.1 or 1.3.0) and extract a structured layer catalog from its GetCapabilities document — one row per layer with CRS, bounding boxes, styles, scale, keywords, dimensions and service metadata. One actor, any WMS.
Pricing
from $0.35 / 1,000 layers
Rating
0.0
(0)
Developer
Datamule
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Point at any OGC Web Map Service → get a clean, structured layer catalog.
A generic runner over the OGC Web Map Service (WMS) GetCapabilities protocol
(versions 1.1.1 and 1.3.0). WMS is the OGC standard for map and raster
services, so one actor spans an enormous population of endpoints with no per-site
scraper:
- national mapping agencies and every national Spatial Data Infrastructure (SDI)
- NOAA / USGS / NASA and other government geospatial portals
- the EU INSPIRE directive's view services
- terrestris / OSM-WMS and other basemap providers
- every GeoServer, MapServer, QGIS Server, ArcGIS and MapProxy deployment
Give it a WMS endpoint; it fetches the GetCapabilities XML, parses it, and flattens
it to one row per advertised layer with the fully-resolved metadata.
What makes it different
The Apify Store has plenty of per-site map scrapers. This is a protocol runner: one input (a WMS URL) works against any compliant service. It is the geospatial-map sibling of the OGC API Features / STAC / OGC EDR / OGC API Records generic extractors.
The parse is the moat. WMS layers nest, and per the spec a child layer inherits
a defined set of its parent's properties. This runner walks the whole <Layer> tree
and correctly accumulates inherited state down each branch (CRS/SRS and styles are
added; geographic + per-CRS bounding boxes, attribution, scale bounds and dimensions
are replaced-or-inherited), then emits each named layer with its effective, merged
properties — not just the shallow top-level view.
Both WMS versions are handled from the same code by matching element local names,
so the namespaced 1.3.0 tree (CRS, EX_GeographicBoundingBox) and the un-namespaced
1.1.1 tree (SRS, LatLonBoundingBox, ScaleHint, <Extent>) both parse cleanly. The
reported _wmsVersion is read from the served document itself.
Input
| Field | Type | Notes |
|---|---|---|
endpoint | string | A WMS base URL or full GetCapabilities URL. Required unless endpoints is given. |
endpoints | array | Optional. Harvest several WMS services in one run; each row is tagged with its _endpoint. |
version | string | 1.3.0 (default) or 1.1.1. A VERSION already in the URL wins. |
maxRecords | integer | Optional global cap across all endpoints. |
userAgent | string | Optional User-Agent override. |
timeoutSecs | integer | Optional read timeout (default 60s). |
bearer / extraHeaders | string / object | Optional, for auth-gated deployments. Never required, never logged. |
The SERVICE=WMS&REQUEST=GetCapabilities&VERSION=... parameters are appended for you
when absent, so pasting a bare service root works.
Example
{"endpoint": "https://ows.terrestris.de/osm/service","version": "1.3.0"}
Output
One row per advertised (named) layer:
- Identity —
name,title,abstract,queryable,opaque,cascaded - Spatial —
crs[](inherited + own, merged),geographicBoundingBox{west,east,south,north},boundingBoxes[](per-CRS, coordinates recorded verbatim and tagged with their CRS so the 1.3.0 EPSG:4326 axis order is unambiguous) - Cartography —
styles[]({name,title,legendUrl,...}),minScaleDenominator,maxScaleDenominator,scaleHintMin/Max(1.1.1) - Descriptive —
keywords[],attribution,dimensions[](e.g.TIME/ELEVATION, withdefaultandvalues),metadataUrls[],layerPath[](ancestor titles) - Service metadata (duplicated onto every row) —
serviceTitle,serviceOrg,serviceContact,fees,accessConstraints,requestFormats(GetMap / GetFeatureInfo MIME formats), and more - Envelope —
_endpoint,_wmsVersion,_rowIndex, and a lossless_rawof the layer's own definition
Every optional field is nullable and read by node/attribute presence, so a layer that
omits an element yields null rather than an error.
Behaviour and resilience
- An endpoint that returns 4xx/5xx, times out, or serves a non-WMS body (an HTML error /
anti-bot page, a
ServiceExceptionReport, or malformed XML) is skipped with a warning; the batch continues. - A run where every endpoint was skipped fails fast (non-zero exit) so nothing broken ships.
- A reachable WMS that advertises 0 named layers yields 0 rows and a clean exit — the actor never fabricates rows.
- XML is parsed with external-entity resolution disabled (XXE-safe).
Pricing
Pay-per-event: charged per extracted layer row.