{"info":{"version":"1.1.0","description":"PV yield (/api/v1/pv-yield): annual and monthly specific yield, plane-of-array irradiation, the local optimum and the orientation factor, from a precomputed dataset (PVGIS 5.3 monthly irradiation per ≈ 25 km cell, transposed with Numsolar solar-core poa v2), interpolated bilinearly in space and angle. Compass azimuth (0 = N, 90 = E, 180 = S, 270 = W; PVGIS aspect = azimuth − 180); tilt 0 = flat. 14 % system loss by default, free horizon. Keyless: 60 requests/min per IP (10/min for /matrix); an x-api-key raises that to 600/min. Contains PVGIS 5.3 data © European Union, 2001–2026 (CC BY 4.0), transposed with Numsolar solar-core poa v2. Simulation (/api/v1/simulation): one year of hourly energy flows, costs and battery dispatch (self_consumption, arbitrage, peak_shaving, combined; day-ahead greedy) from your PV and use series, CPU only. Keyless: 10 requests and 50 cells/min per IP (/battery-strategies costs sizes × strategies cells, at most 25); an x-api-key raises that to 100 requests and 500 cells/min.","title":"Numsolar solar & simulation API","summary":"Instant PV specific yield (kWh/kWp) for any point in Sweden × tilt × azimuth, and hourly energy, cost and battery-strategy simulations.","license":{"name":"Data: CC BY 4.0 (contains PVGIS data © European Union)","url":"https://creativecommons.org/licenses/by/4.0/"}},"components":{"parameters":{"lat":{"in":"query","name":"lat","description":"Latitude, decimal degrees (WGS84).","required":true,"schema":{"maximum":90,"type":"number","minimum":-90}},"lng":{"in":"query","name":"lng","description":"Longitude, decimal degrees (WGS84).","required":true,"schema":{"maximum":180,"type":"number","minimum":-180}},"tilt":{"in":"query","name":"tilt","description":"Panel tilt in degrees: 0 = flat, 90 = vertical.","required":true,"schema":{"maximum":90,"type":"number","minimum":0}},"azimuth":{"in":"query","name":"azimuth","description":"Compass azimuth the panel faces: 0 = N, 90 = E, 180 = S, 270 = W.","required":true,"schema":{"maximum":360,"type":"number","minimum":0}},"kwp":{"in":"query","name":"kwp","description":"Installed DC peak power; adds annual_kwh / monthly_kwh.","required":false,"schema":{"maximum":10000,"type":"number","minimum":0}},"system_loss":{"in":"query","name":"system_loss","description":"System loss fraction (default 0.14). Exact linear factor (1 − loss)/0.86.","required":false,"schema":{"maximum":0.6,"type":"number","minimum":0}},"shading":{"in":"query","name":"shading","description":"Shading multiplier, 1 = unshaded (default 1).","required":false,"schema":{"maximum":1,"type":"number","minimum":0}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_parameter","outside_coverage","not_supported","rate_limited","invalid_api_key","dataset_unavailable","prices_unavailable","busy","invalid_json","body_too_large"]},"message":{"type":"string"},"field":{"type":"string"}}}}},"PvYield":{"type":"object","required":["annual_kwh_kwp","monthly_kwh_kwp","poa_annual_kwh_m2","optimal","orientation_factor","cell"],"properties":{"input":{"type":"object"},"model":{"type":"object","properties":{"albedo":{"type":"number"},"poa_model":{"type":"string","description":"solar-core plane-of-array model"},"sky_model":{"type":"string","enum":["isotropic","hay_davies"],"description":"diffuse sky model the dataset was built with (Hay–Davies for se-2026.10)"},"anchor_scale":{"type":"number"},"representative_days":{"type":"integer"},"steps_per_day":{"type":"integer"},"horizon":{"type":"string"},"system_loss_default":{"type":"number"}}},"dataset":{"type":"object","properties":{"version":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"coverage":{"type":"string"},"radiation_db":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"grid_deg":{"type":"array","items":{"type":"number"}}}},"annual_kwh_kwp":{"type":"number","description":"kWh per kWp installed, per year"},"cell":{"type":"object","properties":{"interpolation":{"type":"string","enum":["bilinear","inverse_distance"]},"lat":{"type":"number"},"lng":{"type":"number"},"radiation_db":{"type":"string","enum":["PVGIS-SARAH3","PVGIS-ERA5"]},"era5_corrected":{"type":"boolean"},"elevation_m":{"type":"number"},"grid_deg":{"type":"array","items":{"type":"number"}}}},"orientation_factor":{"type":"number","description":"annual / optimal annual, 0..1"},"attribution":{"type":"string"},"annual_kwh":{"type":"number","description":"only when kwp is given"},"monthly_kwh":{"type":"array","description":"only when kwp is given","items":{"type":"number"},"maxItems":12,"minItems":12},"optimal":{"type":"object","properties":{"tilt_deg":{"type":"integer"},"azimuth_deg":{"type":"integer"},"annual_kwh_kwp":{"type":"number"}}},"ghi_annual_kwh_m2":{"type":"number","description":"horizontal irradiation, kWh/m² per year"},"monthly_kwh_kwp":{"type":"array","description":"January … December","items":{"type":"number"},"maxItems":12,"minItems":12},"poa_annual_kwh_m2":{"type":"number","description":"plane-of-array irradiation, kWh/m² per year"}}},"PvYieldBatchRequest":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["lat","lng","tilt","azimuth"],"properties":{"id":{"type":["string","integer"]},"lat":{"type":"number"},"lng":{"type":"number"},"tilt":{"type":"number"},"azimuth":{"type":"number"},"kwp":{"type":"number"},"system_loss":{"type":"number"},"shading":{"type":"number"}}},"maxItems":50,"minItems":1}}},"PvYieldBatchResponse":{"type":"object","properties":{"results":{"type":"array","items":{"oneOf":[{"allOf":[{"$ref":"#/components/schemas/PvYield"},{"type":"object","properties":{"id":{},"ok":{"const":true}}}]},{"type":"object","properties":{"error":{"$ref":"#/components/schemas/Error"},"id":{},"ok":{"const":false}}}]}},"dataset":{"type":"object","properties":{"version":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"coverage":{"type":"string"},"radiation_db":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"grid_deg":{"type":"array","items":{"type":"number"}}}},"attribution":{"type":"string"}}},"PvYieldMatrix":{"type":"object","properties":{"input":{"type":"object"},"model":{"type":"object","properties":{"albedo":{"type":"number"},"poa_model":{"type":"string","description":"solar-core plane-of-array model"},"sky_model":{"type":"string","enum":["isotropic","hay_davies"],"description":"diffuse sky model the dataset was built with (Hay–Davies for se-2026.10)"},"anchor_scale":{"type":"number"},"representative_days":{"type":"integer"},"steps_per_day":{"type":"integer"},"horizon":{"type":"string"},"system_loss_default":{"type":"number"}}},"dataset":{"type":"object","properties":{"version":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"coverage":{"type":"string"},"radiation_db":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"grid_deg":{"type":"array","items":{"type":"number"}}}},"annual_kwh_kwp":{"type":"array","description":"rows = tilts, columns = azimuths","items":{"type":"array","items":{"type":"number"}}},"cell":{"type":"object","properties":{"interpolation":{"type":"string","enum":["bilinear","inverse_distance"]},"lat":{"type":"number"},"lng":{"type":"number"},"radiation_db":{"type":"string","enum":["PVGIS-SARAH3","PVGIS-ERA5"]},"era5_corrected":{"type":"boolean"},"elevation_m":{"type":"number"},"grid_deg":{"type":"array","items":{"type":"number"}}}},"attribution":{"type":"string"},"optimal":{"type":"object","properties":{"tilt_deg":{"type":"integer"},"azimuth_deg":{"type":"integer"},"annual_kwh_kwp":{"type":"number"}}},"azimuths_deg":{"type":"array","items":{"type":"integer"}},"tilts_deg":{"type":"array","items":{"type":"integer"}}}},"PvYieldMeta":{"type":"object","properties":{"coverage":{"type":"object"},"accuracy":{"type":"object"},"limits":{"type":"object"},"docs_url":{"type":"string"},"dataset":{"type":"object","properties":{"version":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"coverage":{"type":"string"},"radiation_db":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"grid_deg":{"type":"array","items":{"type":"number"}}}},"attribution":{"type":"string"},"angles":{"type":"object"},"openapi_url":{"type":"string"}}},"BatteryStrategiesRequest":{"allOf":[{"type":"object","required":["pv"],"properties":{"location":{"type":"object","required":["lat","lng"],"properties":{"zone":{"type":"string","enum":["SE1","SE2","SE3","SE4"],"description":"Swedish price area; derived from lat/lng inside Sweden"},"lat":{"type":"number"},"lng":{"type":"number"}}},"consumption":{"type":"object","description":"The household model (default 15 000 kWh/yr) or hourly_kwh (the whole load)","properties":{"ev_km_per_day":{"maximum":300,"type":"integer","minimum":0},"yearly_kwh":{"type":"number"},"hourly_kwh":{"type":"array","items":{"type":"number"},"maxItems":8760,"minItems":8760}}},"battery":{"type":"object","required":["capacity_kwh"],"properties":{"priority":{"type":"array","items":{"type":"string"}},"strategy":{"type":"string","enum":["self_consumption","arbitrage","peak_shaving","combined"]},"soc_min":{"type":"number","description":"default 0.1"},"soc_max":{"type":"number","description":"default 1.0"},"round_trip_efficiency":{"type":"number","description":"default 0.9"},"peak_target_kw":{"type":["number","null"]},"capacity_kwh":{"type":"number"},"power_kw":{"type":"number","description":"default capacity × 0.5"},"frequency_reserve":{"description":"An electricity provider's battery program (off by default: the battery stays private)","oneOf":[{"type":"null"},{"type":"object","required":["program"],"properties":{"program":{"type":"string","enum":["flower"]}}},{"type":"object","required":["provider","terms"],"properties":{"terms":{"type":"object","properties":{"basis":{"type":"string","enum":["installed","reserved"]},"reserved_capacity_share":{"type":"number"},"reserved_power_share":{"type":"number"},"fixed_sek_per_month":{"type":"number"},"sek_per_kwh_capacity_per_year":{"type":"number"},"sek_per_kw_per_year":{"type":"number"}}},"source_url":{"type":"string"},"provider":{"type":"string"},"as_of":{"type":"string","format":"date"}}}]},"arbitrage_min_spread_sek_per_kwh":{"type":"number","description":"default 0.2"}}},"prices":{"type":"object","description":"Default {\"preset\": \"se_spot\"} (the zone's month × hour spot profile with the Swedish grid fee, energy tax and VAT), or import/export prices.","properties":{"preset":{"type":"string","enum":["se_spot"]},"peak_charge_sek_per_kw_month":{"type":"number","description":"power charge on each month's peak hour"},"monthly_fee_sek":{"type":"number"},"export_sek_per_kwh":{"description":"SEK per kWh: your full price (incl. fees and VAT for the import)","oneOf":[{"type":"number"},{"type":"array","description":"12 months × 24 clock hours","items":{"type":"array","items":{"type":"number"},"maxItems":24,"minItems":24},"maxItems":12,"minItems":12},{"type":"array","description":"averaged per month × clock hour by the engine","items":{"type":"number"},"maxItems":8760,"minItems":8760}]},"import_sek_per_kwh":{"description":"SEK per kWh: your full price (incl. fees and VAT for the import)","oneOf":[{"type":"number"},{"type":"array","description":"12 months × 24 clock hours","items":{"type":"array","items":{"type":"number"},"maxItems":24,"minItems":24},"maxItems":12,"minItems":12},{"type":"array","description":"averaged per month × clock hour by the engine","items":{"type":"number"},"maxItems":8760,"minItems":8760}]}}},"pv":{"type":"object","description":"One of hourly_kwh (8 760 values, Jan 1 00:00 first) or monthly_profile (one typical day per month). faces → 422 not_supported (follow-up F1).","properties":{"faces":{"type":"array","description":"not supported yet (F1)","items":{"type":"object"}},"monthly_profile":{"type":"array","items":{"type":"array","items":{"type":"number"},"maxItems":24,"minItems":24},"maxItems":12,"minItems":12},"hourly_kwh":{"type":"array","items":{"type":"number"},"maxItems":8760,"minItems":8760}}}}},{"type":"object","properties":{"compare":{"type":"object","properties":{"strategies":{"type":"array","items":{"type":"string","enum":["self_consumption","arbitrage","peak_shaving","combined"]}},"sizes_kwh":{"type":"array","description":"default [0, 5, 10, 15, 20]","items":{"type":"number"}},"cost_sek_by_size":{"type":"object","description":"the battery's cost per size, e.g. {\"10\": 85000}: adds best.by_payback","additionalProperties":{"type":"number"}}}}}}]},"BatteryStrategiesResponse":{"type":"object","required":["input","matrix","best","model","attribution"],"properties":{"input":{"type":"object"},"best":{"type":"object","properties":{"by_payback":{"type":["object","null"]},"by_size":{"type":"array","items":{"type":"object"}},"by_total_benefit":{"type":["object","null"]}}},"model":{"type":"object","properties":{"dispatch":{"const":"day_ahead_greedy","type":"string"},"engine":{"type":"string"},"prices":{"type":"string","enum":["month_x_hour_profile","flat"]},"ageing":{"type":"string"},"battery_start":{"type":"string"},"horizon_hours":{"type":"integer"},"price_profile_window_days":{"type":"integer"},"prices_note":{"type":"string","description":"only for 8 760-hour caller prices"},"simulated_days":{"const":365,"type":"integer"},"simulated_year":{"type":"integer","description":"the calendar the run uses (non-leap)"},"spot_profile_refreshed_at":{"type":"string","format":"date-time"},"spot_source":{"type":"string"},"time_step":{"const":"hourly","type":"string"}}},"matrix":{"type":"array","items":{"type":"object","properties":{"strategy":{"type":"string","enum":["self_consumption","arbitrage","peak_shaving","combined"]},"cycles":{"type":"number"},"size_kwh":{"type":"number"},"grid_charged_kwh":{"type":"number"},"savings_sek":{"type":"number"},"total_yearly_benefit_sek":{"type":"number","description":"the whole system's savings (PV + battery) + the battery program's income"},"battery_savings_sek":{"type":"number"},"best_for_size":{"type":"boolean"},"frequency_reserve_net_sek":{"type":"number"}}}},"attribution":{"type":"string"}}},"SimulationRequest":{"type":"object","required":["pv"],"properties":{"location":{"type":"object","required":["lat","lng"],"properties":{"zone":{"type":"string","enum":["SE1","SE2","SE3","SE4"],"description":"Swedish price area; derived from lat/lng inside Sweden"},"lat":{"type":"number"},"lng":{"type":"number"}}},"consumption":{"type":"object","description":"The household model (default 15 000 kWh/yr) or hourly_kwh (the whole load)","properties":{"ev_km_per_day":{"maximum":300,"type":"integer","minimum":0},"yearly_kwh":{"type":"number"},"hourly_kwh":{"type":"array","items":{"type":"number"},"maxItems":8760,"minItems":8760}}},"battery":{"type":"object","required":["capacity_kwh"],"properties":{"priority":{"type":"array","items":{"type":"string"}},"strategy":{"type":"string","enum":["self_consumption","arbitrage","peak_shaving","combined"]},"soc_min":{"type":"number","description":"default 0.1"},"soc_max":{"type":"number","description":"default 1.0"},"round_trip_efficiency":{"type":"number","description":"default 0.9"},"peak_target_kw":{"type":["number","null"]},"capacity_kwh":{"type":"number"},"power_kw":{"type":"number","description":"default capacity × 0.5"},"frequency_reserve":{"description":"An electricity provider's battery program (off by default: the battery stays private)","oneOf":[{"type":"null"},{"type":"object","required":["program"],"properties":{"program":{"type":"string","enum":["flower"]}}},{"type":"object","required":["provider","terms"],"properties":{"terms":{"type":"object","properties":{"basis":{"type":"string","enum":["installed","reserved"]},"reserved_capacity_share":{"type":"number"},"reserved_power_share":{"type":"number"},"fixed_sek_per_month":{"type":"number"},"sek_per_kwh_capacity_per_year":{"type":"number"},"sek_per_kw_per_year":{"type":"number"}}},"source_url":{"type":"string"},"provider":{"type":"string"},"as_of":{"type":"string","format":"date"}}}]},"arbitrage_min_spread_sek_per_kwh":{"type":"number","description":"default 0.2"}}},"prices":{"type":"object","description":"Default {\"preset\": \"se_spot\"} (the zone's month × hour spot profile with the Swedish grid fee, energy tax and VAT), or import/export prices.","properties":{"preset":{"type":"string","enum":["se_spot"]},"peak_charge_sek_per_kw_month":{"type":"number","description":"power charge on each month's peak hour"},"monthly_fee_sek":{"type":"number"},"export_sek_per_kwh":{"description":"SEK per kWh: your full price (incl. fees and VAT for the import)","oneOf":[{"type":"number"},{"type":"array","description":"12 months × 24 clock hours","items":{"type":"array","items":{"type":"number"},"maxItems":24,"minItems":24},"maxItems":12,"minItems":12},{"type":"array","description":"averaged per month × clock hour by the engine","items":{"type":"number"},"maxItems":8760,"minItems":8760}]},"import_sek_per_kwh":{"description":"SEK per kWh: your full price (incl. fees and VAT for the import)","oneOf":[{"type":"number"},{"type":"array","description":"12 months × 24 clock hours","items":{"type":"array","items":{"type":"number"},"maxItems":24,"minItems":24},"maxItems":12,"minItems":12},{"type":"array","description":"averaged per month × clock hour by the engine","items":{"type":"number"},"maxItems":8760,"minItems":8760}]}}},"pv":{"type":"object","description":"One of hourly_kwh (8 760 values, Jan 1 00:00 first) or monthly_profile (one typical day per month). faces → 422 not_supported (follow-up F1).","properties":{"faces":{"type":"array","description":"not supported yet (F1)","items":{"type":"object"}},"monthly_profile":{"type":"array","items":{"type":"array","items":{"type":"number"},"maxItems":24,"minItems":24},"maxItems":12,"minItems":12},"hourly_kwh":{"type":"array","items":{"type":"number"},"maxItems":8760,"minItems":8760}}}}},"SimulationResponse":{"type":"object","required":["input","yearly","monthly","model","attribution"],"properties":{"input":{"type":"object"},"model":{"type":"object","properties":{"dispatch":{"const":"day_ahead_greedy","type":"string"},"engine":{"type":"string"},"prices":{"type":"string","enum":["month_x_hour_profile","flat"]},"ageing":{"type":"string"},"battery_start":{"type":"string"},"horizon_hours":{"type":"integer"},"price_profile_window_days":{"type":"integer"},"prices_note":{"type":"string","description":"only for 8 760-hour caller prices"},"simulated_days":{"const":365,"type":"integer"},"simulated_year":{"type":"integer","description":"the calendar the run uses (non-leap)"},"spot_profile_refreshed_at":{"type":"string","format":"date-time"},"spot_source":{"type":"string"},"time_step":{"const":"hourly","type":"string"}}},"monthly":{"type":"object","properties":{"peak_kw":{"description":"only with a power charge","oneOf":[{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},{"type":"null"}]},"grid_charged_kwh":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"consumed_kwh":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"exported_kwh":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"imported_kwh":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"produced_kwh":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"cost_with_system_sek":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"cost_without_system_sek":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12},"battery_throughput_kwh":{"type":"array","items":{"type":"number"},"maxItems":12,"minItems":12}}},"yearly":{"type":"object","properties":{"battery":{"type":"object","properties":{"strategy":{"type":"string","enum":["self_consumption","arbitrage","peak_shaving","combined"]},"capacity_kwh":{"type":"number"},"power_kw":{"type":"number"},"peak_charge_applies":{"type":"boolean"},"frequency_reserve":{"type":["object","null"],"properties":{"requires":{"type":["string","null"],"description":"what the program needs from the household"},"source_url":{"type":["string","null"]},"reserve_kwh":{"type":"number"},"reserve_kw":{"type":"number"},"assumptions":{"type":"object"},"provider":{"type":"string"},"as_of":{"type":["string","null"]},"per_component":{"type":"array","items":{"type":"object"}},"yearly_sek":{"type":"number"},"stated":{"type":["string","null"],"description":"the provider's terms as its page states them"},"program":{"type":["string","null"]}}},"cycles":{"type":"number"},"warranty":{"type":"object"},"grid_charged_kwh":{"type":"number"},"arbitrage_savings_sek":{"type":"number"},"peak_savings_sek":{"type":"number"},"savings_sek":{"type":"number"},"self_consumption_savings_sek":{"type":"number"},"throughput_kwh":{"type":"number"},"yearly_benefit_sek":{"type":"number","description":"the battery's savings + the battery program's income"}}},"self_sufficiency_pct":{"type":"number"},"consumed_kwh":{"type":"number"},"exported_kwh":{"type":"number"},"imported_kwh":{"type":"number"},"produced_kwh":{"type":"number"},"self_consumption_pct":{"type":"number"},"savings_sek":{"type":"number"},"cost_with_system_sek":{"type":"number"},"cost_without_system_sek":{"type":"number"},"total_yearly_benefit_sek":{"type":"number","description":"the whole system's savings + the battery program's income"}}},"attribution":{"type":"string"}}}},"responses":{"Error400":{"description":"The body is not valid JSON (invalid_json).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error401":{"description":"Unknown x-api-key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error413":{"description":"The body is larger than 2 MB (body_too_large).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error422":{"description":"Invalid parameter, outside coverage or not supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error429":{"description":"Rate limited; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error503":{"description":"Dataset or spot price profile not loaded; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"securitySchemes":{"apiKey":{"in":"header","name":"x-api-key","type":"apiKey"}}},"paths":{"/api/v1/pv-yield":{"get":{"parameters":[{"$ref":"#/components/parameters/lat"},{"$ref":"#/components/parameters/lng"},{"$ref":"#/components/parameters/tilt"},{"$ref":"#/components/parameters/azimuth"},{"$ref":"#/components/parameters/system_loss"},{"$ref":"#/components/parameters/shading"},{"$ref":"#/components/parameters/kwp"}],"summary":"Yield for one point and orientation","operationId":"getPvYield","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PvYield"}}}},"304":{"description":"Not modified (If-None-Match)"},"401":{"$ref":"#/components/responses/Error401"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"503":{"$ref":"#/components/responses/Error503"}}}},"/api/v1/pv-yield/batch":{"post":{"summary":"Up to 50 points/orientations in one call (e.g. a multi-face roof)","operationId":"postPvYieldBatch","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PvYieldBatchResponse"}}}},"304":{"description":"Not modified (If-None-Match)"},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"413":{"$ref":"#/components/responses/Error413"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"503":{"$ref":"#/components/responses/Error503"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PvYieldBatchRequest"}}}}}},"/api/v1/pv-yield/matrix":{"get":{"parameters":[{"$ref":"#/components/parameters/lat"},{"$ref":"#/components/parameters/lng"},{"$ref":"#/components/parameters/system_loss"},{"$ref":"#/components/parameters/shading"}],"summary":"Annual yield for every tilt (0–90, 5°) × azimuth (0–350, 10°) at a point","operationId":"getPvYieldMatrix","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PvYieldMatrix"}}}},"304":{"description":"Not modified (If-None-Match)"},"401":{"$ref":"#/components/responses/Error401"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"503":{"$ref":"#/components/responses/Error503"}}}},"/api/v1/pv-yield/meta":{"get":{"summary":"Dataset, coverage, limits, accuracy","operationId":"getPvYieldMeta","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PvYieldMeta"}}}},"304":{"description":"Not modified (If-None-Match)"},"401":{"$ref":"#/components/responses/Error401"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"503":{"$ref":"#/components/responses/Error503"}}}},"/api/v1/pv-yield/openapi.json":{"get":{"summary":"This document","operationId":"getPvYieldOpenApi","responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/simulation":{"post":{"description":"PV, use and prices from the caller (or the se_spot preset); one battery with a dispatch strategy and an optional electricity-provider battery program. CPU only, deterministic. Costs 1 cell against the cell limit.","summary":"One year of hourly energy flows, costs and battery dispatch for one house","operationId":"postSimulation","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationResponse"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"413":{"$ref":"#/components/responses/Error413"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"503":{"$ref":"#/components/responses/Error503"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRequest"}}}}}},"/api/v1/simulation/battery-strategies":{"post":{"description":"The /simulation body plus `compare`. Costs sizes × strategies cells. Marks the best strategy per size (highest savings; ties to the simpler one; only strategies that can apply to the prices; the provider program is never chosen for you).","summary":"Battery sizes × dispatch strategies in one call (at most 25 cells)","operationId":"postBatteryStrategies","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatteryStrategiesResponse"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"413":{"$ref":"#/components/responses/Error413"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"503":{"$ref":"#/components/responses/Error503"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatteryStrategiesRequest"}}}}}},"/api/v1/simulation/openapi.json":{"get":{"summary":"This document (same as /api/v1/pv-yield/openapi.json)","operationId":"getSimulationOpenApi","responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"openapi":"3.1.0","security":[{},{"apiKey":[]}],"servers":[{"url":"https://numsolar.com:5000"}]}