Skip to content

The API

The same answers the site gives, as JSON: what each official list printed about a model, on what date, and every change since our record began.

Getting a key

A key comes with the maker plan. For anything else, email hello@n84.dev with what you are building; we answer within a working day. Keys allow 10,000 calls a day.

Send the key on every call:

curl -H "Authorization: Bearer YOUR_KEY" "https://db.n84.dev/v1/lists"

Endpoints

  • GET /v1/lists
    Every list we check: id, name, country, lane, publisher, licence, attribution, when history starts, when last checked and last changed.
  • GET /v1/lookup?code=KA27328
    A line by the code the list prints (ISDE meldcode, MCS number, OZEV reference, TVV). Returns match: exact or none.
  • GET /v1/lookup?brand=Vaillant&model=aroTHERM%20plus%20VWL%2055/6
    A model by name. One clear match returns its listings on every list for that product type, including not_found for lists it is absent from. Several candidates come back as match: several with their ids.
  • GET /v1/models/{id}
    One model: its listings and its full change history.
  • GET /v1/changes?since=2026-10-01
    Changes found on or after a date, newest first. Narrow with list=, lane= (heat-pumps, vehicles, chargepoints, glazing, insulation, solar-water, ventilation), kind= (added, removed, edited). Page with limit= (up to 500) and offset=; next_offset is null on the last page.

What a listing looks like

{
  "list": "uk-bus-heat-pumps",
  "list_name": "Boiler Upgrade Scheme Product Eligibility List",
  "country": "GB",
  "status": "listed",            // listed | removed | not_found
  "code": "KIWA 00044/001 HP",
  "first_seen": "2026-10-12",     // the day our record of it began
  "last_seen": "2026-10-12",
  "removed_on": null,
  "last_checked": "2026-10-12",
  "grade": "A",                   // A: the list's own line; B: joined by maker and model name
  "as_printed": { "brand": "Vaillant Group UK Ltd", "model": "aroTHERM Plus 10kW VWL 105/6 A S2", "Certified Until": "2026-10-26", ... },
  "source": "https://...",        // the official page
  "attribution": "Contains public sector information licensed under the Open Government Licence v3.0.",
  "history_starts": "2026-10-12"
}

Rules

  • status says what the list printed on last_checked. It never says a product is eligible; the official list and the scheme's rules always prevail.
  • Pass the attribution through when you show the data; each list's licence requires it.
  • Errors are JSON with error.code: missing_key, bad_key, daily_limit (429, resets at midnight UTC), bad_request, not_found.
  • Lists we check right now: de-bafa-heat-pumps, es-auto-plus, fr-ev-score, uk-ozev-chargepoints, uk-bus-heat-pumps, uk-zev-grants, nl-isde-glazing, nl-isde-heat-pumps, nl-isde-insulation, nl-isde-solar-boilers, nl-isde-ventilation.
  • No key? The RSS feed carries every change, free.