Skip to main content

University Domains & Email Verification API

REAL DATA

Search 10,254 universities and colleges in 199 countries, resolve a domain like mit.edu to its institution, and check if an email is a university address.

Authoritative reference data or standards computation

Base URL
/api/universities
Capabilities
3 routes
Last updated
Data sources · 2

GET /api/universities

Returns matching institutions from the pinned snapshot. A page holds at most 100 records; use offset to walk further.

Live requestRuns against the public API
No key required
GET/api/universities?country=dk&count=100

Request parameters

Only institutions in this country (ISO 3166-1 alpha-2, case-insensitive — us and US both work). A valid two-letter code with no institutions in the snapshot returns an empty list; anything that isn't two letters is a 400.

Only institutions whose name contains this text — case-, diacritic- and apostrophe-insensitive (universite matches Université, munchen matches München).

country = the stored order, grouped by ISO alpha-2 code and A→Z by name inside each country; name = one global A→Z ordering across every country.

Skip this many matches before count is applied, so you can page through large results (offset=100 with count=100 returns the second hundred).

Advanced response options6 options

Limit the number of returned records (1–100). Defaults to 25.

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Response format: json envelope, ndjson (one record per line) or csv.

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/universities?country=dk&count=100"
const res = await fetch("https://randomapi.dev/api/universities?country=dk&count=100");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/universities?country=dk&count=100").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/universities?country=dk&count=100"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 4
country string

Only institutions in this country (ISO 3166-1 alpha-2, case-insensitive — us and US both work). A valid two-letter code with no institutions in the snapshot returns an empty list; anything that isn't two letters is a 400.

example: country=DK
search string

Only institutions whose name contains this text — case-, diacritic- and apostrophe-insensitive (universite matches Université, munchen matches München).

example: search=institute of technology
sort enum

country = the stored order, grouped by ISO alpha-2 code and A→Z by name inside each country; name = one global A→Z ordering across every country.

default: country
allowed: country | name
example: sort=name
offset int

Skip this many matches before count is applied, so you can page through large results (offset=100 with count=100 returns the second hundred).

default: 0
allowed: 0 – 20000
example: offset=100
Universal parameters Shared response and formatting options 6
count int

Limit the number of returned records (1–100). Defaults to 25.

default: 25
allowed: 1 – 100
example: count=3
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=name,country
exclude list

Return all fields except these (comma-separated).

example: exclude=website
format enum

Response format: json envelope, ndjson (one record per line) or csv.

default: json
allowed: json | ndjson | csv
example: format=csv
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 5
name string

Institution name exactly as the upstream community list publishes it. Casing and punctuation are inconsistent upstream and are never rewritten here.

example: Massachusetts Institute of Technology

country string

Canonical ISO 3166-1 English country name, joined from this project's country dataset by the upstream alpha-2 code. The upstream free-text country string is discarded.

example: United States

countryCode string

ISO 3166-1 alpha-2 code as published upstream.

example: US

domains string[]

Every domain the list registers to this institution, lowercased. Never empty; most rows have one, a few have up to five.

example: ["mit.edu"]

website string

The first upstream web page, verbatim. Many are still http:// and some redirect or have moved — this is a copied value, not a checked one.

example: http://web.mit.edu/

Documented examples

Build-generated requests and complete responses
5
Every Danish institution in the snapshot
GET /api/universities?country=dk&count=100
{
  "data": [
    {
      "name": "Aalborg Business College",
      "country": "Denmark",
      "countryCode": "DK",
      "domains": [
        "ah.dk"
      ],
      "website": "http://www.ah.dk/"
    },
    {
      "name": "Aalborg University",
      "country": "Denmark",
      "countryCode": "DK",
      "domains": [
        "auc.dk",
        "aau.dk",
        "student.aau.dk"
      ],
      "website": "http://www.auc.dk/"
    },
    {
      "name": "Aarhus School of Architecture",
      "country": "Denmark",
      "countryCode": "DK",
      "domains": [
        "a-aarhus.dk"
      ],
      "website": "http://www.a-aarhus.dk/"
    },
    {
      "name": "Aarhus School of Business",
      "country": "Denmark",
      "countryCode": "DK",
      "domains": [
        "hha.dk"
      ],
      "website": "http://www.hha.dk/"
    },
    …
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
Institutes of technology worldwide
GET /api/universities?search=institute+of+technology&count=25
{
  "data": [
    {
      "name": "Eritrea Institute of Technology",
      "country": "Eritrea",
      "countryCode": "ER",
      "domains": [
        "eit.edu.er"
      ],
      "website": "http://www.eit.edu.er/"
    },
    {
      "name": "Mekelle Institute of Technology",
      "country": "Ethiopia",
      "countryCode": "ET",
      "domains": [
        "mitethiopia.edu.et"
      ],
      "website": "http://www.mitethiopia.edu.et/"
    },
    {
      "name": "Dares Salaam Institute of Technology",
      "country": "Tanzania",
      "countryCode": "TZ",
      "domains": [
        "dit.ac.tz"
      ],
      "website": "http://www.dit.ac.tz/"
    },
    {
      "name": "Harare Institute of Technology",
      "country": "Zimbabwe",
      "countryCode": "ZW",
      "domains": [
        "hit.ac.zw"
      ],
      "website": "http://www.hit.ac.zw/"
    },
    {
      "name": "Beijing Institute of Technology",
    …
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
Find Université de Montréal without typing the accent
GET /api/universities?search=universite+de+montreal
{
  "data": [
    {
      "name": "École Polytechnique de Montréal, Université de Montréal",
      "country": "Canada",
      "countryCode": "CA",
      "domains": [
        "polymtl.ca"
      ],
      "website": "http://www.polymtl.ca/"
    },
    {
      "name": "Université de Montréal",
      "country": "Canada",
      "countryCode": "CA",
      "domains": [
        "umontreal.ca"
      ],
      "website": "http://www.umontreal.ca/"
    }
  ],
  "meta": {
    "endpoint": "universities",
    "count": 2,
    "params": {
      "search": "universite de montreal",
      "sort": "country",
      "offset": 0
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
The second hundred US institutions, A→Z
GET /api/universities?country=us&sort=name&count=100&offset=100
{
  "data": [
    {
      "name": "Austin College",
      "country": "United States",
      "countryCode": "US",
      "domains": [
        "austincollege.edu"
      ],
      "website": "http://www.austincollege.edu/"
    },
    {
      "name": "Austin Community College",
      "country": "United States",
      "countryCode": "US",
      "domains": [
        "austincc.edu"
      ],
      "website": "http://www.austincc.edu/"
    },
    {
      "name": "Austin Peay State University",
      "country": "United States",
      "countryCode": "US",
      "domains": [
        "apsu.edu"
      ],
      "website": "http://www.apsu.edu/"
    },
    {
      "name": "Averett College",
      "country": "United States",
      "countryCode": "US",
      "domains": [
        "averett.edu"
      ],
      "website": "http://www.averett.edu/"
    },
    {
      "name": "Avila College",
    …
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
Name + domain reference table as CSV
GET /api/universities?country=jp&count=100&fields=name,domains&format=csv
name,domains
Aichi Bunkyo University,"[""abu.ac.jp""]"
Aichi Gakuin University,"[""aichi-gakuin.ac.jp""]"
Aichi Gakusen University,"[""gakusen.ac.jp""]"
Aichi Institute of Technology,"[""aitech.ac.jp""]"
Aichi Medical University,"[""aichi-med-u.ac.jp""]"
Aichi Prefectural University,"[""aichi-pu.ac.jp""]"
Aichi Prefectural University of Fine Arts & Music,"[""aichi-fam-u.ac.jp""]"
Aichi Sangyo University,"[""asu.ac.jp""]"
Aichi Shukutoku University,"[""aasa.ac.jp""]"
Aichi University,"[""aichi-u.ac.jp""]"
Aichi University of Education,"[""aichi-edu.ac.jp""]"
Aikoku Gakuen University,"[""aikoku-u.ac.jp""]"
Akita University,"[""akita-u.ac.jp""]"
Akita University of Economics and Law,"[""akeihou-u.ac.jp""]"
"American University Extension, Okinawa","[""aue-okinawa.ac.jp""]"
Aomori Chuoh Gakuin University,"[""aomoricgu.ac.jp""]"
Aomori Public College,"[""nebuta.ac.jp""]"
Aomori University,"[""aomori-u.ac.jp""]"
Aomori University of Health and Welfare,"[""auhw.ac.jp""]"
Aoyama Gakuin University,"[""aoyama.ac.jp""]"
Asahi University,"[""asahi-u.ac.jp""]"
Asahikawa Medical College,"[""asahikawa-med.ac.jp""]"
Asahikawa University,"[""asahikawa-u.ac.jp""]"
Ashikaga Institute of Technology,"[""ashitech.ac.jp""]"
Ashiya University,"[""ashiya-u.ac.jp""]"
Asia University,"[""asia-u.ac.jp""]"
Atomi College,"[""atomi.ac.jp""]"
Azabu University,"[""azabu-u.ac.jp""]"
Baika Women's College,"[""baika.ac.jp""]"
Baiko Women's College,"[""baiko.ac.jp""]"
Beppu University,"[""beppu-u.ac.jp""]"
Bukkyo University,"[""bukkyo-u.ac.jp""]"
Bunka Women's University,"[""bunka-wu.ac.jp""]"
Bunkyo Gakuin University,"[""bgu.ac.jp""]"
Bunkyo University,"[""bunkyo.ac.jp""]"
Chiba Institute of Technology,"[""it-chiba.ac.jp""]"
Chiba Keizai University,"[""cku.ac.jp""]"
Chiba University,"[""chiba-u.ac.jp""]"
Chiba University,"[""chiba-u.jp""]"
    …
Hanazono University,"[""hanazono.ac.jp""]"
Hannan University,"[""hannan-u.ac.jp""]"

GET /api/universities/by-domain

Exact match first; when the host itself is not listed, the lookup walks up to the parent domain and says so. Never falls back to a bare TLD.

Live requestRuns against the public API
No key required
GET/api/universities/by-domain?domain=mit.edu

Request parameters

The domain to resolve, e.g. mit.edu. Case-insensitive; a full URL is accepted and reduced to its host. Must have at least two labels.

Advanced response options4 options

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/universities/by-domain?domain=mit.edu"
const res = await fetch("https://randomapi.dev/api/universities/by-domain?domain=mit.edu");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/universities/by-domain?domain=mit.edu").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/universities/by-domain?domain=mit.edu"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 1
domain string required

The domain to resolve, e.g. mit.edu. Case-insensitive; a full URL is accepted and reduced to its host. Must have at least two labels.

example: domain=mit.edu
Universal parameters Shared response and formatting options 4
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=domain,matchedDomain
exclude list

Return all fields except these (comma-separated).

example: exclude=institutions
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 5
domain string

The host that was looked up, lowercased (and extracted from a URL if one was given).

example: cs.ox.ac.uk

matchedDomain string

The listed domain that produced the answer — equal to domain on an exact hit.

example: ox.ac.uk

matchType string

exact = the queried host is itself listed; parent = an ancestor domain of it is listed.

example: parent

institutionCount integer

How many institutions are listed under matchedDomain — 1, except for the four shared domains.

example: 1

institutions object[]

Every institution registered under matchedDomain, each with name, country, countryCode, domains and website. Normally one entry; upstream registers four domains to two institutions each.

example: [{"name":"Massachusetts Institute of Technology","country":"United States","countryCode":"US","domains":["mit.edu"],"website":"http://web.mit.edu/"}]

Documented examples

Build-generated requests and complete responses
4
Who owns mit.edu?
GET /api/universities/by-domain?domain=mit.edu
{
  "data": {
    "domain": "mit.edu",
    "matchedDomain": "mit.edu",
    "matchType": "exact",
    "institutionCount": 1,
    "institutions": [
      {
        "name": "Massachusetts Institute of Technology",
        "country": "United States",
        "countryCode": "US",
        "domains": [
          "mit.edu"
        ],
        "website": "http://web.mit.edu/"
      }
    ]
  },
  "meta": {
    "endpoint": "universities",
    "route": "/by-domain",
    "params": {
      "domain": "mit.edu"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
A subdomain resolves to its parent
GET /api/universities/by-domain?domain=cs.ox.ac.uk
{
  "data": {
    "domain": "cs.ox.ac.uk",
    "matchedDomain": "ox.ac.uk",
    "matchType": "parent",
    "institutionCount": 1,
    "institutions": [
      {
        "name": "University of Oxford",
        "country": "United Kingdom",
        "countryCode": "GB",
        "domains": [
          "oxford.ac.uk",
          "ox.ac.uk"
        ],
        "website": "http://www.ox.ac.uk/"
      }
    ]
  },
  "meta": {
    "endpoint": "universities",
    "route": "/by-domain",
    "params": {
      "domain": "cs.ox.ac.uk"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
A domain two institutions share
GET /api/universities/by-domain?domain=qu.edu.az
{
  "data": {
    "domain": "qu.edu.az",
    "matchedDomain": "qu.edu.az",
    "matchType": "exact",
    "institutionCount": 2,
    "institutions": [
      {
        "name": "Karabakh University",
        "country": "Azerbaijan",
        "countryCode": "AZ",
        "domains": [
          "qu.edu.az"
        ],
        "website": "https://qu.edu.az/"
      },
      {
        "name": "Qafqaz University",
        "country": "Azerbaijan",
        "countryCode": "AZ",
        "domains": [
          "qu.edu.az"
        ],
        "website": "http://www.qu.edu.az/"
      }
    ]
  },
  "meta": {
    "endpoint": "universities",
    "route": "/by-domain",
    "params": {
      "domain": "qu.edu.az"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
A full URL is reduced to its host
GET /api/universities/by-domain?domain=https://www.u-tokyo.ac.jp/en/
{
  "data": {
    "domain": "www.u-tokyo.ac.jp",
    "matchedDomain": "u-tokyo.ac.jp",
    "matchType": "parent",
    "institutionCount": 1,
    "institutions": [
      {
        "name": "University of Tokyo",
        "country": "Japan",
        "countryCode": "JP",
        "domains": [
          "u-tokyo.ac.jp"
        ],
        "website": "http://www.u-tokyo.ac.jp/"
      }
    ]
  },
  "meta": {
    "endpoint": "universities",
    "route": "/by-domain",
    "params": {
      "domain": "www.u-tokyo.ac.jp"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}

GET /api/universities/verify-email

A verdict, not a lookup: an address outside the list answers isUniversity=false with HTTP 200. Only a malformed address is a 400.

Live requestRuns against the public API
No key required
GET/api/universities/verify-email?email=ada%40mit.edu

Request parameters

The address to check. Only its domain is used; the local part is never matched, stored or validated beyond being non-empty.

Advanced response options4 options

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/universities/verify-email?email=ada@mit.edu"
const res = await fetch("https://randomapi.dev/api/universities/verify-email?email=ada@mit.edu");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/universities/verify-email?email=ada@mit.edu").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/universities/verify-email?email=ada@mit.edu"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 1
email string required

The address to check. Only its domain is used; the local part is never matched, stored or validated beyond being non-empty.

example: email=ada@mit.edu
Universal parameters Shared response and formatting options 4
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=email,domain
exclude list

Return all fields except these (comma-separated).

example: exclude=countryCode
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 9
email string

The address as supplied, trimmed. Nothing about the local part is verified.

example: ada@mit.edu

domain string

The address's domain, lowercased — the only part this route looks at.

example: mit.edu

isUniversity boolean

true when the domain, or a parent of it, is on the pinned community list. It does NOT mean the mailbox exists or that the institution is accredited.

example: true

matchedDomain string nullable

The listed domain that produced the verdict, or null when there was no match.

example: mit.edu

matchType string nullable

exact, parent, or null when isUniversity is false.

example: exact

institutionCount integer

Institutions listed under matchedDomain; 0 when there is no match, 2 for the four shared domains.

example: 1

name string nullable

The institution, when exactly one is listed under matchedDomain. null when there is no match AND when the domain is shared by two institutions — use /by-domain to see both.

example: Massachusetts Institute of Technology

country string nullable

That institution's canonical ISO 3166-1 English country name, or null.

example: United States

countryCode string nullable

That institution's ISO 3166-1 alpha-2 code, or null.

example: US

Documented examples

Build-generated requests and complete responses
3
A university address
GET /api/universities/verify-email?email=ada@mit.edu
{
  "data": {
    "email": "ada@mit.edu",
    "domain": "mit.edu",
    "isUniversity": true,
    "matchedDomain": "mit.edu",
    "matchType": "exact",
    "institutionCount": 1,
    "name": "Massachusetts Institute of Technology",
    "country": "United States",
    "countryCode": "US"
  },
  "meta": {
    "endpoint": "universities",
    "route": "/verify-email",
    "params": {
      "email": "ada@mit.edu"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
A consumer address is a plain false
GET /api/universities/verify-email?email=someone@gmail.com
{
  "data": {
    "email": "someone@gmail.com",
    "domain": "gmail.com",
    "isUniversity": false,
    "matchedDomain": null,
    "matchType": null,
    "institutionCount": 0,
    "name": null,
    "country": null,
    "countryCode": null
  },
  "meta": {
    "endpoint": "universities",
    "route": "/verify-email",
    "params": {
      "email": "someone@gmail.com"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}
A department subdomain still resolves
GET /api/universities/verify-email?email=student@cs.ox.ac.uk
{
  "data": {
    "email": "student@cs.ox.ac.uk",
    "domain": "cs.ox.ac.uk",
    "isUniversity": true,
    "matchedDomain": "ox.ac.uk",
    "matchType": "parent",
    "institutionCount": 1,
    "name": "University of Oxford",
    "country": "United Kingdom",
    "countryCode": "GB"
  },
  "meta": {
    "endpoint": "universities",
    "route": "/verify-email",
    "params": {
      "email": "student@cs.ox.ac.uk"
    },
    "generatedAt": "2026-09-15T19:47:18.000Z"
  }
}

About this API

Coverage & behavior

A pinned snapshot of the Hipo university-domains-list10,254 institutions across 199 countries and territories, carrying 10,574 distinct internet domains. It exists mainly to answer the reverse question: which institution owns this email domain?

Read this before you trust a hit. The upstream list is community-maintained and pull-request-driven. It is not an accredited register, not an official or government list, and not complete. A match means "this domain appears on a widely used community list", never "this institution is accredited" or "this address is genuine". Anything that must be authoritative belongs with the relevant national ministry or accreditor, not here.

What the three routes do

  • /api/universities lists institutions, filtered by country (ISO 3166-1 alpha-2) and search (a case-, diacritic- and apostrophe-insensitive match on the name, so universite finds Université). sort picks the stored country grouping or one global A→Z ordering, and offset pages through big countries — US has 2,348, JP has 572, IN has 477, CN has 398, DE has 321.
  • /api/universities/by-domain resolves a domain to the institution(s) listed under it. If the exact host is not listed, it walks up to the parent domaincs.ox.ac.uk resolves to ox.ac.uk — and tells you which domain matched and whether the match was exact or parent. A domain with no listed ancestor is an honest 404.
  • /api/universities/verify-email answers the signup-form question directly: { isUniversity, name, country } for an address. A non-university address is not an error here — isUniversity: false is the answer, so the route never 404s.

Honest edges, all of them upstream properties

  • 4 domains are registered to two institutions each (jazanu.edu.sa, khio.no, marun.edu.tr, qu.edu.az). by-domain returns both rather than silently picking one; verify-email reports institutionCount: 2, leaves name and country null and warns, because there is no honest single answer.
  • Names are copied verbatim, so casing is inconsistent and a handful carry upstream maintenance notes in the name itself.
  • A listed domain can be stale. Nothing here re-resolves DNS or checks that a mailbox exists — use /api/email-syntax for RFC 5321/5322 validation of the address shape.
  • The upstream state-province column is not shipped: it is populated on 13.4% of rows and, where populated, mixes "CA" with "California", a city in the state slot and "City, State" blobs. /api/country-subdivisions ships the real ISO 3166-2 register instead.
  • The 5 upstream rows coded XK (Kosovo) are not carried, because this project's country table ships only officially assigned ISO 3166-1 alpha-2 codes and there is no canonical name to join.

The snapshot is dated 2026-09-14, pinned by SHA-256 and re-verified by a committed parity script. Nothing is fetched while your request is served.

Use it for

  • Gate an education discount or student plan on the sign-up email's domain
  • Label inbound leads and support tickets with the institution behind the sender's domain
  • Populate realistic education fields in fixtures with real institutions from one country

Frequently asked questions

How do I check if an email address is from a university?

/api/universities/verify-email?email=ada@mit.edu returns isUniversity, the matched domain and the institution. A non-university address answers isUniversity: false with HTTP 200 — it is a verdict, not an error.

Does it work for subdomains like cs.ox.ac.uk?

Yes. When the exact host is not listed, the lookup walks up to the parent domain and returns matchType: "parent" plus the matchedDomain that actually matched, so you can see how the answer was reached. It never falls back to a bare TLD.

Is this an official list of accredited universities?

No. It is a pinned snapshot of the community-maintained Hipo university-domains-list (MIT). It is not an accredited register and not complete — a match only means the domain is on that list.

Can one domain belong to two universities?

Yes — upstream registers 4 domains to two institutions each (jazanu.edu.sa, khio.no, marun.edu.tr, qu.edu.az). by-domain returns every match instead of guessing, and verify-email reports institutionCount: 2 with a null name.

Why is there no state or province filter?

Because the upstream column is populated on only 13.4% of rows and is free text of mixed shape — the US rows alone mix CA with California and put cities in the state slot. Filtering on it would silently exclude most of the data, so it is not shipped at all.