# Methodology: What 14 state veterinary boards publish in their facility rosters

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: Facility records in 14 state veterinary board rosters

- **Asset:** Facility records in 14 state veterinary board rosters (status and field flags only) (csv, public_source); owner Vettica.
- **Collection method:** Downloaded or queried the public facility roster of 14 state veterinary boards between 25 and 30 September 2026; raw copies retained, with sha256 recorded for 10 of the 14 files; one row per facility record.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 16026 input; 16026 after filters and de-duplication.
- **Threshold:** at least 5 source rows per published group; 14 of 14 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 "registry_state"
  FROM "asset"
),
rows AS (
  SELECT *,
    CASE "registry_state" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "roster_scope"
  FROM filtered
)
SELECT "registry_state", "roster_scope", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "registry_state", "roster_scope"
HAVING COUNT(*) >= ?
```
Parameters: `["OH", "partial extract, not a full roster", "SC", "limited scope: registered emergency clinics only", "full published roster", 5]`

### Methodology: Facility records across the 12 full state rosters

- **Asset:** Facility records in 14 state veterinary board rosters (status and field flags only) (csv, public_source); owner Vettica.
- **Collection method:** Downloaded or queried the public facility roster of 14 state veterinary boards between 25 and 30 September 2026; raw copies retained, with sha256 recorded for 10 of the 14 files; one row per facility record.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 16026 input; 15927 after filters and de-duplication.
- **Threshold:** at least 5 source rows per published group; 1 of 1 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 "registry_state" NOT IN (?, ?)
),
rows AS (
  SELECT *,
    CASE "source_key" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "roster_set"
  FROM filtered
)
SELECT "roster_set", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "roster_set"
HAVING COUNT(*) >= ?
```
Parameters: `["OH", "SC", "az_vmeb_premises", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "ca_vmb_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "fl_dbpr_veterinary", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "ks_kbve_premises", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "ky_kbve_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "md_mda_vet_hospitals", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "mo_mopro_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "nc_ncvmb_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "nm_bvm_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "nv_nsbvme_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "or_ovmeb_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "wv_bvm_facilities", "the 12 full rosters (AZ, CA, FL, KS, KY, MD, MO, NC, NM, NV, OR, WV)", "outside the 12 full rosters", 5]`

### Methodology: Share of records with a current status, six rosters that list other statuses

- **Asset:** Facility records in 14 state veterinary board rosters (status and field flags only) (csv, public_source); owner Vettica.
- **Collection method:** Downloaded or queried the public facility roster of 14 state veterinary boards between 25 and 30 September 2026; raw copies retained, with sha256 recorded for 10 of the 14 files; one row per facility record.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type derived.
- **Rows:** 16026 input; 6704 after filters and de-duplication.
- **Threshold:** at least 5 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 "registry_state"
  FROM "asset"
  WHERE "status_class" = ?
    AND "registry_state" IN (?, ?, ?, ?, ?, ?)
),
rows AS (
  SELECT *,
    CASE "registry_state" WHEN ? THEN ? ELSE ? END AS "roster_scope"
  FROM filtered
)
SELECT "registry_state", "roster_scope", COUNT(*) AS "current_records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "registry_state", "roster_scope"
HAVING COUNT(*) >= ?
```
Parameters: `["current", "AZ", "CA", "NM", "NV", "OH", "OR", "OH", "partial extract, not a full roster", "full published roster", 5]`

Denominator `all_records` from `vettica-registry-rosters` (all records in the same roster): published counts {"CA": 4744, "OR": 1283, "AZ": 1125, "NM": 1024, "NV": 531, "OH": 87}; threshold 1.

```sql
WITH filtered AS (
  SELECT "registry_state"
  FROM "asset"
  WHERE "registry_state" IN (?, ?, ?, ?, ?, ?)
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "registry_state", COUNT(*) AS "count", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "registry_state"
HAVING COUNT(*) >= ?
```

### Methodology: Records by status class in the six rosters that list more than one status

- **Asset:** Facility records in 14 state veterinary board rosters (status and field flags only) (csv, public_source); owner Vettica.
- **Collection method:** Downloaded or queried the public facility roster of 14 state veterinary boards between 25 and 30 September 2026; raw copies retained, with sha256 recorded for 10 of the 14 files; one row per facility record.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 16026 input; 8794 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 13 of 13 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 "registry_state", "status_class"
  FROM "asset"
  WHERE "registry_state" IN (?, ?, ?, ?, ?, ?)
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "registry_state", "status_class", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "registry_state", "status_class"
HAVING COUNT(*) >= ?
```
Parameters: `["AZ", "CA", "NM", "NV", "OH", "OR", 1]`

### Methodology: Shelter licenses in the New Mexico roster

- **Asset:** Facility records in 14 state veterinary board rosters (status and field flags only) (csv, public_source); owner Vettica.
- **Collection method:** Downloaded or queried the public facility roster of 14 state veterinary boards between 25 and 30 September 2026; raw copies retained, with sha256 recorded for 10 of the 14 files; one row per facility record.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 16026 input; 1024 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 "status_label"
  FROM "asset"
  WHERE "registry_state" = ?
),
rows AS (
  SELECT *,
    CASE "status_label" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "license_kind"
  FROM filtered
)
SELECT "license_kind", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "license_kind"
HAVING COUNT(*) >= ?
```
Parameters: `["NM", "Active (Shelter)", "shelter licenses", "Archived (Shelter)", "shelter licenses", "veterinary facility licenses", 1]`

### Methodology: Kansas roster records that list a city

- **Asset:** Facility records in 14 state veterinary board rosters (status and field flags only) (csv, public_source); owner Vettica.
- **Collection method:** Downloaded or queried the public facility roster of 14 state veterinary boards between 25 and 30 September 2026; raw copies retained, with sha256 recorded for 10 of the 14 files; one row per facility record.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 16026 input; 521 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 1 of 1 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 "has_city"
  FROM "asset"
  WHERE "registry_state" = ?
    AND "has_city" = ?
),
rows AS (
  SELECT *,
    CASE "has_city" WHEN ? THEN ? ELSE ? END AS "city_listed"
  FROM filtered
)
SELECT "city_listed", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "city_listed"
HAVING COUNT(*) >= ?
```
Parameters: `["KS", "1", "1", "list a city", "list no city", 1]`

### Methodology: What each of the 14 state veterinary board rosters publishes

- **Asset:** What 14 state veterinary board facility rosters publish (one row per board) (csv, public_source); owner Vettica.
- **Collection method:** One row per board, documented from the retained roster files and their retrieval metadata (source URL, retrieval date) and from which fields are populated in the loaded rows.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 14 input; 14 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 14 of 14 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 "board", "expiration_date", "file_format", "lapsed_records", "registry_state", "retrieved_on", "roster_scope", "street_address"
  FROM "asset"
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "registry_state", "board", "file_format", "roster_scope", "lapsed_records", "street_address", "expiration_date", "retrieved_on", COUNT(*) AS "boards", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "registry_state", "board", "file_format", "roster_scope", "lapsed_records", "street_address", "expiration_date", "retrieved_on"
HAVING COUNT(*) >= ?
```
Parameters: `[1]`

### Methodology: How the 14 boards publish their rosters

- **Asset:** What 14 state veterinary board facility rosters publish (one row per board) (csv, public_source); owner Vettica.
- **Collection method:** One row per board, documented from the retained roster files and their retrieval metadata (source URL, retrieval date) and from which fields are populated in the loaded rows.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 14 input; 14 after filters and de-duplication.
- **Threshold:** at least 1 source rows per published group; 4 of 4 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 "access_method"
  FROM "asset"
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "access_method", COUNT(*) AS "boards", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "access_method"
HAVING COUNT(*) >= ?
```
Parameters: `[1]`

### Methodology: Boards whose roster lists lapsed, closed or expired records

- **Asset:** What 14 state veterinary board facility rosters publish (one row per board) (csv, public_source); owner Vettica.
- **Collection method:** One row per board, documented from the retained roster files and their retrieval metadata (source URL, retrieval date) and from which fields are populated in the loaded rows.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 14 input; 14 after filters and de-duplication.
- **Threshold:** at least 1 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 "lapsed_records"
  FROM "asset"
),
rows AS (
  SELECT *,
    CASE "lapsed_records" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "lapsed_label"
  FROM filtered
)
SELECT "lapsed_label", COUNT(*) AS "boards", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "lapsed_label"
HAVING COUNT(*) >= ?
```
Parameters: `["published", "list lapsed, closed or expired records alongside current ones", "not published", "list only current or pending records", "no status field", "publish no status for any record", "status scope not recorded", 1]`

### Methodology: Boards whose roster publishes facility street addresses

- **Asset:** What 14 state veterinary board facility rosters publish (one row per board) (csv, public_source); owner Vettica.
- **Collection method:** One row per board, documented from the retained roster files and their retrieval metadata (source URL, retrieval date) and from which fields are populated in the loaded rows.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 14 input; 14 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 "street_address"
  FROM "asset"
),
rows AS (
  SELECT *,
    CASE "street_address" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "street_label"
  FROM filtered
)
SELECT "street_label", COUNT(*) AS "boards", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "street_label"
HAVING COUNT(*) >= ?
```
Parameters: `["published", "publish facility street addresses", "not published", "publish no facility street addresses", "not recorded", 1]`

### Methodology: Boards whose roster publishes license expiration dates

- **Asset:** What 14 state veterinary board facility rosters publish (one row per board) (csv, public_source); owner Vettica.
- **Collection method:** One row per board, documented from the retained roster files and their retrieval metadata (source URL, retrieval date) and from which fields are populated in the loaded rows.
- **As of:** 2026-09-30; cadence quarterly_index; contribution type first_party.
- **Rows:** 14 input; 14 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 "expiration_date"
  FROM "asset"
),
rows AS (
  SELECT *,
    CASE "expiration_date" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "expiry_label"
  FROM filtered
)
SELECT "expiry_label", COUNT(*) AS "boards", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "expiry_label"
HAVING COUNT(*) >= ?
```
Parameters: `["published", "publish license expiration dates", "not published", "publish no license expiration dates", "not recorded", 1]`

