About Pharmacy Hours

An independent, reader-supported directory of US pharmacy opening hours, addresses, and holiday schedules.

What this site is

Pharmacist standing in front of shelves stocked with medicine, illustrative stock photo

Pharmacy Hours is a focused reference for one specific question: is my pharmacy open right now, and if not, when? We index opening hours, addresses, and phone numbers for thousands of pharmacies across the United States, including the major chains (CVS, Walgreens, Rite Aid, Walmart Pharmacy, Costco Pharmacy, Kroger family stores, Publix Pharmacy, H-E-B, Albertsons family stores, Target, and Meijer) along with thousands of independent and regional pharmacies.

The site is organized the way Americans actually shop for pharmacy services — by brand, by state, and by city. From the homepage you can drill into any chain to see every state where it operates, then any state to see every city, then any city to see every store. Each store has a dedicated page with a Monday-through-Sunday hours table, the full street address, the store phone number, and a "get directions" link straight to Google Maps.

Where the data comes from

Our primary dataset is the OpenStreetMap (OSM) public mapping project, queried via the Overpass API. OSM is a community-edited geographic database used by everything from outdoor mapping apps to humanitarian aid coordination, and its amenity=pharmacy nodes give us a comprehensive starting point for every pharmacy with a public street presence in the United States. When OSM data is unavailable for a particular store, we supplement with publicly listed information from chain store-locator pages and structured JSON-LD where the chains have already published it openly.

The dataset is refreshed on a periodic cadence and stored as static JSON files on disk. Page templates read those files at request time, which keeps the site fast and predictable — there is no per-request database query, and there is no JavaScript runtime fetching anything in the background. If you view source on any page, what you see is exactly what was rendered server-side at the moment of your request.

National NPPES Pharmacy Registry (added 2026-09)

In September 2026 we added a second, independently-sourced dataset: the CMS NPPES (National Plan & Provider Enumeration System) Full Replacement NPI file, the federal government's master registry of every NPI-registered health-care provider. We filtered it to organisation records (NPPES "Entity Type Code" = 2) carrying Healthcare Provider Taxonomy Code 3336C0003X (Community/Retail Pharmacy) — see the new National NPPES Pharmacy Registry. This is deliberately kept separate from the brand/state/city hours directory described above: the two datasets have different scope, different fields, and were not merged or cross-matched.

Source & licence: download.cms.gov/nppes/NPI_Files.html, "NPPES Data Dissemination V.2 (August 10, 2026)" — the current monthly Full Replacement file at the time of this build, fetched directly over plain HTTPS with no login, key, or click-through terms gate. As a work of the US federal government, this dataset is public domain; the live download page itself carries no separate data-use statement (checked directly, none found), consistent with LICENSE-POLICY's "US-gov public domain" auto-build tier. This is the PII-POLICY v2 amendment (2026-09-11, owner decision E8) in effect: institutional/facility datasets published by a government agency may render the facility's street address and public phone number; the v1 ban on personal address/phone stands for any record keyed to a named individual.

Pipeline: the ~11.6 GB provider CSV was streamed directly out of the official zip (never extracted to disk) and read once, row by row. Of 9,726,865 total provider rows: 7,415,294 are Entity Type 1 (individual) — withheld entirely, no exceptions; 1,959,660 are Entity Type 2 (organisation). Of those, 89,078 carry taxonomy code 3336C0003X on at least one of the file's 15 taxonomy-code columns; 101 of those have a non-blank "NPI Deactivation Date" and were excluded as inactive; the remaining 88,977 active organisation pharmacy records are rendered — every one of them, on the registry pages, with a full-reparse recount confirming exactly 88,977 listing cards were generated.

Fields rendered: legal business name exactly as recorded (original capitalisation kept, not re-cased, to avoid misrepresenting acronyms/legal names), practice-location street address (plus suite/floor line when present), city, state, ZIP, business telephone (blank for 3 of 88,977 records — omitted, never guessed), the NPI number (linked to the public NPI Registry lookup at npiregistry.cms.hhs.gov for independent verification), the bare taxonomy code, and the NPPES "last update" date. Fields withheld: all Entity Type 1 (individual) records; any blank field; the human-readable taxonomy label — no PDF-reading tool was available this build session to verify NPPES's own code-description text, so the bare code is shown rather than an unverified label; no geocoding, reverse-geocoding, or other enrichment.

Edge cases, handled honestly rather than guessed: 24 pairs of city names in the source differ only by punctuation (e.g. "ST. LOUIS" vs "ST LOUIS") — these share one listing page for browsing, but every individual record still shows its own literal city text as recorded. Two records carry the full state name ("TEXAS", "PUERTO RICO") instead of the standard USPS code in the source's state field and are filed under TX/PR respectively (a same-identifier formatting fix, not a guess). One record's state field ("BENGUET", a Philippine province) does not correspond to any US state or territory and is shown, unaltered, on its own Other page rather than being force-fit into a state bucket.

The existing 5,911-location directory above was not touched by this addition. The build notes for this refresh called for joining the existing pages to the new file by NPI. We checked: assets/pharmacies.json, the data file backing all 5,911 existing pages, carries no NPI or any other CMS identifier — only name, address, city, state, ZIP, phone, and a locally-generated URL slug. Per the standing rule that joins must use an exact identifier (never a name/address match), that join is not possible with the data on hand. Zero of the 5,911 existing pages were matched, changed, or delinked; all 5,911 remain exactly as before, still sourced to OpenStreetMap as described above.

Cadence: CMS publishes a new NPPES Full Replacement file monthly. This registry section reflects the August 2026 file only and is not on an automated refresh schedule. Corrections for either dataset go through the same contact page.

How accuracy works

No public dataset of business hours is ever perfect. Stores change hours, relocate, close permanently, and add or drop services without notifying central databases. Three things help here:

  • The phone number is always shown. We never hide the store phone behind a click-through. If you have any doubt about today's hours — especially around a holiday — call.
  • Holidays are flagged separately. The holiday hours guide describes the typical patterns by brand and by holiday. These are the days when published hours and actual hours diverge most often.
  • Corrections are easy. The contact page explains how to flag a mistake. Corrections feed back into the next dataset refresh.

How this site makes money

Pharmacy Hours runs display advertising via Google AdSense. The ad slots appear inline within content sections and in the page footer. We do not accept paid placement for individual pharmacies, do not bias rankings or content based on advertiser relationships, and do not sell or share our visitor data with pharmacy chains. Ad revenue covers hosting, dataset refresh costs, and the occasional cup of coffee for the maintainer.

What this site is not

  • Not a prescription manager. We do not handle refills, transfers, or insurance. Use your pharmacy's app or website for that.
  • Not a medical resource. Hours and contact information only — for clinical questions, talk to a pharmacist or doctor.
  • Not affiliated with any pharmacy chain. Brand names are used purely for identification of publicly known store locations.

Technical notes

The site is built as static HTML — every URL maps to a real page on disk, generated ahead of time from the underlying dataset rather than assembled per-request. There is no client-side router and no JavaScript framework to download. The one exception is the search page, which uses a small vanilla-JavaScript file to filter a bundled JSON index of every listed pharmacy directly in your browser — no server round-trip, no third-party search service. The opening-hours strings follow the OpenStreetMap opening_hours specification, parsed ahead of time into the human-readable schedule you see on each location page. Structured data (schema.org Pharmacy markup) is included on every store page so the listing can be picked up cleanly by search engines and assistants.