import {z} from 'zod' export type GetApiApiV1CitiesSlugSolarRoofsArgs = {slug: string}; export type GetApiApiV1CitiesSlugSolarRoofsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const attribution = z.object({text: z.string(), license_url: z.string().nullable().optional(), modified: z.boolean().optional()}); export const cityBaseDataPayload = z.object({kind: z.literal("city_base"), population: z.number().int().nullable().optional(), area_km2: z.number().nullable().optional()}); export const airQualityPayload = z.object({kind: z.literal("air_quality"), station_id: z.string().nullable().optional(), pm10: z.number().nullable().optional(), no2: z.number().nullable().optional(), pm25: z.number().nullable().optional(), o3: z.number().nullable().optional(), so2: z.number().nullable().optional()}); export const weatherPayload = z.object({kind: z.literal("weather"), station_id: z.string().nullable().optional(), temperature_c: z.number().nullable().optional(), humidity: z.number().nullable().optional(), wind_speed: z.number().nullable().optional(), condition: z.string().nullable().optional()}); export const poiPayload = z.object({kind: z.literal("poi"), poi_type: z.string(), count: z.number().int(), total_available: z.number().int().nullable().optional(), truncated: z.boolean().optional(), items: z.array(z.object({})).optional()}); export const trafficEventPayload = z.object({kind: z.literal("traffic_event"), station_id: z.string().nullable().optional(), roadworks: z.array(z.object({})).optional(), warnings: z.array(z.object({})).optional(), roadworks_total: z.number().int().nullable().optional(), roadworks_truncated: z.boolean().optional(), congestion_summary: z.object({}).nullable().optional()}); export const transitStopPayload = z.object({kind: z.literal("transit_stop"), stop_id: z.string(), stop_name: z.string(), location_type: z.number().int().nullable().optional(), parent_station: z.string().nullable().optional(), platform_code: z.string().nullable().optional(), wheelchair_boarding: z.number().int().nullable().optional()}); export const chargingStationPayload = z.object({kind: z.literal("charging_station"), count: z.number().int(), stations: z.array(z.object({})).optional()}); export const waterLevelPayload = z.object({kind: z.literal("water_level"), station: z.string().nullable().optional(), water: z.string().nullable().optional(), value: z.number().nullable().optional(), unit: z.string().nullable().optional()}); export const floodWarningPayload = z.object({kind: z.literal("flood_warning"), warnings: z.array(z.object({})).optional(), as_of: z.string().nullable().optional()}); export const pollenUvPayload = z.object({kind: z.literal("pollen_uv"), region_id: z.number().int().nullable().optional(), region_name: z.string().nullable().optional(), pollen: z.object({}).optional(), uv_index: z.number().nullable().optional()}); export const demographicsPayload = z.object({kind: z.literal("demographics"), population: z.number().int().nullable().optional(), households: z.number().int().nullable().optional(), buildings: z.number().int().nullable().optional(), rent_avg: z.number().nullable().optional(), reference_year: z.number().int().nullable().optional(), series: z.array(z.object({})).optional()}); export const energyAssetPayload = z.object({kind: z.literal("energy_asset"), count: z.number().int(), by_type: z.object({}).optional(), assets: z.array(z.object({})).optional(), total_power_kw: z.number().nullable().optional(), power_by_type: z.object({}).optional()}); export const adminBoundaryPayload = z.object({kind: z.literal("admin_boundary"), ags: z.string().nullable().optional(), gen_name: z.string().nullable().optional(), area_km2: z.number().nullable().optional(), reference_year: z.number().int().nullable().optional()}); export const electionResultPayload = z.object({kind: z.literal("election_result"), election: z.string().nullable().optional(), coverage_granularity: z.string().nullable().optional(), area_name: z.string().nullable().optional(), turnout: z.string().nullable().optional(), results: z.array(z.object({})).optional()}); export const holidayPayload = z.object({kind: z.literal("holiday"), state: z.string().nullable().optional(), year: z.number().int().nullable().optional(), holidays: z.array(z.object({})).optional(), school_holidays: z.array(z.object({})).optional()}); export const hospitalPayload = z.object({kind: z.literal("hospital"), count: z.number().int(), hospitals: z.array(z.object({})).optional(), reference_date: z.string().nullable().optional()}); export const roadEventPayload = z.object({kind: z.literal("road_event"), city_source: z.string().nullable().optional(), events: z.array(z.object({})).optional()}); export const accidentPayload = z.object({kind: z.literal("accident"), reference_year: z.number().int().nullable().optional(), total: z.number().int().nullable().optional(), fatal: z.number().int().nullable().optional(), serious: z.number().int().nullable().optional(), light: z.number().int().nullable().optional(), with_bicycle: z.number().int().nullable().optional(), with_pedestrian: z.number().int().nullable().optional(), with_car: z.number().int().nullable().optional(), with_motorcycle: z.number().int().nullable().optional(), district_key: z.string().nullable().optional()}); export const bathingWaterPayload = z.object({kind: z.literal("bathing_water"), season_year: z.number().int().nullable().optional(), count: z.number().int().optional(), counts: z.object({}).optional(), sites: z.array(z.object({})).optional(), truncated: z.boolean().optional()}); export const bikeParkingPayload = z.object({kind: z.literal("bike_parking"), facility_count: z.number().int().nullable().optional(), spaces_total: z.number().int().nullable().optional(), covered_facilities: z.number().int().nullable().optional(), double_deck_facilities: z.number().int().nullable().optional(), lit_facilities: z.number().int().nullable().optional(), time_limited_facilities: z.number().int().nullable().optional(), bike_and_ride_facilities: z.number().int().nullable().optional(), bike_and_ride_spaces: z.number().int().nullable().optional(), planned_facilities: z.number().int().nullable().optional(), planned_spaces: z.number().int().nullable().optional(), removed_facilities: z.number().int().nullable().optional(), out_of_service_facilities: z.number().int().nullable().optional(), by_type: z.array(z.object({})).optional(), cargo_bike: z.object({}).nullable().optional(), largest_facilities: z.array(z.object({})).optional()}); export const businessRegistrationsPayload = z.object({kind: z.literal("business_registrations"), registrations: z.number().int().nullable().optional(), deregistrations: z.number().int().nullable().optional(), balance: z.number().int().nullable().optional(), year: z.number().int().nullable().optional()}); export const chargingStatusCityPayload = z.object({kind: z.literal("charging_status_city"), total_points: z.number().int().optional(), reported_points: z.number().int().optional(), status_counts: z.record(z.string(), z.number().int()).optional(), points: z.array(z.object({})).optional(), truncated: z.boolean().optional()}); export const chargingStatusPayload = z.object({kind: z.literal("charging_status"), points: z.array(z.object({})).optional()}); export const civilProtectionWarningPayload = z.object({kind: z.literal("civil_protection_warning"), ars: z.string().nullable().optional(), coverage_granularity: z.string().nullable().optional(), count: z.number().int().optional(), warnings: z.array(z.object({})).optional()}); export const countStationPayload = z.object({kind: z.literal("count_station"), counts: z.array(z.object({})).optional()}); export const crimeStatsPayload = z.object({kind: z.literal("crime_stats"), reference_year: z.number().int().nullable().optional(), version: z.string().nullable().optional(), groups: z.array(z.object({})).optional()}); export const districtHeatingPayload = z.object({kind: z.literal("district_heating"), network_area_count: z.number().int().nullable().optional(), supplied_area_km2: z.number().nullable().optional(), operator_count: z.number().int().nullable().optional(), operators: z.array(z.string()).optional(), house_connections: z.number().int().nullable().optional(), network_length_km: z.number().nullable().optional(), networks: z.array(z.object({})).optional(), area_basis: z.string().nullable().optional(), reference_date: z.string().nullable().optional()}); export const eventPayload = z.object({kind: z.literal("event"), city_source: z.string().nullable().optional(), events: z.array(z.object({})).optional()}); export const fireDangerPayload = z.object({kind: z.literal("fire_danger"), wbi_level: z.number().int().nullable().optional(), wbi_label: z.string().nullable().optional(), glfi_level: z.number().int().nullable().optional(), glfi_label: z.string().nullable().optional(), station_name: z.string().nullable().optional(), station_id: z.string().nullable().optional(), federal_state: z.string().nullable().optional(), distance_km: z.number().nullable().optional(), forecast_date: z.string().nullable().optional(), updated_at: z.string().nullable().optional()}); export const fuelPricePayload = z.object({kind: z.literal("fuel_price"), radius_km: z.number().nullable().optional(), station_count: z.number().int().optional(), open_count: z.number().int().optional(), avg_e5: z.number().nullable().optional(), avg_e10: z.number().nullable().optional(), avg_diesel: z.number().nullable().optional(), min_e5: z.number().nullable().optional(), min_e10: z.number().nullable().optional(), min_diesel: z.number().nullable().optional(), stations: z.array(z.object({})).optional()}); export const hospitalAtlasPayload = z.object({kind: z.literal("hospital_atlas"), count: z.number().int().optional(), total_beds: z.number().int().nullable().optional(), truncated: z.boolean().optional(), hospitals: z.array(z.object({})).optional()}); export const indicatorSeriesPayload = z.object({kind: z.literal("indicator_series"), dataset: z.string(), indicator_count: z.number().int().optional(), year_min: z.number().int().nullable().optional(), year_max: z.number().int().nullable().optional(), indicators: z.array(z.object({})).optional()}); export const indicatorsPayload = z.object({kind: z.literal("indicators"), indicator_count: z.number().int().optional(), indicators: z.array(z.object({})).optional()}); export const insolvenciesPayload = z.object({kind: z.literal("insolvencies"), corporate_insolvencies: z.number().int().nullable().optional(), other_debtor_insolvencies: z.number().int().nullable().optional(), year: z.number().int().nullable().optional()}); export const landValuesPayload = z.object({kind: z.literal("land_values"), brw_median_eur_m2: z.number().nullable().optional(), brw_min_eur_m2: z.number().nullable().optional(), brw_max_eur_m2: z.number().nullable().optional(), zone_count: z.number().int().optional(), reference_date: z.string().nullable().optional(), bbox_radius_deg: z.number().nullable().optional(), normalized: z.boolean().optional(), truncated: z.boolean().optional()}); export const mobilityPointPayload = z.object({kind: z.literal("mobility_point"), point_count: z.number().int().nullable().optional(), carsharing_area_count: z.number().int().nullable().optional(), carsharing_spaces: z.number().int().nullable().optional(), points: z.array(z.object({})).optional(), carsharing_areas: z.array(z.object({})).optional()}); export const officeWaitTimesPayload = z.object({kind: z.literal("office_wait_times"), offices: z.array(z.object({})).optional()}); export const parkAndRidePayload = z.object({kind: z.literal("park_and_ride"), car_facility_count: z.number().int().nullable().optional(), car_spaces_total: z.number().int().nullable().optional(), bike_facility_count: z.number().int().nullable().optional(), bike_spaces_total: z.number().int().nullable().optional(), car_facilities: z.array(z.object({})).optional(), bike_facilities: z.array(z.object({})).optional()}); export const parkingOnStreetPayload = z.object({kind: z.literal("parking_onstreet"), segment_count: z.number().int().nullable().optional(), total_spaces: z.number().int().nullable().optional(), zone_count: z.number().int().nullable().optional(), accessible_bay_count: z.number().int().nullable().optional(), accessible_spaces: z.number().int().nullable().optional(), loading_zone_count: z.number().int().nullable().optional(), loading_spaces: z.number().int().nullable().optional(), by_regulation: z.array(z.object({})).optional(), by_street: z.array(z.object({})).optional(), zones: z.array(z.object({})).optional(), accessible_bays: z.array(z.object({})).optional(), loading_zones: z.array(z.object({})).optional()}); export const parkingPayload = z.object({kind: z.literal("parking"), facilities: z.array(z.object({})).optional()}); export const populationDensityPayload = z.object({kind: z.literal("population_density"), population: z.number().int().nullable().optional(), populated_cells: z.number().int().optional(), populated_area_km2: z.number().nullable().optional(), density_per_km2: z.number().nullable().optional(), grid: z.string().optional(), reference_year: z.number().int().optional()}); export const powerPayload = z.object({kind: z.literal("power"), measure: z.enum(["load", "price"]), value: z.number().nullable().optional(), unit: z.string().nullable().optional(), region: z.string().nullable().optional(), series_date: z.string().nullable().optional()}); export const publicTenderPayload = z.object({kind: z.literal("public_tender"), notice_id: z.string(), notice_version: z.string(), release_id: z.string().nullable().optional(), notice_type: z.string().nullable().optional(), status: z.string().nullable().optional(), award_status: z.string().nullable().optional(), title: z.string().nullable().optional(), buyer_name: z.string().nullable().optional(), buyer_city: z.string().nullable().optional(), buyer_postal_code: z.string().nullable().optional(), nuts: z.string().nullable().optional(), cpv: z.string().nullable().optional(), value: z.number().nullable().optional(), currency: z.string().nullable().optional(), publication_date: z.string().nullable().optional(), deadline: z.string().nullable().optional(), award_date: z.string().nullable().optional(), suppliers: z.array(z.string()).optional(), award_value: z.number().nullable().optional(), award_currency: z.string().nullable().optional(), match: z.array(z.string()).optional(), source_url: z.string().nullable().optional()}); export const regionalStatPayload = z.object({kind: z.literal("regional_stat"), dataset: z.string(), reference_year: z.number().int().nullable().optional(), region_name: z.string().nullable().optional(), values: z.object({}).optional()}); export const sharingPayload = z.object({kind: z.literal("sharing"), radius_km: z.number().nullable().optional(), vehicles_available: z.number().int().optional(), free_floating_available: z.number().int().optional(), docked_available: z.number().int().optional(), station_count: z.number().int().optional(), providers: z.array(z.object({})).optional()}); export const solarPayload = z.object({kind: z.literal("solar"), annual_irradiation_kwh_m2: z.number().nullable().optional(), annual_yield_kwh_kwp: z.number().nullable().optional(), optimal_slope_deg: z.number().nullable().optional(), optimal_azimuth_deg: z.number().nullable().optional(), peakpower_kwp: z.number().nullable().optional(), system_loss_pct: z.number().nullable().optional(), total_performance_delta_pct: z.number().nullable().optional(), radiation_db: z.string().nullable().optional(), period_start: z.number().int().nullable().optional(), period_end: z.number().int().nullable().optional(), monthly: z.array(z.object({})).optional()}); export const solarRoofsPayload = z.object({kind: z.literal("solar_roofs"), potential_kwp: z.number().nullable().optional(), potential_yield_mwh: z.number().nullable().optional(), installed_kwp: z.number().nullable().optional(), installed_yield_mwh: z.number().nullable().optional(), exploitation_pct: z.number().nullable().optional(), potential_by_category: z.object({}).optional(), reference_date: z.string().nullable().optional()}); export const stationArrivalsPayload = z.object({kind: z.literal("station_arrivals"), arrival_count: z.number().int().optional(), long_distance_count: z.number().int().optional(), arrivals: z.array(z.object({})).optional()}); export const stationCatalogPayload = z.object({kind: z.literal("station_catalog"), station_count: z.number().int().optional(), stations: z.array(z.object({})).optional()}); export const stationDeparturesPayload = z.object({kind: z.literal("station_departures"), departure_count: z.number().int().optional(), long_distance_count: z.number().int().optional(), departures: z.array(z.object({})).optional()}); export const stationFacilityPayload = z.object({kind: z.literal("station_facilities"), count: z.number().int().optional(), counts: z.object({}).optional(), facilities: z.array(z.object({})).optional(), truncated: z.boolean().optional()}); export const taxRatesPayload = z.object({kind: z.literal("tax_rates"), trade_tax_rate: z.number().int().nullable().optional(), property_tax_a: z.number().int().nullable().optional(), property_tax_b: z.number().int().nullable().optional(), property_tax_c: z.number().int().nullable().optional(), reference_date: z.string().nullable().optional()}); export const trafficFlowPayload = z.object({kind: z.literal("traffic_flow"), station_id: z.string().nullable().optional(), measurements: z.array(z.object({})).optional(), summary: z.object({}).nullable().optional()}); export const transitDeparturePayload = z.object({kind: z.literal("transit_departure"), stop_id: z.string().nullable().optional(), departures: z.array(z.object({})).optional()}); export const transitRouteStatusPayload = z.object({kind: z.literal("transit_route_status"), route_id: z.string().nullable().optional(), active_trips: z.number().int().optional(), avg_delay_s: z.number().nullable().optional(), max_delay_s: z.number().int().nullable().optional(), trips: z.array(z.object({})).optional()}); export const transitTripPayload = z.object({kind: z.literal("transit_trip"), trip_id: z.string(), route_id: z.string().nullable().optional(), delay_s: z.number().int().nullable().optional(), estimated_position: z.object({}).nullable().optional(), stop_time_updates: z.array(z.object({})).optional(), unresolved: z.boolean().optional()}); export const vehicleRegistrationPayload = z.object({kind: z.literal("vehicle_registration"), pkw_total: z.number().int().nullable().optional(), electric_share: z.number().nullable().optional(), bev_share: z.number().nullable().optional(), plugin_hybrid_share: z.number().nullable().optional(), bev_estimated: z.number().int().nullable().optional(), district: z.string().nullable().optional(), district_key: z.string().nullable().optional(), reference_period: z.string().nullable().optional()}); export const weatherWarningPayload = z.object({kind: z.literal("weather_warning"), count: z.number().int().optional(), max_level: z.number().int().nullable().optional(), warnings: z.array(z.object({})).optional(), special_warnings: z.array(z.object({})).optional()}); export const canonicalRecord = z.object({city_slug: z.string(), schema_version: z.number().int(), record_id: z.string(), content_hash: z.string(), ags: z.string().nullable().optional(), wikidata_qid: z.string().nullable().optional(), geo: z.object({lat: z.number().optional(), lon: z.number().optional()}).nullable().optional(), observed_at: z.string().nullable().optional(), retrieved_at: z.string(), source: z.enum(["wikidata", "dwd", "osm", "autobahn", "bnetza", "uba", "delfi", "hvv", "pegelonline", "lhp", "dwd_pollen", "dwd_fire", "eea_bathing", "klinik_atlas", "db_fasta", "genesis", "zensus", "mastr", "smard", "dwd_warnings", "bkg", "bundeswahl", "holidays", "berlin_viz", "hamburg_roadworks", "koeln_road_events", "muenchen_roadworks", "dortmund_roadworks", "rostock_roadworks", "sperrinfosys", "mobidata_bw", "destination_one", "koeln_events", "koeln_traffic_flow", "koeln_roadworks_live", "koeln_incidents_live", "koeln_lez_live", "berlin_traffic_reports", "dortmund_parking", "kiel_counting_stations", "eround_charging", "frankfurt_parking", "wuppertal_parking", "magdeburg_parking", "koeln_parking", "gtfs_rt", "hvv_geofox", "vgn", "rmv", "vrr", "vvs", "hamburg_traffic_situation", "kba", "unfallatlas", "tankerkoenig", "bremen_roadworks", "hannover_traffic_reports", "gbfs", "inkar", "wegweiser", "bka_pks", "db_timetables", "boris", "stada", "regionalstatistik", "solar", "solar_cadastre", "muenchen_parking", "muenchen_bike_counts", "muenchen_parking_onstreet", "muenchen_park_and_ride", "muenchen_mobility_points", "muenchen_bike_parking", "leipzig_bike_counts", "hamburg_bike_counts", "berlin_bike_counts", "stuttgart_bike_counts", "koeln_bike_counts", "essen_bike_counts", "duesseldorf_bike_counts", "parkendd", "heritage", "tree_cadastre", "zensus_grid", "oeffentlichevergabe", "district_heating", "koeln_wait_times", "bbk_nina", "council", "mobidata_parkapi", "pr_hessen_parking", "db_bahnpark", "muenster_parking", "aachen_parking", "oldenburg_parking", "kaiserslautern_parking", "dresden_parking", "karlsruhe_parking", "hamburg_parking"]), license_id: z.enum(["cc0", "cc_by_4_0", "dl_de_by_2_0", "dl_de_zero_2_0", "geonutzv", "odbl", "cc_by_sa_4_0", "ec_reuse", "unknown", "amtliches_werk"]), license_tier: z.enum(["A", "B", "C"]), attribution: attribution, payload: z.discriminatedUnion("kind", [cityBaseDataPayload, airQualityPayload, weatherPayload, poiPayload, trafficEventPayload, transitStopPayload, chargingStationPayload, waterLevelPayload, floodWarningPayload, pollenUvPayload, demographicsPayload, energyAssetPayload, adminBoundaryPayload, electionResultPayload, holidayPayload, hospitalPayload, roadEventPayload, accidentPayload, bathingWaterPayload, bikeParkingPayload, businessRegistrationsPayload, chargingStatusCityPayload, chargingStatusPayload, civilProtectionWarningPayload, countStationPayload, crimeStatsPayload, districtHeatingPayload, eventPayload, fireDangerPayload, fuelPricePayload, hospitalAtlasPayload, indicatorSeriesPayload, indicatorsPayload, insolvenciesPayload, landValuesPayload, mobilityPointPayload, officeWaitTimesPayload, parkAndRidePayload, parkingOnStreetPayload, parkingPayload, populationDensityPayload, powerPayload, publicTenderPayload, regionalStatPayload, sharingPayload, solarPayload, solarRoofsPayload, stationArrivalsPayload, stationCatalogPayload, stationDeparturesPayload, stationFacilityPayload, taxRatesPayload, trafficFlowPayload, transitDeparturePayload, transitRouteStatusPayload, transitTripPayload, vehicleRegistrationPayload, weatherWarningPayload])}); export const meta = z.object({correlation_id: z.string().nullable().optional(), source_status: z.enum(["ok", "no_data", "disabled", "not_ingested", "not_covered"]).optional(), cache_status: z.string().nullable().optional(), covered_cities: z.array(z.string()).optional(), pagination: z.object({total: z.number().int().optional(), returned: z.number().int().optional(), limit: z.number().int().nullable().optional(), offset: z.number().int().optional(), truncated: z.boolean().optional()}).optional()}); export const getApiApiV1CitiesSlugSolarRoofsResponse = z.object({data: canonicalRecord.nullable(), meta: meta}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Dach-Solarkataster je Stadt, föderiert (Tier A) * * GET /api/v1/cities/{slug}/solar-roofs */ export const getApiApiV1CitiesSlugSolarRoofs = async (args: GetApiApiV1CitiesSlugSolarRoofsArgs, options?: GetApiApiV1CitiesSlugSolarRoofsOptions) => { const {baseUrl = "https://infranode.dev", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/cities/${encodeURIComponent(String(args.slug))}/solar-roofs${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiApiV1CitiesSlugSolarRoofsResponse, await res.json()) };