Boulder CO Restaurant Inspections Scraper: 2013 to Present avatar

Boulder CO Restaurant Inspections Scraper: 2013 to Present

Pricing

from $2.10 / 1,000 inspections

Go to Apify Store
Boulder CO Restaurant Inspections Scraper: 2013 to Present

Boulder CO Restaurant Inspections Scraper: 2013 to Present

Scrape Boulder County, CO restaurant health inspections, 2013 to present (16,000+), from data.colorado.gov: scores, results, violations, inspector comments, address, coordinates. Boulder, Longmont, Lafayette, Louisville. Filter by city, name, date. Live data each run.

Pricing

from $2.10 / 1,000 inspections

Rating

0.0

(0)

Developer

Groundplane Labs

Groundplane Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Categories

Features

Limited permissions

Share

The Boulder County restaurant inspections scraper gives you one row per restaurant inspection (inspector comments grouped) for Boulder County, Colorado, straight from Boulder County via the official State of Colorado open-data portal (data.colorado.gov). No login or coding needed: run it in your browser, on a schedule, or through the Apify API, and export results as JSON, CSV or Excel.

Get restaurant and food facility inspections for Boulder County, Colorado (Boulder, Longmont, Lafayette, Louisville, Niwot, Lyons and more) as clean JSON, CSV or Excel. The data comes from Boulder County through the official State of Colorado open-data portal (data.colorado.gov dataset 6ytb-f2cq, Aug 2025 – present, and historical dataset tuvj-xz3m, Jan 2013 – Aug 2025).

Each run reads data.colorado.gov live, so you get whatever the state has published at that moment. The current file (6ytb-f2cq) covers Aug 2025 to present; as of Oct 23, 2026 its newest inspection is 2026-09-08 (the state refreshed it on Oct 22, 2026, although the portal still lists its update frequency as "Static"). The historical file (tuvj-xz3m) covers Jan 2013 to Aug 2025 (~15,700 inspections). Together: 16,000+ Boulder County restaurant inspections from 2013 to present.

Heads up: by default the actor returns only the current file (Aug 2025 to present), which is fast and light. Full history (includeHistory) is optional and heavy: the source has hundreds of thousands of checklist rows, so enable it only with 1024 MB+ memory and a longer timeout, or the run may time out.

What you get

The source publishes one row per inspector comment. This actor groups them so that each row is one inspection: one facility + inspection type + final inspection date + score + result, with all inspector comments (violations and notes) in a comments list. Rows are sorted newest final inspection first (stable tiebreak on facility ID and :id).

The historical file (2013 – Aug 2025) is published as one row per checklist item; the actor groups those into one row per inspection (facility + date + type) too. Historical rows have a violations list (items marked Out / Out-High / Out-Medium / Out-Low / Full / Half) instead of free-text comments, result is null (not published), plus facilityType and facilityCategory. The dataset field tells you which file each row came from. facilityType and facilityCategory are always present (null for Aug 2025+ rows, which don't publish them).

Linking a facility across both files: the two files use different businessId schemes, so the same facility has two IDs (e.g. PHO KITCHEN BAR & GRILL is FA0003878 in the historical file and FA0001508 in the current one). Use facilityKey instead: the normalized facility name + street address (uppercase, punctuation removed, street suffixes abbreviated such as ROAD → RD, unit/suite words and a trailing unit number dropped, e.g. 1219 ROCK CREEK CIR 1 → 1219 ROCK CREEK CIR; N/S/E/W directionals ignored). Chains keep one key per address, so different locations never merge, e.g. PHO KITCHEN BAR GRILL|2900 BASELINE RD. It's a best-effort match: renamed facilities, or ones whose address is spelled differently, won't link.

Sample output (real run)

{
"businessId": "FA0002280",
"facilityName": "Ladies and Lyons LLC",
"address": "431 MAIN STREET, BLDG A",
"city": "LYONS",
"state": "CO",
"zip": "80540",
"inspectionType": "Routine",
"firstInspectionDate": null,
"finalInspectionDate": "2026-09-08",
"score": 5,
"result": "Pass",
"commentCount": 2,
"comments": [
"6-301.14 Handwashing Signage (C). Missing hand sink signage at sinks. A sign or poster that notifies FOOD EMPLOYEES to wash their hands shall be provided at all HANDW ASHING SINKS used by FOOD EMPLOYEES and shall be clearly visible to FOOD EMPLOYEES. Stickers provided during inspection.",
"7-102.11 Separation-Storage (P). Observed unlabeled chemical spray bottles in the facility. Working containers used for storing poisonous or toxic materials such as cleaners and SANITIZERS taken from bulk supplies shall be clearly and individually identified with the common name of the material. Cor..."
],
"latitude": 40.22469,
"longitude": -105.27066,
"dataset": "6ytb-f2cq (Aug 2025 - present)",
"source": "Boulder County Public Health via data.colorado.gov"
}

Output

One row per inspection, with these fields:

FieldMeaning
businessIdFacility ID in the file the row came from (the two files use different ID schemes)
facilityKeyNormalized facility name + street address; use it to link one facility across both files
facilityNameFacility name as published
addressStreet address as published
cityCity as published (mixed case)
stateState as published
zipZIP code (first 5 digits)
inspectionTypeInspection type as published (Routine, Re-Inspection, historical types in the 2013-2025 file)
firstInspectionDateFirst inspection date; null since the state stopped publishing a separate first-visit date in Oct 2026
finalInspectionDateFinal inspection date (YYYY-MM-DD)
scoreInspection score as published (points; higher means more issues)
resultPublished result (Pass / Reinspection Required / Closure); null for historical rows, which do not publish one
commentCountNumber of inspector comments grouped into this row (2025-present file)
commentsInspector comments / violations as free text (2025-present file)
violationCountNumber of violation items (historical file); null for 2025-present rows
violationsStructured violation items with code, violation, type, status and points (historical file)
facilityTypeFacility type as published (historical file); null for 2025-present rows
facilityCategoryFacility category as published (historical file); null for 2025-present rows
latitudeLatitude from the source geopoint, when published
longitudeLongitude from the source geopoint, when published
datasetWhich source file the row came from (6ytb-f2cq or tuvj-xz3m)
sourceData source label

Labeled canary input (a five-row smoke test of the newest inspections):

{"maxItems": 5}

Use cases

  • Food-safety consultants, pest control and cleaning services: resultContains: "Reinspection" lists facilities that failed and must be re-inspected.
  • Restaurant suppliers and equipment repair: comments mention broken coolers, thermometers, hand sinks.
  • Journalists and researchers: compare scores across Boulder County towns.

How to scrape Boulder County restaurant inspections

  1. Click Try for free (or Start) on this page. A free Apify account is enough.
  2. Leave the prefilled input to get a quick sample, or set the filters described below.
  3. Set maxItems to cap how many rows (and how much) a run returns.
  4. Click Start and wait a few seconds to a minute.
  5. Download the results as JSON, CSV or Excel, or connect them to Google Sheets, Zapier, Make or a webhook.

Input

FieldDescription
inspectedSinceOptional real date, YYYY-MM-DD, applied to the final inspection date. Invalid dates fail fast with a clear message.
citiese.g. BOULDER, LONGMONT (case-insensitive)
nameContainsFacility name text
resultContainsReinspection or Pass (only Aug 2025 – present rows have a result, so this skips history)
includeHistoryDefault off. Turn on to add the ~15,700 inspections from 2013 to Aug 2025. This is optional and heavy: use 1024 MB+ memory and a 30 min+ timeout, or small-memory runs may time out.
maxItemsDefault 200

Pricing (pay per event)

$3 per 1,000 inspections ($0.003 each) plus Apify's minimal $0.00005 start fee. Example: 200 inspections = 200 × $0.003 + $0.00005 ≈ $0.60.

Data caveats

Data is provided as published by Boulder County. The actor reads the source live on every run (newest inspection 2026-09-08 as of Oct 23, 2026). The two files use different formats and scoring checklists, so scores are not directly comparable across them; 2020 has few inspections (COVID). A full 16k+ inspection pull reads ~657k source rows and may take several minutes (default timeout is 1800 s). score is points as published (higher means more issues). finalInspectionDate is the inspection date as published. firstInspectionDate is null because the state stopped publishing a separate first-visit date in Oct 2026. City names are passed through as published (mixed case). Every run ends with a status you can trust: Complete: when all matched inspections were emitted, or PARTIAL: with the concrete reason (for example skipped invalid source rows, or a stale source). The status always names the newest inspection date in the source; when that date is more than 60 days old the run reports PARTIAL for staleness. If a run hits your maxItems or charge cap, the status says so and states how many inspections matched in total where the scan completed.

License and disclaimer

The source dataset is Public Domain (data.colorado.gov). This actor uses only the official public open-data API and is not affiliated with or endorsed by Boulder County, Boulder County Public Health or the State of Colorado.

Changelog

  • 0.2 (2026-11-01): audit hardening, no output changes on healthy data. Core-column checks on both source files fail the run loudly if the source changes shape; rows with unparseable dates or scores are skipped and counted (a run with more than 20 percent invalid rows fails as a source problem, smaller shares end PARTIAL with the count stated); every run ends Complete: or PARTIAL: and names the newest source inspection date, with a staleness PARTIAL past 60 days; fetch retries follow the fleet standard (6 tries, honored Retry-After); dataset schema now declares every output field.
  • 0.1: first release.

FAQ

How much does it cost to scrape Boulder County restaurant inspections?

You pay $0.003 per result ($3 per 1,000) plus a $0.00005 start fee, and nothing else. That is the free-plan price: on paid Apify plans you pay less per result (Bronze 10%, Silver 20%, Gold and above 30% off). Apify's free plan includes $5 of monthly credit, which covers about 1,600 results. See Pricing above for a worked example.

This Actor reads public records from Boulder County via the official State of Colorado open-data portal (data.colorado.gov), using only public endpoints (no login, no CAPTCHA bypass, no private accounts). See the source/license section above for the dataset's terms. You are responsible for how you use the data; this is not legal advice.

How fresh is the data?

Each run reads the source live, so you get whatever the agency has published at that moment. How often the agency updates, and any known lag, is described in the data caveats/notes section above.

Can I use it via API, on a schedule, or with Google Sheets?

Yes. Every Apify Actor has a REST API and client libraries for Python and JavaScript. You can schedule daily or weekly runs, and send results to Google Sheets, Slack, Zapier, Make, n8n, webhooks, or an AI agent via the Apify MCP server.

I need another city, county or field. Can you add it?

Open an issue on the Issues tab with the city or data source you need. We build new public-records scrapers regularly.

More public-records scrapers by Groundplanes

Same clean output, pay-per-result pricing and official public data sources:

Restaurant & food inspections

Code violations & distressed property leads

Business licenses & new business leads