API & MCP

The same data, without the page.

A public, read-only JSON API and a Model Context Protocol server. No key, no sign-up. Both are regenerated with every weekly build and both serve exactly what the pages show.

JSON API

The API is a set of static files under https://carrierdepth.com/api/v1/, served from the edge with Access-Control-Allow-Origin: *, so it can be called from a browser, a script or a notebook.

MethodPathReturns
GET/api/v1/index.jsonBuild date, counts and links to every other endpoint.
GET/api/v1/counties.jsonEvery published county: FIPS, name, state, path and tier totals per carrier.
GET/api/v1/county/{state}/{county}.jsonThe full county record: totals, NR bands and every licence block.
GET/api/v1/county/{state}/{county}.csvThe licence-block table as CSV.
GET/api/v1/bands.jsonThe US band plan, NR and LTE band definitions used by the decoder.
GET/api/v1/changes.jsonOpen FCC applications to assign or transfer licences, newest first, with the counties each may affect.
# Who holds C-band in Wake County?
curl -s https://carrierdepth.com/api/v1/county/nc/wake.json \
  | jq '.blocks[] | select(.fccBand == "C-band") | {block, holder, mhz}'

{state} is the lower-case postal abbreviation and {county} the slug shown in the page URL, so /county/nc/wake has its data at /api/v1/county/nc/wake.json.

County record

One record per county. totals and nrBands cover the five national operators; blocks lists every licence and lease on record; plan resolves the band plan to one holder per slice of frequency.

{
  "schema": "carrierdepth.county/2",
  "generated": "2026-10-04",
  "county": { "fips": "37183", "name": "Wake County", "state": "NC", "path": "/county/nc/wake" },
  "totals": [ { "id": "vz", "name": "Verizon", "low": 71.68, "mid": 70, "high": 200, "mmwave": 1850, "sub6": 341.68 } ],
  "nrBands": [ { "id": "n77", "total": 340, "carriers": { "vz": 160, "att": 140, "tmo": 40 } } ],
  "blocks": [ {
    "i": 0, "band": "600", "fccBand": "600 MHz", "block": "A", "tier": "low", "mhz": 10,
    "segments": [ { "lo": 663, "hi": 668, "dir": "UL" }, { "lo": 617, "hi": 622, "dir": "DL" } ],
    "operator": "tmo", "holder": "T-Mobile", "licensee": "T-Mobile License LLC",
    "kind": "license", "leaseType": null, "callSigns": ["WRCP893"],
    "market": "PEA045", "marketName": "Raleigh, NC", "areaType": "PEA", "tags": [], "nr": ["n71"]
  } ],
  "plan": [ { "band": "600", "lo": 617, "hi": 622, "dir": "DL", "row": 0 } ]
}

operator is vz, att, tmo, dish, spacex or other. kind is license or lease. plan[].row is an index into blocks. Frequencies are MHz. The example is abbreviated.

Bulk data

Everything on the site in a handful of files, rebuilt with each weekly FCC update. No key, no sign-up, free for commercial use under CC BY 4.0.

FileFormatContents
/data/bulk/records.csv.gzCSV, gzipEvery licence and lease record in every county: band, block, frequencies, MHz, holder, licensee, lease type, call signs and market. One row per county and record.
/data/bulk/licences.csv.gzCSV, gzipOne row per licence or lease area: holder, licensee, MHz, the counties it covers wholly and partly, 2020 population inside it and MHz-POPs.
/data/bulk/areas/{band}.json.gzJSON, gzipExact licence areas per band, including partitions inside a county and BRS/EBS service areas as GeoJSON polygons. Bands: 600, 700L, 700U, SMR800, SMR800R, CELL, AWS, PCS, PCSG, AWSH, AWS4, WCS, BRS, 345, CBRS, CBAND, MMW24, MMW28, MMW37, MMW39, MMW47. Format and limits.
/data/bulk/county-totals.csvCSVOne row per county: MHz held by each of the five national operators in each layer.
/data/bulk/counties.geojsonGeoJSONCounty boundaries with the same totals attached, ready for QGIS, ArcGIS or a web map.
/data/spectrum.db.gzSQLite, gzipThe database the site is built from: every record, the county each covers, and county outlines. Manifest with date and checksum.
/api/v1/county/{state}/{county}.csvCSVThe same records for a single county.
# every record in the country, about 10 MB compressed
curl -sO https://carrierdepth.com/data/bulk/records.csv.gz && gunzip records.csv.gz

MCP server

The Model Context Protocol lets an AI assistant call tools on a remote server. carrierdepth runs a stateless, read-only MCP server over Streamable HTTP at:

https://carrierdepth.com/mcp

Add that URL as a custom connector in any MCP-capable client. There is no authentication. The server exposes five tools:

ToolArgumentsDoes
find_countyqueryFinds counties by name, "name, ST", FIPS code or ZIP code and says which are published.
get_county_spectrumfips, detail?Carrier totals by tier and by NR band; with detail: "blocks", every licence and lease record.
decode_channelkind, value, fips?Converts an NR-ARFCN, EARFCN or MHz value to frequency and bands, and the licensee in a county.
list_changestype?, carrier?, state?, fips?, limit?Open FCC applications to assign or transfer licences.
get_band_planband?The US band plan: blocks, frequencies and NR band mapping.
# Call a tool directly with JSON-RPC
curl -s https://carrierdepth.com/mcp -H 'content-type: application/json' -d '{
  "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": { "name": "decode_channel",
              "arguments": { "kind": "nrarfcn", "value": 648672, "fips": "37183" } }
}'

Every county result carries the date of the FCC data it was built from and a notice that a licence is not proof of deployment. Application results say how each was tied to licences, because the FCC's public file often does not list call signs.

Terms of use

  • Free and open. The compiled data is offered under CC BY 4.0. Credit "carrierdepth.com" with a link. The underlying FCC records are in the public domain.
  • Be reasonable. Files change once a week. Cache them; do not poll.
  • No warranty. This is a reference, not a legal record. For anything that matters, confirm against the FCC's Universal Licensing System.
  • Stable paths. /api/v1/ will not change shape. Breaking changes get a new version.