# Methodology: State veterinary facility-license registries: a 51-jurisdiction availability index

> **Correction, 4 October 2026.** The inventory's 28 September 2026 check recorded Arizona, Maryland and West Virginia as `bulk_feasible = no`. Each publishes a no-cost roster, retrieved on 30 September 2026: Arizona https://sites.google.com/vetboard.az.gov/public-record/home, Maryland https://opendata.maryland.gov/dataset/Veterinary-Hospitals/y7s8-gmfj, West Virginia https://services.wvbvm.org/verify/veterinaryfacilityroster.csv. The published figures treat all three as `bulk_feasible = yes` with formats "premises registry sheet with CSV export", "open-data map layer" and "facility roster CSV". The Kansas extract count is the number of distinct license numbers (677); the file has 678 rows, with PRF001675 listed twice. The queries below are unchanged.


Every figure on the page is an aggregate. No location-level row, address or phone number is published. Each block below gives the source, the exact query, the row counts and the minimum group size applied.

### Methodology: Which states license veterinary facilities and publish a bulk roster

- **Asset:** Veterinary facility-license registry inventory, 50 states + DC (csv, public_source); owner Rome (Vettica).
- **Collection method:** Checked each state veterinary board's website on 28 September 2026 for a facility license and a public bulk roster; evidence URL per state.
- **As of:** 2026-10-01; cadence quarterly_index; contribution type first_party.
- **Rows:** 51 input; 51 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 6 of 6 groups published (0 below threshold, 0 secondary).
- **Engine:** pandas.read_csv(dtype=str, keep_default_na=False) -> in-memory SQLite table "asset"

```sql
WITH filtered AS (
  SELECT "bulk_feasible", "licenses_facilities"
  FROM "asset"
),
rows AS (
  SELECT *,
    CASE "licenses_facilities" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "licensing",
    CASE "bulk_feasible" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "availability"
  FROM filtered
)
SELECT "licensing", "availability", COUNT(*) AS "states", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "licensing", "availability"
HAVING COUNT(*) >= ?
```
Parameters: `["yes", "license veterinary facilities", "no", "do not license veterinary facilities", "limited", "license only some facility types", "licensing not recorded", "yes", "a no-cost bulk roster", "held", "a search-only roster (no public bulk file)", "no", "no no-cost bulk roster", "roster availability not recorded", 1]`

### Methodology: Facility-license registry availability per state (map data)

- **Asset:** Veterinary facility-license registry inventory, 50 states + DC (csv, public_source); owner Rome (Vettica).
- **Collection method:** Checked each state veterinary board's website on 28 September 2026 for a facility license and a public bulk roster; evidence URL per state.
- **As of:** 2026-10-01; cadence quarterly_index; contribution type dataset.
- **Rows:** 51 input; 51 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 51 of 51 groups published (0 below threshold, 0 secondary).
- **Engine:** pandas.read_csv(dtype=str, keep_default_na=False) -> in-memory SQLite table "asset"

```sql
WITH filtered AS (
  SELECT "bulk_feasible", "licenses_facilities", "state_code"
  FROM "asset"
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "state_code", "licenses_facilities", "bulk_feasible", COUNT(*) AS "states", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "state_code", "licenses_facilities", "bulk_feasible"
HAVING COUNT(*) >= ?
```
Parameters: `[1]`

### Methodology: Veterinary facility-license availability by licensing, public-roster availability and format

- **Asset:** Veterinary facility-license registry inventory, 50 states + DC (csv, public_source); owner Rome (Vettica).
- **Collection method:** Checked each state veterinary board's website on 28 September 2026 for a facility license and a public bulk roster; evidence URL per state.
- **As of:** 2026-10-01; cadence quarterly_index; contribution type first_party.
- **Rows:** 51 input; 51 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 29 of 29 groups published (0 below threshold, 0 secondary).
- **Engine:** pandas.read_csv(dtype=str, keep_default_na=False) -> in-memory SQLite table "asset"

```sql
WITH filtered AS (
  SELECT "bulk_feasible", "format", "licenses_facilities"
  FROM "asset"
),
rows AS (
  SELECT *,
    CASE "licenses_facilities" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "licensing",
    CASE "bulk_feasible" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "availability"
  FROM filtered
)
SELECT "licensing", "availability", "format", COUNT(*) AS "jurisdictions", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "licensing", "availability", "format"
HAVING COUNT(*) >= ?
```
Parameters: `["yes", "licenses veterinary facilities", "no", "does not license veterinary facilities", "limited", "licenses only some facility types", "licensing not recorded", "yes", "a no-cost public roster", "held", "a search-only roster with a held copy", "no", "no no-cost public roster", "roster availability not recorded", 1]`

### Methodology: No-cost public veterinary-facility rosters by licensing scope

- **Asset:** Veterinary facility-license registry inventory, 50 states + DC (csv, public_source); owner Rome (Vettica).
- **Collection method:** Checked each state veterinary board's website on 28 September 2026 for a facility license and a public bulk roster; evidence URL per state.
- **As of:** 2026-10-01; cadence quarterly_index; contribution type derived.
- **Rows:** 51 input; 10 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 2 of 2 groups published (0 below threshold, 0 secondary).
- **Engine:** pandas.read_csv(dtype=str, keep_default_na=False) -> in-memory SQLite table "asset"

```sql
WITH filtered AS (
  SELECT "licenses_facilities"
  FROM "asset"
  WHERE "bulk_feasible" = ?
),
rows AS (
  SELECT *,
    CASE "licenses_facilities" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "licensing_scope"
  FROM filtered
)
SELECT "licensing_scope", COUNT(*) AS "jurisdictions", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "licensing_scope"
HAVING COUNT(*) >= ?
```
Parameters: `["yes", "yes", "general", "limited", "limited", "outside the roster partition", 1]`

### Methodology: Licensed veterinary facility records in public state extracts (FL, MO and KS)

- **Asset:** Licensed veterinary facilities from five state registries (FL, MO, KS, NC, OH) (csv, public_source); owner Rome (Vettica).
- **Collection method:** Downloaded the public facility-license extracts or rosters of five state boards (FL DBPR, MO, KS, NC, OH) on 24-25 September 2026; one row per licensed facility record.
- **As of:** 2026-10-01; cadence quarterly_index; contribution type first_party.
- **Rows:** 5511 input; 4806 after filters and de-duplication; 4805 counted (Kansas license number PRF001675 is listed twice and counted once).
- **Threshold:** at least 5 source rows per published group; 3 of 3 groups published (0 below threshold, 0 secondary).
- **Engine:** pandas.read_csv(dtype=str, keep_default_na=False) -> in-memory SQLite table "asset"

```sql
WITH filtered AS (
  SELECT "source_key"
  FROM "asset"
  WHERE "source_key" IN (?, ?, ?)
),
rows AS (
  SELECT *,
    CASE "source_key" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "registry_state"
  FROM filtered
)
SELECT "registry_state", COUNT(*) AS "facility_records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "registry_state"
HAVING COUNT(*) >= ?
```
Parameters: `["fl_dbpr_veterinary", "mo_mopro_facilities", "ks_kbve_premises", "fl_dbpr_veterinary", "FL", "mo_mopro_facilities", "MO", "ks_kbve_premises", "KS", "other", 5]`

