HomeMethodology

How we source every price

We don't hide where our numbers come from. Per-vertical: the source, the refresh cadence, the quality gates we run before publishing, and the known limitations. If you cite us, this is the page to bookmark.

📱Product prices (phones, laptops, electronics, home & kitchen)

Source

Direct scrape of Nigerian online retailers — Jumia, Konga, Slot, Kara, PayPorte, Ajebomarket — plus catalog-matching against a canonical SKU database.

Refresh cadence

Daily scrape via GitHub Actions cron. Each store has its own per-store adapter in lib/stores/_base.js.

Quality gates
  • Strip filter removes obvious accessories (cases, chargers, cables) from product feeds where the user query was a primary device.
  • Sanity filter rejects prices below ₦5,000 for high-ticket SKUs to catch the classic 'discount badge' false-positive (e.g. iPhone listed at ₦1,000).
  • Canonical-matching joins variant listings (e.g. 'iPhone 15 128GB Blue' and 'iPhone 15 Blue 128GB') under a single product page.
  • Verified-only filter on rails — only shows products that joined the canonical catalog with ≥1 confirmed brand+model match.
Known limitations
  • Long-tail products (single-store, single-listing) get noindex,follow — the comparison page lacks a real spread to compare.
  • Out-of-stock products still display, marked as such — useful for price-history but not for buy-intent.
  • Some retailer URL structures change quietly; we run weekly diff checks via the /audit pipeline.

💵Foreign exchange (USD, GBP, EUR + 16 others vs NGN)

Source

open.er-api.com (free public market-rate aggregator). Mid-market reference cross-checked against the European Central Bank reference rate. Parallel-market angle reflected via P2P sources where available.

Refresh cadence

Live API on every page load (15-min in-memory cache). Disk file refreshed hourly via the fx-warmer GH Actions cron, which commits data/fx-latest.json — this enables day-over-day delta computation.

Quality gates
  • Inverted at fetch time (upstream returns NGN-base; we surface NGN-per-unit which is how Nigerians actually think).
  • Two-day persistence (current + previous) so delta vs yesterday is always computable, even on cold starts after the day has rolled over.
  • Disk fallback path: if the live upstream fails AND in-process cache is cold, we serve last-good rates with a stale flag rather than 502.
Known limitations
  • Surfaces the MARKET rate, not the CBN official window — those can differ during managed-rate periods.
  • Currencies beyond the pinned 19 are fetched but not surfaced in the headline UI.

Petrol & diesel pump prices (national + 36 states + FCT)

Source

Nigerian Bureau of Statistics 'Premium Motor Spirit Price Watch' monthly bulletin, with state-level cross-checks against NNPC and IPMAN press releases.

Refresh cadence

Monthly. Refreshed manually after each NBS publication. A weekly freshness-check cron alerts us if the file is >30 days old.

Quality gates
  • NBS bulletin is the authoritative source; we don't average across our own scrape and government data.
  • Staleness badge appears in the UI when data is >30 days old, with explicit copy: 'data is N days old, verify on NNPC bulletins for time-sensitive decisions'.
Known limitations
  • Per-station spot prices vary; NBS publishes the state-level average.
  • Subsidy reversals and government-mandated price changes can lag by 1-2 weeks between announcement and NBS publication.

/how-much bands (cement, rice, garri, generators, rent, tokunbo cars, MTN data, etc.)

Source

Median of live Jiji.ng listings, scraped with a per-vertical sanity range (e.g. 'bag of rice' constrained to ₦20K-₦150K to filter out 1kg-bag noise and bulk-pallet outliers). For categories with too few listings, falls back to hand-curated market-range estimates labelled clearly as such.

Refresh cadence

Weekly Jiji scrape via GH Actions cron. Hand-curated bands updated quarterly.

Quality gates
  • Minimum 3 listings to compute a band. Below that, we skip the vertical for the week.
  • QUALITY GATE: rejects 'collapsed' bands where 25th-percentile equals 75th-percentile across N≥10 listings (statistically implausible, traceable to scrape errors that grab a single promo tier).
  • Source field labelled 'jiji' (real listings) vs 'estimate' (hand-curated) so the UI can show 'Median of 12 Jiji listings' vs 'Typical market range estimate' honestly.
  • Variant segmentation for commodities (cement brands, iron-rod grades, tokunbo car years) so 'bag of cement' shows the Dangote vs BUA spread instead of one misleading mid number.
Known limitations
  • Jiji listings can include occasional ringer prices; the median absorbs single outliers but not coordinated noise.
  • Below 15 listings, confidence is flagged as 'low' on the page.

🚌Interstate bus fares

Source

Direct scrape of carrier sites — GIGM has live scraping (49 routes); ABC, Cross Country, God Is Good, Peace Mass, Chisco are deep-linked.

Refresh cadence

Weekly scrape via GH Actions cron. Fare floor sanity gate set to ₦5,000 after early scrapes captured a false-positive ₦1,000 from a discount-badge match.

Quality gates
  • Per-carrier byCarrier breakdown shows the cheapest fare across all scraped carriers for a route.
  • Sanity floor rejects fares below ₦5,000 (no real interstate route is that cheap).
Known limitations
  • Only GIGM is live-scraped today; other carriers route to their booking page.
  • Promotional fares aren't always tagged as such by the carriers, so a one-off discount can show as the headline price for ~24h.

🎓Nigerian university school fees

Source

Each university's published 2024/2025 admission notice. Federal cluster: ₦16K–₦200K. State cluster: ₦80K–₦450K. Private cluster: ₦800K–₦5.5M+ depending on programme.

Refresh cadence

Annually, pre-admission cycle (typically May-August).

Quality gates
  • Per-school link to the official admissions site so the user can verify the current cycle.
  • Range shows lowest programme (typically Arts) to highest (typically Medicine, Engineering, Law).
Known limitations
  • International student fees can be 2-5× higher; not shown here (out of scope for typical NG parent query).
  • Accommodation and acceptance fees are included in the range; pure tuition can be much lower (UNILAG ₦16K).

Electricity tariffs by DisCo + band

Source

NERC Multi-Year Tariff Order (MYTO) and individual DisCo customer tariff notices. 11 DisCos × 5 bands.

Refresh cadence

Quarterly NERC reviews; we refresh after each MYTO revision.

Quality gates
  • Band classification (A: 20+ hours, B: 16-20h, C: 12-16h, D: 8-12h, E: <8h) matches NERC's published rubric.
  • Per-DisCo service area listed alongside the rate so the user knows which DisCo they're under.
Known limitations
  • Bands can change per-feeder mid-cycle; always check your specific bill for the rate tied to your feeder.
  • Pre-paid and post-paid rates are identical within a band; the difference is timing not amount.

💸Diaspora-to-Nigeria remittance

Source

Each provider's public send calculator on a £/$/€500 send amount, verified against the in-app receive amount. Mid-market reference from European Central Bank.

Refresh cadence

Weekly.

Quality gates
  • Effective rate = the actual NGN received per source unit after fee + FX margin.
  • Sort by NGN received (best first), highlighted top row.
  • First-transfer promotional rates excluded — we quote the standard published rate.
Known limitations
  • Rates shift intraday on most providers; verify in-app before sending large amounts.
  • First-transfer promos can temporarily change the leaderboard.

📈Inflation calculator (₦X then = ₦Y today)

Source

Hand-curated historical anchor points compiled from NBS Selected Food Prices, CBN statistical releases, AbokiFX archives, NERC MYTO documents, PropertyPro H1 reports, Dangote published cement prices, and MTN/Glo/Airtel published tariff notices. Anchors go back to Jan 2020 across 9 series.

Refresh cadence

Anchors updated when new published figures land. Daily snapshot archive (started 2026-05-23) progressively layers organic data points on top.

Quality gates
  • Linear interpolation between bracketing anchors. Honest about the approximation — actual prices don't move in straight lines.
  • Each anchor labelled with its source. Recoverable from public documents named on the page.
  • No extrapolation before the earliest anchor.
Known limitations
  • FX rates here are parallel-market / market-rate equivalents, not the official CBN window.
  • Cement uses Dangote's ex-factory price (market-leader benchmark) — other brands sit ~5-10% below.

🗄️Daily price-history archive

Source

End-of-day compact snapshot of every series PriceRadar tracks: FX (19 currencies), petrol (national + 37 states), diesel, 78 /how-much bands, 50 bus routes. ~186 series per day, ~5KB per file.

Refresh cadence

Daily at 23:55 UTC. Files are NEVER deleted.

Quality gates
  • Refuses to write a snapshot if fewer than 5 series resolved (catches silent data-file regressions).
  • Manifest file tracks earliest + latest + count of days archived.
Known limitations
  • Started 2026-05-23. Pre-archive data is anchor-only (see Inflation methodology).

Governance

Public mistakes log: when we get a number wrong, we say so. Spot one? Email us — we'll publish the correction in the next weekly digest.

License: our datasets at /data are released under CC BY 4.0. Free to use commercially, academically, journalistically — with attribution.

Open scrapers: the scrape pipelines live in the public repo at lib/. When you see a price you can't recover from a published source, the scraper that produced it is auditable.

Watchdogs: a freshness-check workflow runs weekly and fails loudly when any tracked data file is overdue. If you ever see a stale number on the site without a staleness badge, the watchdog has dropped — please flag.