{
  "id": 2346133,
  "title": "Same API standard, four incompatible schemas: scraping state cosmetology license registries",
  "url": "https://urgent.news/2026/08/21/same-api-standard-four-incompatible-schemas-scraping-state",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-21T09:19:27.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/devil_scrapes/same-api-standard-four-incompatible-schemas-scraping-state-cosmetology-license-registries-3md9"
  },
  "original_language": "en",
  "account": "Despite sharing the same Socrata API standard, four states—New York, Connecticut, Colorado, and Texas—have four distinct schemas for their cosmetology license registries. The standard's structure remains unchanged, but the data within it varies significantly.\n\nEach state's licensing information is presented in a single, unified table with unique column names, filter options, and definitions of what constitutes an \"active\" license. Texas does not provide a status column, rendering the active-only filter irrelevant in that state.\n\nA generic Socrata client that assumes one schema will either miss crucial data or crash when encountering states with different column structures. To address this inconsistency, a per-state config object is necessary, mapping each state's real column names to a canonical output row format. The config should include the active-license filter, applicable only where the underlying data supports it.\n\nThe same Socrata query yields different professions across states because cosmetology licenses are embedded within each state's overarching professional-licensing table, alongside professionals from other fields like electricians, dentists, and notaries. Filtering must occur server-side, in SoQL, prior to pagination, or you risk downloading unnecessary rows and paying for storage of irrelevant data.\n\nTexas requires a starts_with() match for three license-type prefixes and an additional wildcard search for establishments. In contrast, Connecticut needs an exact match for six specific credentials. Colorado demands an in() list of four codes to retrieve cosmetology licenses.\n\nThe presence of an active licenses only toggle is irrelevant in Texas due to the absence of a status column in its dataset. While New York, Connecticut, and Colorado each incorporate an active_where clause that is integrated into the query when active-only records are requested, Texas lacks any active_where clause, resulting in no applicable filtering.\n\nOne might expect a single \"licensee name\" column, but Colorado's registry lacks this convenience. Instead, the name must be derived from separate firstname and lastname columns at read time—a task that only applies to Colorado, as every other supported state already provides a unified name field.\n\nSimilarly, New York's address field is divided into two columns (business_address_1 and business_address_2), requiring concatenation for a complete address, while every other state supplies a single address field. The scraping of open-data from these states presents a considerable challenge due to these discrepancies.",
  "summary": "\"Just query the Socrata API\" is true and also useless advice. Socrata SODA is a real open standard — New York, Connecticut, Colorado, and Texas all expose their professional-license registries through the same $limit / $offset / $where query language. The standard ends there. What each state puts inside that standard is four unrelated data models wearing the same protocol. Quick answer Every…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}