Data · REST API v1

The MCC-MNC database, as a JSON API

Resolve any PLMN, search 2,600+ networks across 230+ countries, and pull TADIG codes, APN settings, MVNOs and VoLTE support over plain HTTP. Start without a key, or sign in for 10,000 requests a week.

Base URL

https://mcc-mnc.org/api/v1

FreeJSONCORS openRead-onlyOpenAPI 3.1

~ · zsh
request
curl -s "https://mcc-mnc.org/api/v1/lookup?plmn=26201"
200 OKapplication/jsonaccess-control-allow-origin: *
response · trimmed
{
  "data": {
    "slug": "262_01",
    "mcc": "262",
    "mnc": "01",
    "plmn": "26201",
    "operator": "Telekom Deutschland GmbH",
    "brand": "Telekom",
    "tadig": "DEUD1",
    "country": { "name": "Germany", "iso": "DE" },
    "generations": ["2G", "3G", "4G", "5G"],
    "url": "https://mcc-mnc.org/networks/262_01"
  },
  "meta": { "matches": 1, "alternatives": [] }
}
>No key needed to start

Make your first call

Pick a preset or edit the path, then send it. These requests hit the live production API. Every response is a JSON object with a data key, and list endpoints add a meta object with the paging counters.

Try it — live against production data

Send a request to see the response

Built for the jobs telecom developers do

Each card is one request. Copy the URL, or jump to the endpoint for every parameter it takes.

Name the network in a log

Turn the PLMN from a modem log, an IMSI prefix or a CDR into an operator, country and TADIG.

GET/lookup?plmn=310260

List a country's 5G operators

Filter every network by country, region, technology or generation, and page through the lot.

GET/networks?country=IT&generation=5G

Match roaming partners by TADIG

Search TADIG codes by code, operator or country when reconciling TAP files and roaming agreements.

GET/tadigs?search=vodafone

Provision APN settings

Get a network's APNs, and the APNs of each MVNO riding on it, for device setup and support flows.

GET/networks/23410/apns

Check VoLTE and Wi-Fi calling

See which voice services a network supports, and which MVNOs run on it, before a customer ports in.

GET/networks/23410/services

Build a country picker

Every country with its ISO code, region and network count, ready for a dropdown or a validation list.

GET/countries

Free, with a weekly allowance

Every data endpoint and every bulk download counts as one request. The week resets every Monday at 00:00 UTC.

No key

100

requests a week, per IP

Nothing to sign up for. Enough to try every endpoint and run the odd lookup by hand.

Try it now
Free

Free API key

10,000

requests a week, per account

Sign in with an emailed link and create keys on your account page. All your keys share the one allowance.

Get a free key

More than that

Ask

we raise it per account

Building something that needs heavy traffic? Tell us about it. Or take a bulk download: one request, every network.

Get in touch

How the API behaves

The same rules apply to every endpoint, so you only have to learn them once.

Errors

Failures use standard HTTP status codes and always return the same envelope, so you can branch on a stable machine-readable code rather than parsing prose.

400invalid_parameter

A filter, sort or pagination value was malformed — the offending parameter is named in the body.

400bad_request

The request is missing a required combination, e.g. lookup called without plmn or an mcc/mnc pair.

401unauthorized

An API key was sent but isn't valid, or has been revoked. A bad key is never treated as no key.

404not_found

The identifier does not match any record.

429rate_limited

This week's allowance is used up. The body has resetAt, and Retry-After gives the seconds until then.

500internal_error

Something broke on our side. Retry, then get in touch if it persists.

Error response
{
  "error": {
    "code": "invalid_parameter",
    "message": "`limit` must be between 1 and 200.",
    "parameter": "limit"
  }
}

Keys & limits

Without a key, each IP address gets 100 requests a week, shared between the API and the bulk downloads. For 10,000 a week, sign in (it's free, by emailed link) and create a key on your account page. Send it as Authorization: Bearer <key>, an X-Api-Key header, or ?api_key= where you can't set headers. The week resets every Monday at 00:00 UTC. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (a Unix time). If you need more than that, get in touch.

With a key
curl -H "Authorization: Bearer $MCCMNC_KEY" \
  "https://mcc-mnc.org/api/v1/lookup?plmn=23415"

Responses are marked private, no-store, since each one is counted. Cache what you fetch on your side. If you want everything, one bulk download is a single request and holds every network, in CSV, Excel, TXT or JSON.

Data completeness

The database is community-maintained, so coverage varies by field: mcc, mnc and plmn are always present, tadig is set on roughly a quarter of networks, and code and dialCode are sparse. Treat every nullable field in the schema as genuinely optional, and send us a correction when you spot a gap.

Versioning

The version lives in the path (/api/v1). New fields and new endpoints can appear in v1 at any time, so parse defensively and ignore what you don’t recognise. Anything that would break an existing client ships under a new version prefix instead.

Networks

Every mobile network in the database, with its MCC, MNC, PLMN ID, TADIG code, operating company, consumer brand and the radio technologies it runs.

GET/api/v1/networks

List & search networks

The main workhorse. Every filter below is optional and they combine with AND; repeated values within one filter combine with OR.

Query parameters

searchstring
Free-text match across operator, brand, TADIG, MCC, MNC, PLMN and country name. Alias: q.
mccstring
Exact Mobile Country Code.
mncstring
Exact Mobile Network Code.
plmnstring
Exact PLMN ID (MCC + MNC concatenated).
countrystring
ISO-3166 alpha-2 code or country slug.
regionstring
Region slug or name.
tadigstring
Exact TADIG code.
operatorstring
Partial, case-insensitive operator name.
brandstring
Partial, case-insensitive brand name.
typestring
Network-type slug. Repeat or comma-separate for several: ?type=lte_1800,5g_3500.
generationstring
Filter by technology generation. Comma-separate for several.2G3G4G5G
sortstring
Field to sort by.mccmncplmnoperatorbrandtadigcountrycreatedAtupdatedAtDefault: mcc
include_descriptionboolean
Include the long-form editorial description for each record. Off by default because it is large.Default: false
limitinteger
Number of records to return. Between 1 and 200.Default: 50
offsetinteger
Number of records to skip — combine with limit to page.Default: 0
orderstring
Sort direction.ascdescDefault: asc

Example request

curl -s "https://mcc-mnc.org/api/v1/networks?country=DE&generation=5G&limit=1"

Example response

{
  "data": [
    {
      "id": 122,
      "slug": "262_01",
      "mcc": "262",
      "mnc": "01",
      "plmn": "26201",
      "code": null,
      "operator": "Telekom Deutschland GmbH",
      "brand": "Telekom",
      "tadig": "DEUD1",
      "country": {
        "name": "Germany",
        "iso": "DE",
        "slug": "germany",
        "dialCode": null,
        "region": { "name": "Europe", "slug": "europe" }
      },
      "networkTypes": [
        {
          "name": "LTE",
          "slug": "lte_1800",
          "frequency": "1800",
          "generations": ["4G"]
        },
        {
          "name": "5G",
          "slug": "5g_3500",
          "frequency": "3500",
          "generations": ["5G"]
        }
      ],
      "generations": ["2G", "3G", "4G", "5G"],
      "url": "https://mcc-mnc.org/networks/262_01",
      "createdAt": "2025-04-09T13:26:22.059Z",
      "updatedAt": "2025-04-09T13:26:22.059Z"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 1,
    "offset": 0,
    "count": 1,
    "hasMore": true
  }
}
GET/api/v1/networks/{identifier}

Retrieve a network

Fetch one network by slug, PLMN ID or numeric id — resolved in that order. The response includes the editorial description.

Path parameters

identifierstringrequired
Network slug, PLMN ID (5–6 digits) or numeric id.

Example request

curl -s "https://mcc-mnc.org/api/v1/networks/26201"

Example response

{
  "data": {
    "id": 122,
    "slug": "262_01",
    "mcc": "262",
    "mnc": "01",
    "plmn": "26201",
    "code": null,
    "operator": "Telekom Deutschland GmbH",
    "brand": "Telekom",
    "tadig": "DEUD1",
    "country": {
      "name": "Germany",
      "iso": "DE",
      "slug": "germany",
      "dialCode": null,
      "region": { "name": "Europe", "slug": "europe" }
    },
    "networkTypes": [
      {
        "name": "LTE",
        "slug": "lte_1800",
        "frequency": "1800",
        "generations": ["4G"]
      },
      {
        "name": "5G",
        "slug": "5g_3500",
        "frequency": "3500",
        "generations": ["5G"]
      }
    ],
    "generations": ["2G", "3G", "4G", "5G"],
    "url": "https://mcc-mnc.org/networks/262_01",
    "createdAt": "2025-04-09T13:26:22.059Z",
    "updatedAt": "2025-04-09T13:26:22.059Z"
  }
}
GET/api/v1/lookup

Resolve a PLMN

The one-question endpoint: given an MCC/MNC pair (or a PLMN ID), which operator is it? Returns the single best match, with any other records sharing the code listed under meta.alternatives.

Query parameters

plmnstring
PLMN ID. Use this or the mcc + mnc pair.
mccstring
Mobile Country Code. Requires mnc.
mncstring
Mobile Network Code. Requires mcc.
  • →Returns 404 with an error body when the code is unassigned.

Example request

curl -s "https://mcc-mnc.org/api/v1/lookup?mcc=262&mnc=01"

Example response

{
  "data": {
    "id": 122,
    "slug": "262_01",
    "mcc": "262",
    "mnc": "01",
    "plmn": "26201",
    "code": null,
    "operator": "Telekom Deutschland GmbH",
    "brand": "Telekom",
    "tadig": "DEUD1",
    "country": {
      "name": "Germany",
      "iso": "DE",
      "slug": "germany",
      "dialCode": null,
      "region": { "name": "Europe", "slug": "europe" }
    },
    "networkTypes": [
      {
        "name": "LTE",
        "slug": "lte_1800",
        "frequency": "1800",
        "generations": ["4G"]
      },
      {
        "name": "5G",
        "slug": "5g_3500",
        "frequency": "3500",
        "generations": ["5G"]
      }
    ],
    "generations": ["2G", "3G", "4G", "5G"],
    "url": "https://mcc-mnc.org/networks/262_01",
    "createdAt": "2025-04-09T13:26:22.059Z",
    "updatedAt": "2025-04-09T13:26:22.059Z"
  },
  "meta": {
    "matches": 1,
    "alternatives": []
  }
}

Countries

The 250-odd countries and territories that hold an MCC allocation, each linked to its region and networks.

GET/api/v1/countries

List countries

Every country, with a live network count.

Query parameters

searchstring
Free-text match on name, slug, ISO code or dial code. Alias: q.
isostring
Exact ISO-3166 alpha-2 code.
regionstring
Region slug or name.
sortstring
Field to sort by.nameisonetworksdialCodeDefault: name
limitinteger
Number of records to return. Between 1 and 200.Default: 50
offsetinteger
Number of records to skip — combine with limit to page.Default: 0
orderstring
Sort direction.ascdescDefault: asc

Example request

curl -s "https://mcc-mnc.org/api/v1/countries?region=europe&sort=networks&order=desc&limit=1"

Example response

{
  "data": [
    {
      "id": 217,
      "name": "United Kingdom",
      "iso": "GB",
      "slug": "united_kingdom",
      "dialCode": null,
      "region": {
        "id": 4,
        "name": "Europe",
        "slug": "europe",
        "url": "https://mcc-mnc.org/regions/europe"
      },
      "networkCount": 65,
      "url": "https://mcc-mnc.org/countries/united_kingdom"
    }
  ],
  "meta": {
    "total": 55,
    "limit": 1,
    "offset": 0,
    "count": 1,
    "hasMore": true
  }
}
GET/api/v1/countries/{identifier}

Retrieve a country

One country by ISO-3166 alpha-2 code or slug, with all of its networks inlined.

Path parameters

identifierstringrequired
ISO alpha-2 code (DE) or slug (germany).

Query parameters

include_networksboolean
Set to false to omit the networks array and get just the country record.Default: true

Example request

curl -s "https://mcc-mnc.org/api/v1/countries/DE"

Example response

{
  "data": {
    "id": 77,
    "name": "Germany",
    "iso": "DE",
    "slug": "germany",
    "dialCode": null,
    "region": {
      "id": 4,
      "name": "Europe",
      "slug": "europe",
      "url": "https://mcc-mnc.org/regions/europe"
    },
    "networkCount": 39,
    "description": "Germany is such a gem to explore…",
    "url": "https://mcc-mnc.org/countries/germany",
    "networks": [ … ]
  }
}

Regions

Continental groupings used across the site. Small, stable and cached hard — ideal for populating a dropdown.

GET/api/v1/regions

List regions

All regions with their country counts. Not paginated.

Query parameters

orderstring
Sort direction on name.ascdescDefault: asc

Example request

curl -s "https://mcc-mnc.org/api/v1/regions"

Example response

{
  "data": [
    {
      "id": 4,
      "name": "Europe",
      "slug": "europe",
      "countryCount": 55,
      "url": "https://mcc-mnc.org/regions/europe"
    }
  ],
  "meta": { "total": 7 }
}
GET/api/v1/regions/{slug}

Retrieve a region

One region with every country it contains.

Path parameters

slugstringrequired
Region slug or name.
  • →Countries nested inside a region omit their own region object — you already know which one they belong to.

Example request

curl -s "https://mcc-mnc.org/api/v1/regions/europe"

Example response

{
  "data": {
    "id": 4,
    "name": "Europe",
    "slug": "europe",
    "countryCount": 55,
    "url": "https://mcc-mnc.org/regions/europe",
    "description": "Europe stands as a highly interconnected…",
    "countries": [
      {
        "id": 217,
        "name": "United Kingdom",
        "iso": "GB",
        "slug": "united_kingdom",
        "dialCode": null,
        "region": null,
        "networkCount": 65,
        "url": "https://mcc-mnc.org/countries/united_kingdom"
      }
    ]
  }
}

Network types

Radio technologies and their frequency bands — GSM 900, LTE 1800, NR 3500 and the rest — each tagged with the generations it belongs to.

GET/api/v1/network-types

List network types

Every technology in the database with the number of networks running it. Not paginated.

Query parameters

generationstring
Filter by generation. Comma-separate for several.2G3G4G5G
searchstring
Match on name, slug or frequency. Alias: q.
orderstring
Sort direction on name.ascdescDefault: asc
  • →Some older rows have no generation flags set in the database; where the technology name makes it unambiguous (5G, LTE, UMTS, GSM…) the generation is inferred, so ?generation=5G returns them too.

Example request

curl -s "https://mcc-mnc.org/api/v1/network-types?generation=5G"

Example response

{
  "data": [
    {
      "id": 18,
      "name": "5G",
      "slug": "5g_3500",
      "frequency": "3500",
      "generations": ["5G"],
      "networkCount": 63,
      "url": "https://mcc-mnc.org/coverage/5g_3500"
    }
  ],
  "meta": { "total": 7 }
}
GET/api/v1/network-types/{slug}

Retrieve a network type

One technology, plus how many countries have at least one network running it.

Path parameters

slugstringrequired
Network-type slug or name.

Example request

curl -s "https://mcc-mnc.org/api/v1/network-types/5g_3500"

Example response

{
  "data": {
    "id": 18,
    "name": "5G",
    "slug": "5g_3500",
    "frequency": "3500",
    "generations": ["5G"],
    "networkCount": 63,
    "countryCount": 33,
    "url": "https://mcc-mnc.org/coverage/5g_3500"
  }
}

TADIG codes

A flattened view of the TADIG codes used in roaming agreements and TAP files — one row per network that has one.

GET/api/v1/tadigs

List TADIG codes

Networks that carry a TADIG code, searchable by code or operator.

Query parameters

searchstring
Match on TADIG, operator, brand or country name. Alias: q.
tadigstring
Exact TADIG code.
countrystring
ISO alpha-2 code or country slug.
limitinteger
Number of records to return. Between 1 and 200.Default: 50
offsetinteger
Number of records to skip — combine with limit to page.Default: 0
orderstring
Sort direction.ascdescDefault: asc

Example request

curl -s "https://mcc-mnc.org/api/v1/tadigs?country=DE&limit=1"

Example response

{
  "data": [
    {
      "tadig": "DEUD1",
      "operator": "Telekom Deutschland GmbH",
      "brand": "Telekom",
      "mcc": "262",
      "mnc": "01",
      "plmn": "26201",
      "country": {
        "name": "Germany",
        "iso": "DE",
        "slug": "germany"
      },
      "network": {
        "id": 122,
        "slug": "262_01",
        "url": "https://mcc-mnc.org/networks/262_01"
      }
    }
  ],
  "meta": {
    "total": 3,
    "limit": 1,
    "offset": 0,
    "count": 1,
    "hasMore": true
  }
}

MVNOs & services

Virtual operators and the networks they run on, APN settings, and whether each network offers VoLTE, Wi-Fi calling, ViLTE and VoNR. Seeded from Android's public telephony data and extended by users.

GET/api/v1/mvnos

List & search MVNOs

Every published MVNO brand with the countries it trades in and the networks currently hosting it. Filters combine with AND.

Query parameters

searchstring
Partial, case-insensitive brand name. Alias: q.
countrystring
ISO-3166 alpha-2 code or country slug. Matches brands trading in that country.
networkstring
PLMN ID or network slug. Matches brands currently hosted on that network.
categorystring
What the brand sells. Case-insensitive.CONSUMERTRAVELIOTENTERPRISE
scopestring
LOCAL brands are sold in particular countries; GLOBAL ones issue SIMs from many countries' networks (travel eSIMs, IoT). Case-insensitive.LOCALGLOBAL
limitinteger
Number of records to return. Between 1 and 200.Default: 50
offsetinteger
Number of records to skip — combine with limit to page.Default: 0
  • →networks lists current hosts only. A brand on its own MNC (Lycamobile on 234-26) doesn't count as hosted there; GET /mvnos/{slug} shows those, flagged ownCode.
  • →Sorted by name.

Example request

curl -s "https://mcc-mnc.org/api/v1/mvnos?country=GB&search=lyca"

Example response

{
  "data": [
    {
      "slug": "lycamobile",
      "name": "Lycamobile",
      "category": "CONSUMER",
      "scope": "LOCAL",
      "countries": [
        { "name": "United Kingdom", "iso": "GB", "slug": "united_kingdom" },
        { "name": "United States of America", "iso": "US", "slug": "united_states_of_america" }
      ],
      "networks": [
        {
          "name": "T-Mobile UK",
          "iso": "GB",
          "slug": "234_30",
          "mcc": "234",
          "mnc": "30",
          "plmn": "23430",
          "url": "https://mcc-mnc.org/networks/234_30"
        }
      ],
      "url": "https://mcc-mnc.org/mvno/lycamobile",
      "updatedAt": "2026-09-18T17:52:35.889Z"
    }
  ],
  "meta": {
    "total": 1,
    "limit": 50,
    "offset": 0,
    "count": 1,
    "hasMore": false
  }
}
GET/api/v1/mvnos/{slug}

Retrieve an MVNO

One brand, grouped by country, with every host network it has been seen on — each with the brand's own VoLTE/VoWiFi states and APNs on that network.

Path parameters

slugstringrequired
The brand's slug, as returned by GET /mvnos.
  • →country is null for a GLOBAL brand: its networks come as one group.
  • →A network with an endedAt is one the brand has left; a country with status: "CLOSED" is one it no longer trades in.
  • →Returns 404 for a slug we don't know or a brand that isn't published yet.

Example request

curl -s "https://mcc-mnc.org/api/v1/mvnos/lycamobile"

Example response

{
  "data": {
    "slug": "lycamobile",
    "name": "Lycamobile",
    "website": "https://www.lycamobile.com",
    "logoUrl": null,
    "description": null,
    "category": "CONSUMER",
    "scope": "LOCAL",
    "esimOnly": null,
    "parent": null,
    "children": [],
    "countries": [
      {
        "country": {
          "name": "United Kingdom",
          "iso": "GB",
          "slug": "united_kingdom",
          "url": "https://mcc-mnc.org/countries/united_kingdom"
        },
        "operatorName": null,
        "subBrandOf": null,
        "status": "ACTIVE",
        "endedAt": null,
        "networks": [
          {
            "name": "Lycamobile",
            "slug": "234_26",
            "mcc": "234",
            "mnc": "26",
            "plmn": "23426",
            "url": "https://mcc-mnc.org/networks/234_26",
            "ownCode": true,
            "endedAt": null,
            "features": [],
            "apns": [
              {
                "name": "Lycamobile",
                "apn": "data.lycamobile.co.uk",
                "types": ["default", "ia", "supl"],
                "protocol": null,
                "roamingProtocol": null,
                "authType": "pap",
                "username": "lmuk",
                "password": "plus",
                "proxy": null,
                "port": null,
                "mmsc": null,
                "mmsProxy": null,
                "mmsPort": null,
                "mtu": null,
                "mvnoMatch": { "type": "spn", "value": "Lycamobile" },
                "sources": ["aosp"]
              }
            ]
          }
        ]
      }
    ],
    "url": "https://mcc-mnc.org/mvno/lycamobile",
    "updatedAt": "2026-09-18T17:52:35.889Z",
    "syncedAt": "2026-09-18T17:52:34.313Z"
  }
}
GET/api/v1/networks/{identifier}/apns

APN settings for a network

The network's own APNs, the APNs of each MVNO on it, and any brand-specific entries whose brand we can't name. Resolves the network like GET /networks/{identifier}.

Path parameters

identifierstringrequired
Network slug, PLMN ID (5–6 digits) or numeric id.
  • →sources says who lists the entry: aosp and lineageos are Android's public APN lists, user is a correction or addition submitted here. An entry both lists carry identically appears once, with both sources.
  • →mvnoMatch is how a phone tells an MVNO's SIM apart on a shared network: spn (service provider name), gid (group identifier), imsi (IMSI prefix) or iccid, with the value the SIM must carry. null for the operator's own APNs.
  • →authType is none, pap, chap, pap_or_chap or null when the source doesn't say.
  • →otherApns holds brand-specific entries (they carry an mvnoMatch) whose brand we haven't identified.

Example request

curl -s "https://mcc-mnc.org/api/v1/networks/23410/apns"

Example response

{
  "data": {
    "network": {
      "slug": "234_10",
      "mcc": "234",
      "mnc": "10",
      "plmn": "23410",
      "url": "https://mcc-mnc.org/networks/234_10"
    },
    "apns": [
      {
        "name": "o2 Pay Monthly",
        "apn": "mobile.o2.co.uk",
        "types": ["cbs", "default", "ia", "mms", "supl", "xcap"],
        "protocol": "IPV4V6",
        "roamingProtocol": null,
        "authType": "pap",
        "username": "o2",
        "password": "p",
        "proxy": null,
        "port": null,
        "mmsc": "http://mmsc.mms.o2.co.uk:8002",
        "mmsProxy": null,
        "mmsPort": null,
        "mtu": null,
        "mvnoMatch": null,
        "sources": ["aosp"]
      }
    ],
    "mvnoApns": [
      {
        "mvno": {
          "slug": "giffgaff",
          "name": "giffgaff",
          "url": "https://mcc-mnc.org/mvno/giffgaff"
        },
        "apns": [
          {
            "name": "giffgaff",
            "apn": "giffgaff.com",
            "types": ["default", "ia", "mms", "supl", "xcap"],
            "protocol": "IPV4V6",
            "roamingProtocol": null,
            "authType": "pap",
            "username": "gg",
            "password": "p",
            "proxy": null,
            "port": null,
            "mmsc": "http://mmsc.mediamessaging.co.uk:8002",
            "mmsProxy": null,
            "mmsPort": null,
            "mtu": null,
            "mvnoMatch": { "type": "spn", "value": "giffgaff" },
            "sources": ["aosp"]
          }
        ]
      }
    ],
    "otherApns": []
  }
}
GET/api/v1/networks/{identifier}/services

VoLTE, Wi-Fi calling & MVNOs on a network

Which voice services the network offers — VoLTE, VoWiFi (Wi-Fi calling), ViLTE (video calling) and VoNR — and which MVNOs run on it, each with its own states.

Path parameters

identifierstringrequired
Network slug, PLMN ID (5–6 digits) or numeric id.
  • →feature is one of VOLTE, VOWIFI, VILTE or VONR, and state is YES, LIKELY or NO. LIKELY is inferred rather than stated — for example, the network publishes an IMS APN. A feature missing from the list is unknown, not unsupported.
  • →source is where the state came from: carrier-config (Android's CarrierConfig), ims-apn, user (an approved report) or admin. A person's report always outranks the files.
  • →subBrand is true when the network owns the brand (giffgaff on O2 UK). endedAt is set for brands that have left the network.
  • →globalSims are travel and IoT brands issuing SIMs from this network's numbering — not local MVNOs you'd buy in the country.
  • →The data is seeded from Android's public telephony data — the AOSP and LineageOS APN lists, the carrier ID database and CarrierConfig — and extended by corrections people submit on the site. syncedAt is when that seed was last refreshed.

Example request

curl -s "https://mcc-mnc.org/api/v1/networks/23410/services"

Example response

{
  "data": {
    "network": {
      "slug": "234_10",
      "mcc": "234",
      "mnc": "10",
      "plmn": "23410",
      "url": "https://mcc-mnc.org/networks/234_10"
    },
    "features": [
      {
        "feature": "VOLTE",
        "label": "VoLTE",
        "state": "LIKELY",
        "source": "ims-apn",
        "asOf": "2026-09-18T17:52:41.171Z"
      }
    ],
    "mvnos": [
      {
        "slug": "giffgaff",
        "name": "giffgaff",
        "category": "CONSUMER",
        "subBrand": true,
        "endedAt": null,
        "url": "https://mcc-mnc.org/mvno/giffgaff",
        "features": [
          {
            "feature": "VOLTE",
            "label": "VoLTE",
            "state": "LIKELY",
            "source": "ims-apn",
            "asOf": "2026-09-18T17:52:41.171Z"
          }
        ]
      }
    ],
    "globalSims": [
      {
        "slug": "1global",
        "name": "1GLOBAL",
        "category": "TRAVEL",
        "subBrand": false,
        "endedAt": null,
        "url": "https://mcc-mnc.org/mvno/1global",
        "features": []
      }
    ],
    "syncedAt": "2026-09-18T17:52:34.313Z"
  }
}

Cell towers

Look up a cell tower by its identity and get its estimated position and coverage radius, from OpenCelliD's crowd-sourced measurements (CC BY-SA 4.0 — credit OpenCelliD wherever you show the data).

GET/api/v1/cells

Find a cell

Every measured cell with this MCC, MNC and cell id, newest first. Cell ids repeat across location areas and radios, so there can be several; add area and radio to pin one down. meta.network is the network the PLMN belongs to, when the database lists it.

Query parameters

mccstringrequired
Mobile Country Code.
mncstringrequired
Mobile Network Code. Leading zeros don't matter.
cellstringrequired
Cell id: CID (GSM), UTRAN cell id (UMTS), 28-bit ECI (LTE, eNB × 256 + sector) or 36-bit NCI (NR). Decimal, or hex with a 0x prefix.
areastring
LAC (GSM/UMTS), TAC (LTE/NR) or NID (CDMA). Decimal or 0x hex. Aliases: lac, tac.
radiostring
Radio technology.GSMUMTSCDMALTENR
  • →No match is a 200 with an empty data array: OpenCelliD not having measured a cell doesn't mean it doesn't exist.
  • →Positions are estimates from people's measurements, not the operator's mast locations, and range is how far the cell has been heard from.
  • →At most 50 cells come back; meta.truncated says there were more.

Example request

curl -s "https://mcc-mnc.org/api/v1/cells?mcc=234&mnc=10&cell=2192494"

Example response

{
  "data": [
    {
      "radio": "LTE",
      "generation": "4G",
      "mcc": "234",
      "mnc": 10,
      "area": 50322,
      "cell": 2192494,
      "unit": null,
      "lat": 53.0741,
      "lon": -3.1679,
      "range": 2456,
      "samples": 51,
      "changeable": true,
      "averageSignal": null,
      "firstSeen": "2021-05-29T09:21:33.000Z",
      "lastSeen": "2026-09-06T10:33:11.000Z",
      "source": "opencellid"
    }
  ],
  "meta": {
    "matches": 1,
    "truncated": false,
    "network": {
      "slug": "234_10",
      "mcc": "234",
      "mnc": "10",
      "operator": "Telefónica Europe",
      "brand": "O2 UK",
      "country": "United Kingdom",
      "url": "https://mcc-mnc.org/networks/234_10"
    },
    "attribution": "Cell data from OpenCelliD (https://opencellid.org), licensed CC BY-SA 4.0."
  }
}

Metadata

Service discovery and headline counts.

GET/api/v1/stats

Database statistics

Live totals for the whole dataset — the same figures the stats page renders.

Example request

curl -s "https://mcc-mnc.org/api/v1/stats"

Example response

{
  "data": {
    "networks": 2664,
    "countries": 231,
    "regions": 7,
    "networkTypes": 90,
    "networksWithTadig": 649,
    "networksPerCountry": 11.53,
    "lastUpdated": "2025-04-09T13:26:22.184Z"
  }
}
GET/api/v1

Service index

A machine-readable map of every endpoint, plus a link to the OpenAPI document.

Example request

curl -s "https://mcc-mnc.org/api/v1"

Example response

{
  "name": "mcc-mnc.org API",
  "version": "v1",
  "documentation": "https://mcc-mnc.org/api",
  "openapi": "https://mcc-mnc.org/api/v1/openapi.json",
  "authentication": {
    "type": "optional",
    "header": "Authorization: Bearer <key>",
    "keys": "https://mcc-mnc.org/account",
    "weeklyLimit": { "withoutKey": 100, "withKey": 10000 },
    "resets": "Monday 00:00 UTC"
  },
  "endpoints": { … }
}

Free to build on

Use it in commercial and non-commercial work alike. If it ends up in something public, a link back to mcc-mnc.org keeps the database funded and correctable.

Spotted something wrong?

Corrections and missing networks are checked before they go live, and land in the API the moment they're approved. Submit an entry.

API FAQ

The questions developers ask before wiring it in.

Still have a question?

Need a higher allowance, a field you wish existed, or a dataset we don't publish yet? Tell us what you're building.

Contact us
Is the API free?

Yes, for commercial and non-commercial use. Without a key you get 100 requests a week per IP address. Sign in (it's free) and create a key for 10,000 a week. If it ends up in something public, a link back to mcc-mnc.org is appreciated.

Do I need an API key?

Not to start: every endpoint works without one. A key raises your allowance to 10,000 requests a week and counts you as a user rather than an IP. Sign in with an emailed link, then create keys on your account page. All your keys share one allowance.

What happens when I run out?

You get a 429 with the code rate_limited, a resetAt time in the body and a Retry-After header. The week resets every Monday at 00:00 UTC. Every response carries X-RateLimit-Remaining, so you can see it coming.

Do bulk downloads count against the allowance?

Yes, one file is one request. That makes a download the cheapest way to get everything: a single request returns every network, in CSV, Excel, TXT or JSON.

Can I call it from the browser?

Yes. CORS is open to any origin. But a key in front-end code is visible to anyone who opens the page, so in the browser either call it without a key or send the request through your own server.

Can I cache the responses?

Please do, on your side. Responses are marked private, no-store because each one is counted, so shared caches won't hold them. The data changes a few times a day at most.

How current is the data?

It's the same database the site reads. An approved correction shows up on the next request, and the changelog lists what changed.

Is there an OpenAPI spec?

Yes, OpenAPI 3.1 at /api/v1/openapi.json. It's generated from the same source as this page, so the two can't drift. Import it into Postman, Insomnia or a client generator.

Should I use the API or the MCP server?

Use the API when you're writing code. If you want an AI assistant such as Claude, ChatGPT or Cursor to look codes up for you, connect the MCP server instead. It runs the same queries, shaped for a model.

Need the whole dataset, not one call?

Take every network as a single CSV, Excel, TXT or JSON file. Or skip the code and let your AI assistant query it through the MCP server.