{"openapi":"3.1.0","info":{"title":"Factline","version":"0.1.0","description":"Facts about Dutch addresses and vehicles, compiled from government open data and translated to English. Every figure comes with its source and year.","contact":{"email":"hello@factline.dev"}},"servers":[{"url":"https://factline.dev"}],"paths":{"/v1/home/basic":{"get":{"summary":"Dutch address → building year, floor area, use, neighbourhood headline figures and liveability percentile, in English.","parameters":[{"name":"postcode","in":"query","required":false,"description":"Dutch postcode, 4 digits + 2 letters, e.g. 3511LX","schema":{"type":"string","description":"Dutch postcode, 4 digits + 2 letters, e.g. 3511LX","pattern":"^[1-9][0-9]{3} ?[A-Za-z]{2}$"}},{"name":"house_number","in":"query","required":false,"description":"House number, e.g. 1","schema":{"type":"integer","description":"House number, e.g. 1","minimum":1}},{"name":"house_letter","in":"query","required":false,"description":"Optional house letter, e.g. A","schema":{"type":"string","description":"Optional house letter, e.g. A"}},{"name":"addition","in":"query","required":false,"description":"Optional house number addition, e.g. 2 or BIS","schema":{"type":"string","description":"Optional house number addition, e.g. 2 or BIS"}},{"name":"q","in":"query","required":false,"description":"Alternative to postcode: free-text address, e.g. 'Visschersplein 1 Utrecht'","schema":{"type":"string","description":"Alternative to postcode: free-text address, e.g. 'Visschersplein 1 Utrecht'"}}],"security":[],"responses":{"200":{"description":"Report","content":{"application/json":{"example":{"address":{"label":"Visschersplein 1, 3511LX Utrecht","postcode":"3511LX","city":"Utrecht","lat":52.0896,"lon":5.1191,"neighbourhood":{"code":"BU03440612","name":"Lange Elisabethstraat, Mariaplaats en omgeving"}},"building":{"year_built":1260,"age_years":766,"units_in_building":7,"uses_in_building":["assembly (hospitality, events, worship)","office","residential"],"unit":{"floor_area_m2":72,"use":["residential"],"status":"in use"}},"neighbourhood":{"people":{"data_year":2025,"residents":1790,"households":1300},"housing":{"data_year":2024,"avg_home_value_eur":585000,"owner_occupied_pct":19},"distance_km":{"data_year":2024,"gp_practice":0.7,"supermarket":0.3,"train_station":1.6}},"safety":{"year":2025,"per_1000_residents":{"total":560.3},"national_per_1000_residents":{"total":44.9}},"heritage":{"listed_monuments_within_25m":[{"register_url":"https://monumentenregister.cultureelerfgoed.nl/monumenten/36030","listed_since":"1967-06-20"}],"protected_areas":[{"type":"protected townscape (rijksbeschermd stads- of dorpsgezicht)"}]},"liveability":{"year":2024,"percentile":89,"dimension_percentiles":{"physical_environment":23,"nuisance_and_safety":3,"social_cohesion":8,"amenities":99,"housing_stock":39}}}}}},"400":{"description":"Invalid or unknown address; the message says how to fix the input"},"503":{"description":"An upstream government source is unavailable; you are not charged"}}}},"/v1/home/report":{"get":{"summary":"Full Dutch address report: building, neighbourhood (people, housing, income, energy), distances to 18 amenities, crime vs national rate, listed monuments, liveability breakdown.","parameters":[{"name":"postcode","in":"query","required":false,"description":"Dutch postcode, 4 digits + 2 letters, e.g. 3511LX","schema":{"type":"string","description":"Dutch postcode, 4 digits + 2 letters, e.g. 3511LX","pattern":"^[1-9][0-9]{3} ?[A-Za-z]{2}$"}},{"name":"house_number","in":"query","required":false,"description":"House number, e.g. 1","schema":{"type":"integer","description":"House number, e.g. 1","minimum":1}},{"name":"house_letter","in":"query","required":false,"description":"Optional house letter, e.g. A","schema":{"type":"string","description":"Optional house letter, e.g. A"}},{"name":"addition","in":"query","required":false,"description":"Optional house number addition, e.g. 2 or BIS","schema":{"type":"string","description":"Optional house number addition, e.g. 2 or BIS"}},{"name":"q","in":"query","required":false,"description":"Alternative to postcode: free-text address, e.g. 'Visschersplein 1 Utrecht'","schema":{"type":"string","description":"Alternative to postcode: free-text address, e.g. 'Visschersplein 1 Utrecht'"}}],"responses":{"200":{"description":"Report","content":{"application/json":{"example":{"address":{"label":"Visschersplein 1, 3511LX Utrecht","postcode":"3511LX","city":"Utrecht","lat":52.0896,"lon":5.1191,"neighbourhood":{"code":"BU03440612","name":"Lange Elisabethstraat, Mariaplaats en omgeving"}},"building":{"year_built":1260,"age_years":766,"units_in_building":7,"uses_in_building":["assembly (hospitality, events, worship)","office","residential"],"unit":{"floor_area_m2":72,"use":["residential"],"status":"in use"}},"neighbourhood":{"people":{"data_year":2025,"residents":1790,"households":1300},"housing":{"data_year":2024,"avg_home_value_eur":585000,"owner_occupied_pct":19},"distance_km":{"data_year":2024,"gp_practice":0.7,"supermarket":0.3,"train_station":1.6}},"safety":{"year":2025,"per_1000_residents":{"total":560.3},"national_per_1000_residents":{"total":44.9}},"heritage":{"listed_monuments_within_25m":[{"register_url":"https://monumentenregister.cultureelerfgoed.nl/monumenten/36030","listed_since":"1967-06-20"}],"protected_areas":[{"type":"protected townscape (rijksbeschermd stads- of dorpsgezicht)"}]},"liveability":{"year":2024,"percentile":89,"dimension_percentiles":{"physical_environment":23,"nuisance_and_safety":3,"social_cohesion":8,"amenities":99,"housing_stock":39}}}}}},"400":{"description":"Invalid or unknown address; the message says how to fix the input"},"402":{"description":"Payment required (x402). See the PAYMENT-REQUIRED header."},"503":{"description":"An upstream government source is unavailable; you are not charged"}},"x-payment-info":{"protocol":"x402","price":{"mode":"fixed","currency":"USD","amount":"0.04"},"network":"eip155:8453"}}},"/v1/vehicle/basic":{"get":{"summary":"Dutch licence plate → make, model, age, fuel, APK expiry, insurance, open recall, odometer verdict, risk level.","parameters":[{"name":"licence_plate","in":"query","required":true,"description":"Dutch licence plate, with or without dashes, e.g. GT-722-F","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Vehicle report","content":{"application/json":{"example":{"plate":"GT722F","make":"MAZDA","model":"MAZDA CX-3","vehicle_type":"passenger car","colour":"grey","first_registered":"2015-08-14","age_years":11,"fuel":["petrol"],"euro_class":"EURO 6 W","apk_expiry":"2027-08-14","apk_valid":true,"insured":true,"open_recall":false,"odometer_verdict":"consistent","risk_level":"low","flags":[],"inspections":[{"date":"2026-08-13","type":"periodic APK inspection","valid_until":"2027-08-14","defects":[]}],"recalls":[]}}}},"400":{"description":"Invalid or unknown plate; the message says how to fix the input"},"503":{"description":"RDW is unavailable; you are not charged"}}}},"/v1/vehicle/report":{"get":{"summary":"Full Dutch vehicle report: APK inspection history with defects, recall details, specs, power, CO2, import/taxi/export history, catalogue price, risk flags.","parameters":[{"name":"licence_plate","in":"query","required":true,"description":"Dutch licence plate, with or without dashes, e.g. GT-722-F","schema":{"type":"string"}}],"responses":{"200":{"description":"Vehicle report","content":{"application/json":{"example":{"plate":"GT722F","make":"MAZDA","model":"MAZDA CX-3","vehicle_type":"passenger car","colour":"grey","first_registered":"2015-08-14","age_years":11,"fuel":["petrol"],"euro_class":"EURO 6 W","apk_expiry":"2027-08-14","apk_valid":true,"insured":true,"open_recall":false,"odometer_verdict":"consistent","risk_level":"low","flags":[],"inspections":[{"date":"2026-08-13","type":"periodic APK inspection","valid_until":"2027-08-14","defects":[]}],"recalls":[]}}}},"400":{"description":"Invalid or unknown plate; the message says how to fix the input"},"402":{"description":"Payment required (x402). See the PAYMENT-REQUIRED header."},"503":{"description":"RDW is unavailable; you are not charged"}},"x-payment-info":{"protocol":"x402","price":{"mode":"fixed","currency":"USD","amount":"0.02"},"network":"eip155:8453"}}}}}