1. Data sources

1.1 Pharmacy locations

The primary source for locations is OpenStreetMap (OSM), queried through the Overpass API with a filter on amenity=pharmacy within Romania's administrative boundaries. OSM data is distributed under the ODbL licence, which allows redistribution and use with attribution — attribution we state explicitly in the footer of every page and in the public GeoJSON endpoint.

OSM data is supplemented with the public store-locators of the main chains (Catena, Dr. Max, Help Net, Dona, Farmacia Tei, Mattca, Spring Farma) — these are a secondary source for opening hours, phone numbers and chain identification. We use them to enrich, not to replace, the OSM coordinates.

1.2 Product prices

Prices come from public online-pharmacy websites. The preferred mechanism is parsing JSON-LD schema.org/Product blocks — a structured format that most retailers publish to ease indexing in Google Shopping. Where JSON-LD is unavailable, we use site-specific HTML parsers (specific CSS selectors).

Chains we currently extract prices from: Catena, Dr. Max (with the Richter sub-brand), Farmacia Tei, Help Net, Dona (when its crawler isn't blocked), Mattca, Spring Farma, plus independent online pharmacies (Minifarm, Farmacia Dav, Farmacia Ardealul) — effective coverage varies over time, depending on the availability of the public feeds.

1.3 Rx references (CANAMED)

For prescription drugs (Rx) we use the CANAMED list as a reference — the maximum retail price approved by the Ministry of Health, published monthly on the ministry's website. CANAMED is not a sale price — it is the cap above which a pharmacy cannot sell. We display it strictly as a benchmark. The list is imported monthly (systemd timer on the VPS).

2. Refresh cadence

3. Data quality

3.1 Product ↔ price matching

The hardest part of a pharmaceutical price comparator is matching: deciding with confidence that „Nurofen 200mg pack of 24" on one site is the same product as „NUROFEN 200 MG 24 FILM-COATED TABLETS" on another site. We use three signals in order of trust:

  1. GTIN / EAN-13 code — when present in JSON-LD, this is a deterministic match.
  2. INN (International Non-proprietary Name) + strength + pharmaceutical form + pack size — used as secondary match.
  3. Normalised brand name + pack size — fallback when the first two are missing.

When two sources disagree on pack size (e.g. one says „24 tabs", the other „24 capsules"), we raise a collision flag: offers stay separate until manual review. We prefer a false negative (two duplicate entries) over a false positive (wrong price displayed under the wrong product).

3.2 Automatic checks

4. Limitations declared openly

The displayed price may differ from the price in the physical pharmacy. The prices we scrape come from chains' online stores — which aren't always in sync with the on-shelf price in a physical store. For purchases, verify directly at the pharmacy.

5. Logo policy

We use chain logos under descriptive fair use — for brand identification in comparison lists and on chain pages. We do not imply endorsement, partnership, or authorisation. If a chain requests takedown at contact@hartafarmacii.ro, we remove the logo within 48h and replace it with a neutral text placeholder.

6. AI policy

HartaFarmacii uses AI only in assistive pipelines, not for publishing auto-generated content without review. Specifically:

7. Conflict of interest

Stated explicitly: zero conflict of interest. We are not affiliated, we don't receive sales commissions, and we don't have contracts with the listed chains. Revenue comes 100% from:

No revenue source conditions price display order or which article appears on the site. If you suspect a conflict, write to us and we'll clarify.

8. How to report an error

Single channel: contact@hartafarmacii.ro

Internal process: we receive the email → confirm in 24h → verify the source (usually back at the original public source) → apply the correction in the database → confirm the result by reply.

9. Versions and lifecycle

This methodology page was last reviewed on 2026-05-01 and is updated whenever we add a new source, change a refresh cadence, or discover a new limitation we want to declare. The full code repository is private but open to audit on request.

Read on: Editorial team · About · Terms · Privacy.