# Childcare & Daycare Licensing Scraper (`spry_frame/childcare-daycare-licensing-scraper`) Actor

Scrapes state childcare/daycare licensing directories — provider name, address, license status, capacity, quality rating, and deficiency counts. Texas is live at launch; more states added over time. No API key required.

- **URL**: https://apify.com/spry\_frame/childcare-daycare-licensing-scraper.md
- **Developed by:** [COSENT GROUP](https://apify.com/spry_frame) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Childcare & Daycare Licensing Scraper

Scrapes state childcare/daycare licensing directories — provider name, address, license
status, capacity, and (where the state publishes it) quality rating and deficiency counts.

Unlike nursing homes (one federal CMS dataset covers all states), childcare licensing has
**no national aggregator** — every state runs its own system. That fragmentation is exactly
why nobody's built this: it's a 50-state grind, not a hard technical problem. This actor uses
a **state-adapter architecture** so coverage grows over time without changing how it's used —
same `state` input either way, more states added as adapters are built.

### Currently supported

| State | Status | Providers | Data freshness | Notes |
|---|---|---|---|---|
| **TX** | ✅ Live | 14,368 | Live/real-time | Real JSON API, no Cloudflare, no login |
| **CA** | ✅ Live | 39,184 | Snapshot dated **2025-05-25** | State open-data (CKAN) mirror — see caveat below |

More states added over time. Request one if you need it.

### No API key required

- **TX**: Texas Health & Human Services Child Care Regulation public search API
  (`childcare.hhs.texas.gov`) — a real POST/JSON endpoint behind an anonymous, auto-issued
  Bearer token.
- **CA**: California's own open-data portal (`data.ca.gov`), CKAN `datastore_search` API,
  combining the Child Care Centers and Family Child Care Homes resources.

No scraping, no browser, no Cloudflare fight for either state.

### ⚠️ California data freshness caveat

California's live facility-search tool (`ccld.dss.ca.gov`) was **down** at build time — the
site itself displayed: *"We are currently experiencing technical difficulties with the
Facility Search and Download Data features... Please try your facility search and/or data
download again later."* Rather than build against a broken tool, this adapter uses
California's official open-data mirror instead, which is unaffected by that outage.

The trade-off: that mirror is a **periodic snapshot, not live**. Every record's
`dataSnapshotDate` field currently reads **2025-05-25** — over a year old as of this build —
even though the CKAN catalog listing itself shows a recent "last touched" timestamp (only the
catalog entry was re-indexed; the underlying data file was not refreshed). This is disclosed
on every CA record via `dataSnapshotDate`, not hidden. If the live CCLD tool comes back up, a
future version could switch to scraping it directly for current data.

Also unlike Texas: CA's open dataset does not include a star rating or deficiency count (CA
does publish inspection reports, just not in this bulk file) — those fields are left blank on
CA records rather than fabricated. Family Child Care Home addresses read `"Unavailable"` by
law (a genuine legal restriction per the CCLD site's own FAQ, not a bug).

### Use Cases

- **Childcare franchise/PE roll-up site selection** — map every licensed provider in a
  target market, filter by capacity
- **M\&A deal sourcing** — find acquisition targets by provider type, license status, capacity
- **Compliance/risk research** (TX) — screen by deficiency count and license status
- **Competitive market mapping** — see the full licensed landscape in a region
- **Historical/baseline research** (CA) — the May 2025 snapshot is still useful for
  market-sizing and baseline mapping even though it isn't current

### Input

| Field | Type | Description |
|-------|------|-------------|
| `state` | String | **Required.** `TX` (live) or `CA` (2025-05-25 snapshot). |
| `providerName` | String | Optional — only return providers whose name contains this text (server-side filter on both states, verified working). |
| `maxResults` | Integer | Maximum providers to return. `0` = no limit (default). Full TX ≈ 14,368; full CA ≈ 39,184. |

**Note:** there is no location/city filter in this version. Texas's underlying API's location
search requires a resolved lat/long + radius (from a client-side geocoder), not a plain city
string — a raw `city` parameter was tested and confirmed to have **no effect** on TX (it
silently returned the full unfiltered statewide set), so it isn't exposed rather than shipping
a filter that quietly does nothing. Pull the full state and filter client-side for now.

### Output

| Field | Description |
|-------|-------------|
| `providerId` | State-assigned provider/facility identifier |
| `providerName` | Facility or home name |
| `providerType` | e.g. Licensed Center (TX) / Day Care Center, Family Day Care Home (CA) |
| `address`, `city`, `state`, `zipCode`, `county` | Location (CA family-home addresses may read "Unavailable" by law) |
| `licenseStatus` | e.g. Full Permit (TX) / Licensed, Closed (CA) |
| `licenseIssueDate` | Date of current license |
| `closedDate` | Closure date, if closed (CA) |
| `capacity` | Total licensed capacity |
| `starRating` | State quality rating — TX only, blank for CA |
| `deficiencyCount` | Citations/deficiencies on record — TX only, blank for CA |
| `agesServed` | Age groups served — TX only |
| `acceptsSubsidy` | Accepts subsidized/voucher care — TX only |
| `licensee` | Licensed owner/operator of record — CA only |
| `dataSnapshotDate` | Snapshot date for non-live states (CA); blank for live states (TX) |
| `phone`, `email` | Contact info, where available |
| `scrapedAt` | Timestamp when the record was collected |

### Example Input

**All Texas providers (live data):**

```json
{ "state": "TX" }
```

**All California providers (2025-05-25 snapshot):**

```json
{ "state": "CA" }
```

**Providers matching a name in either state (e.g. a chain/brand audit):**

```json
{ "state": "CA", "providerName": "KinderCare" }
```

### Notes

- Data sources:
  [Texas Child Care Search](https://childcare.hhs.texas.gov/Public/SearchAndReport) (live),
  [California Community Care Licensing Facilities](https://data.ca.gov/dataset/community-care-licensing-facilities) (open-data snapshot).
- No API key, no rate limit encountered in testing on either state.
- **Real measured runtimes on the Apify platform** (not estimates, not local-only numbers):
  - Full TX run (14,368 providers): **~4 min** — each 2000-row page costs a flat ~30s
    server-side on Texas's end, independent of offset.
  - Full CA run (39,184 providers, both resources): **~8.5 min** — each 5000-row page costs a
    flat ~70–76s, independent of offset or which resource.
  - Both states show the same pattern: **flat per-request latency regardless of payload
    size or pagination offset**, and platform runtimes are 5–8x slower than local runtimes for
    the same request pattern (CA: 93s locally vs. ~8.5 min on-platform for the identical run).
    This points to something in Apify's outbound network path (very possibly Cloudflare
    treating Apify's datacenter IP ranges differently than a residential/local IP) rather than
    a bug in this actor's code — worth the same check for any future state adapter before
    assuming local timing will hold on the platform.

# Actor input Schema

## `state` (type: `string`):

Two-letter US state code. Currently supported: TX (Texas, live), CA (California, open-data snapshot dated 2025-05-25 — see README), NY (New York State excluding NYC, updated daily — see README). More states are added over time as adapters are built.

## `providerName` (type: `string`):

Only return providers whose name contains this text. Leave blank for all.

## `maxResults` (type: `integer`):

Maximum number of providers to return. 0 = no limit (all providers matching the filters).

## Actor input object example

```json
{
  "state": "TX",
  "providerName": "",
  "maxResults": 0
}
```

# Actor output Schema

## `providerName` (type: `string`):

Facility or home name.

## `providerId` (type: `string`):

State-assigned provider ID.

## `providerType` (type: `string`):

Licensed Center, Listed Family Home, Registered Child Care Home, etc.

## `address` (type: `string`):

Full street address.

## `city` (type: `string`):

City.

## `state` (type: `string`):

State.

## `zipCode` (type: `string`):

ZIP code.

## `licenseStatus` (type: `string`):

Issuance type — e.g. Full Permit, Listed, Registered.

## `licenseIssueDate` (type: `string`):

Date the current license/listing was issued.

## `capacity` (type: `string`):

Total licensed capacity.

## `starRating` (type: `string`):

State quality rating, if applicable.

## `deficiencyCount` (type: `string`):

Number of citations/deficiencies on record.

## `agesServed` (type: `string`):

Age groups the provider serves.

## `acceptsSubsidy` (type: `string`):

Whether the provider accepts subsidized/voucher child care.

## `phone` (type: `string`):

Contact phone number.

## `licensee` (type: `string`):

Licensed owner/operator of record (CA only).

## `dataSnapshotDate` (type: `string`):

For states sourced from a periodic open-data file rather than a live system (e.g. CA), the date that snapshot was generated. Blank for live states (e.g. TX, NY).

## `licenseExpirationDate` (type: `string`):

License expiration date, where published (NY only).

## `latitude` (type: `string`):

Geocoordinate, where available (NY only in this version).

## `longitude` (type: `string`):

Geocoordinate, where available (NY only in this version).

## `profileUrl` (type: `string`):

Link to the facility's official state profile page, where published (NY only).

## `scrapedAt` (type: `string`):

ISO timestamp when this record was collected.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("spry_frame/childcare-daycare-licensing-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("spry_frame/childcare-daycare-licensing-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call spry_frame/childcare-daycare-licensing-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,spry_frame/childcare-daycare-licensing-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/asIsXZnhjLmV7PcdL/builds/vmg9ae4Nezf21MvgW/openapi.json
