# Sympheny Documentation > Documentation for the Sympheny web application, REST API, Python SDK, and AI integrations. --- # Sympheny documentation Sympheny helps you design and optimize multi-energy systems. Work with it through any of these four surfaces.
- :material-web:{ .lg .middle } __Web Application__ --- Model and optimize multi-energy systems in the browser — projects, scenarios, and results. [:octicons-arrow-right-24: Open the guides](web-app/index.md) - :material-api:{ .lg .middle } __REST API__ --- The HTTP API behind Sympheny: authentication, endpoints, and schemas. [:octicons-arrow-right-24: Browse the API](api/index.md) - :material-language-python:{ .lg .middle } __Python SDK__ --- `sympheny-toolbox` — a typed Python client with matching sync and async APIs. [:octicons-arrow-right-24: Get started](sdk/index.md) - :material-robot-outline:{ .lg .middle } __Use with AI__ --- Bring Sympheny into AI assistants and agents — the MCP server and machine-readable docs. [:octicons-arrow-right-24: Learn more](ai/index.md)
--- # Web Application Documentation for the Sympheny web application — from your first login to interpreting optimization results. - [Getting started](getting-started/index.md) — what Sympheny is, signing up, and a quick-start walkthrough. - [How-to guides](how-to/index.md) — task-oriented guides for the web app: projects, analyses, scenario modeling, execution, results, and the database center. - [Concepts](concepts/index.md) — the optimization model's building blocks: hubs, energy carriers, demands, technologies, and the underlying financial concepts. - [Parameters](concepts/parameters/index.md) — definitions of every input and output parameter. - [What's new](whats-new/index.md) — release notes for the web application. - [Troubleshooting and FAQs](troubleshooting/index.md) — common issues and how to get support. Working programmatically instead? See the [REST API](../api/index.md) or the [Python SDK](../sdk/index.md). --- # Getting started ## What is Sympheny? Sympheny is a toolset for integrated energy system planning, suitable for scales ranging from buildings to cities. You can model energy systems with basic site details, quickly evaluate various supply options, and identify the most suitable ones. Its dashboards provide in-depth insights into the technology and performance of each solution. You can also run multiple scenarios simultaneously, to understand the impact of factors like energy prices and site configurations. ![Sympheny web app overview](img/introduction-1.png) ## What makes it unique? Sympheny supports you from initial data gathering to execution and detailed results, identifying optimal energy supply solutions with speed and precision. Advanced optimization algorithms analyze thousands of potential solutions, pinpointing the best options based on the planner's objectives. These algorithms solve energy balances for every hour of the year, considering complex site-specific supply and demand dynamics, interactions between various energy vectors, and the detailed techno-economic specifications of available technologies. ## What can Sympheny be used for? The Sympheny web app can be used to identify the optimal energy supply solution for a given site or to assess the expected performance of user-defined supply solutions. You can use it to: - **Optimize production technologies:** Determine the most suitable energy production technologies for a site, how they should be dimensioned, and whether to use a centralized, decentralized, or hybrid solution for heating and/or cooling. - **Optimize renewables integration:** Assess the potential to cover on-site energy demands with on-site renewable energy sources (e.g., solar, groundwater heat) and identify the optimal mix of renewable resources and technologies for a site. - **Optimize energy storage:** Identify the most suitable storage technologies for a site, evaluate the cost-effectiveness of batteries, and consider options for seasonal (e.g., geothermal) and hydrogen storage. - **Optimize thermal networks:** Determine if a thermal network is viable, identify the most efficient network type (e.g., low-temperature, high-temperature), decide which buildings or sectors to connect, and choose the appropriate production technologies for heating or cooling the network. - **Optimize grid interactions:** Decide which energy vectors to import based on cost and CO2 intensity, evaluate the possibility of operating the site autonomously from the electricity grid, and analyze peak electricity withdrawals and feed-ins. Sympheny allows for the combination of these optimizations and more, providing a comprehensive tool for energy system planning. ## What can't Sympheny be used for? - Building-level high-resolution optimization of sites larger than 15-20 buildings. Larger sites may require aggregation of buildings into nodes/hubs. - Detailed hydraulic optimization of thermal networks or detailed optimization of electrical networks. - Optimizing the control or operational management of energy systems. - Sympheny is best suited for engineering problems in early phases of planning (SIA 1 and 2), but it can still be used as a digital twin, carried over to later planning stages. ## Where should I start? The recommended starting point is the Example case, which is installed in every user's account upon first sign-in. From there, follow the steps below to sign in and complete your first walkthrough. Once you're familiar with the basics, explore the [how-to guides](../how-to/index.md) to learn the various features of the software and how to use them effectively. 1. [Sign up and log in](sign-up-and-login.md) 2. [Follow the quick start walkthrough](quickstart.md) For programmatic access, see the [REST API documentation](../../api/index.md). ## What if I run into problems? You can reach out to us for support via the Help button located at the bottom-right corner of our website, or drop us an email at [support@sympheny.com](mailto:support@sympheny.com). Additionally, feel free to check out our [Troubleshooting and FAQs](../troubleshooting/index.md) sections for handy solutions. --- # Sign up and log in ## Sign up Upon signing up, you'll receive a confirmation email with a verification link. Click the link, set your password, and then log in to Sympheny. ## Log in When you log in for the first time, you'll need to accept Sympheny's General Terms and Conditions. It's mandatory to accept these terms to use the web app. ## Log in with MFA (multi-factor authentication) For added security, you can enable multi-factor authentication (MFA) to log in to your Sympheny account: 1. Enter your email and password as usual. 2. Scan the QR code using an authenticator app on your phone. 3. Enter the code provided by the authenticator app to complete the login process. ![MFA login screen with QR code](img/sign-up-and-login-1.png) If you'd like to enable MFA or have any questions, feel free to contact us for assistance. ## What's next? Once you're signed in, follow the [quick start walkthrough](quickstart.md) to build your first scenario, or explore [web app usage](../how-to/index.md) for more detailed instructions. --- # Web app quick start In this example, you simulate a **data center**. The goal is to walk you through your first steps in the Sympheny web app, covering the mandatory features and some *optional* ones along the way. In the following steps you: - Create a scenario to size a solar PV installation. - Evaluate the cost and performance of a 100 kWh battery. ## Create a project Specify the location by searching for an address. ![Creating a project by searching for its address](img/quickstart-1.png) ## Create a scenario Analyses can be used as an archive: create different scenarios to compare against each other. Click a scenario to work with it. Optional, while creating the project: - Send a copy of, or share, the project with other Sympheny users. - Upload an image to illustrate your project, using a small resolution. ![Creating a scenario within a project](img/quickstart-2.png) ## General You can change the currency; press **Save** after changing it. Add a stage — multiple stages can be used to plan an optimal energy system over decades, although this adds complexity to the modeling process. To get started on a project, simulate a single stage. An interest rate of 0% will help you interpret the results as a new user. ![General scenario settings, including currency and stages](img/quickstart-3.png) ## Hubs Click **Add new** to add a hub. Multiple hubs are used to simulate energy networks, such as district heating. More hubs add complexity, so to get started, simulate a single hub. Optional, while adding a hub: - Research the hub's location by address. - Change the map overlay. - Draw an outline of the building or group of buildings to illustrate and locate them. You can activate add-ons for extracting geodata from the map. ![Adding a hub and setting its location](img/quickstart-4.png) You can skip ahead to **Supply Technologies**, where energy carriers will be defined automatically. ![Skipping ahead to the Supply Technologies step](img/quickstart-5.png) ## Supply technologies Add a technology from the database. ![Adding a supply technology from the database](img/quickstart-6.png) Select a large solar field, since the price per kW will be lower. Once selected, information on the source is available. ![Selecting a large solar field technology](img/quickstart-7.png) Click **Yes** to add the energy carriers. ![Confirming to add the associated energy carriers](img/quickstart-8.png) You can edit all of the parameters of a technology from the database. Check **Primary Mode** — every technology needs at least one primary mode. Multi-mode technologies can, for example, represent a reversible heat pump. ![Editing technology parameters and primary mode](img/quickstart-9.png) The efficiency of this default solar PV is 18%, relative to the solar irradiance caught by the panels. Leave the sizing as **Optimize**, so Sympheny fixes the optimal size to reach the objective, usually minimum ROI. ![Setting solar PV efficiency and sizing to Optimize](img/quickstart-10.png) Unit commitment parameters are advanced parameters used for specific industrial equipment. You can edit parameters related to investment cost, maintenance, and embedded emissions. ![Advanced unit commitment and cost parameters](img/quickstart-11.png) Now that the technologies and associated energy carriers are created, head back to the **Energy Carriers** step. ![Returning to the Energy Carriers step](img/quickstart-12.png) ## Energy carriers You can edit or create more energy carriers to distinguish all of the different energy flows. This example uses the defaults. ![Default energy carriers list](img/quickstart-13.png) ## Energy demands In all sections, a map view represents hubs and networks. Close it to view the technology diagram below. This diagram is dynamic — for now, only the solar panels appear. ![Technology diagram with solar panels](img/quickstart-14.png) Create a new **Energy Demand**. Select the energy carrier; you can edit the name. Try generating a profile for a data center using the available profiles. ![Creating a new energy demand](img/quickstart-15.png) Even if there is no profile called "datacenter," you can explore the available building profiles and see if Industry Warehouse fits the project's needs. ![Browsing available building profiles](img/quickstart-16.png) In this case, you have the annual electricity consumption, and can specify 1.2 GWh/year. ![Specifying annual electricity consumption](img/quickstart-17.png) Information on the source of the profile is displayed. ![Profile source information](img/quickstart-18.png) Save and close to add the profile. ![Saving the energy demand profile](img/quickstart-19.png) This button lets you view the profile you generated. ![Button to view the generated profile](img/quickstart-20.png) This is the resulting hourly profile. You can see large drops in consumption over weekends. You can download and edit the profile and re-upload it. You can also use the Sympheny peak shaving function. ![Hourly energy demand profile showing weekend drops](img/quickstart-21.png) To upload a custom profile, edit the energy demand. ![Editing an energy demand to upload a custom profile](img/quickstart-22.png) Select upload profile. The info button describes the format, and downloading the profile also reveals the format template. ![Uploading a custom profile with format template](img/quickstart-23.png) An hourly profile is an XLSX file with 8760 values in kW. ![Example hourly profile spreadsheet with 8760 values](img/quickstart-24.png) The uploaded profile better represents the electricity demand of a data center. ![Energy demand using the uploaded custom profile](img/quickstart-25.png) ## On-site resources In this section you generate the hourly profile of the irradiance hitting the solar panels. ![The on-site resources step](img/quickstart-26.png) Select the energy carrier; you can edit the name. Set 10,000 m² of available solar-panel surface and generate the profile from a location–inclination–orientation combination in the database. This is the *maximum* available surface — Sympheny chooses the optimal size relative to the electricity consumption, price, and resale value. You can also generate the hourly solar profile for any location–orientation–inclination combination using the **Add from map** workflow. ![Setting the available solar surface and generating a profile](img/quickstart-27.png) This example uses Geneva, roof-mounted, at 15° facing east. ![Selecting location, inclination, and orientation](img/quickstart-28.png) This is the resulting hourly solar-irradiance profile, per m². ![Resulting hourly solar irradiance profile](img/quickstart-29.png) The energy diagram updates to include the on-site resource. ![Energy diagram updated with the on-site resource](img/quickstart-30.png) ## Imports and exports You still need to add the electric grid. Otherwise there is a deficit of electricity at night, and a daytime surplus may limit the size of the solar field. ![The imports and exports step](img/quickstart-31.png) Add the option to purchase electricity from the grid and set the electricity price. ![Adding a grid import and its price](img/quickstart-32.png) Adding a capacity price and a CO₂-emissions value per kWh is optional but recommended. ![Optional capacity price and CO2 emissions per kWh](img/quickstart-33.png) Also add an export, with a revenue of 0.08 EUR/kWh. ![Adding an electricity export](img/quickstart-34.png) ![Setting the export revenue value](img/quickstart-35.png) ## Review the energy diagram Before executing the model, review the energy diagram. Confirm that every technology and link is fully connected, with no dead ends. ![Fully connected energy diagram before execution](img/quickstart-36.png) ## Execute the scenario Give the execution a name. The **Updated** indicator means the scenario has changed since it was last executed. By default Sympheny generates two solutions: Solution 1 minimizes total cost (operating + maintenance + annualized investment costs); Solution 2 minimizes CO₂ emissions. ![Naming an execution and its two default solutions](img/quickstart-37.png) Execution takes a few seconds. Open the interactive dashboard to review the results. You can also explore the input file (all parameters) and the output files (all results) — both are Excel files. ![Opening the interactive results dashboard](img/quickstart-38.png) ## Review the results First, select **All stages** to view the Pareto front. ![Selecting All stages to view the Pareto front](img/quickstart-39.png) The Pareto front shows Solutions 1 and 2, with the total cost and emissions of each. ![Pareto front comparing the two solutions](img/quickstart-40.png) Select Solution 1, the stage, and the hub to view the detailed solution. ![Selecting a solution, stage, and hub](img/quickstart-41.png) The Sankey diagram shows every energy flow in kWh. As with all diagrams, you can filter its content and download the data and images. A Sankey is also available for each month. ![Sankey diagram of the energy flows](img/quickstart-42.png) The energy diagram shows the capacity of each technology — here the optimal PV field is 1,760 kW of electric output — along with each technology's investment. Use the navigation bar at the top to return to the scenarios. ![Energy diagram with optimized technology capacities](img/quickstart-43.png) ## Evaluate a 100 kWh battery Copy the scenario you just created to add one with a battery. ![Copying the scenario](img/quickstart-44.png) ![Confirming the scenario copy](img/quickstart-45.png) In the new scenario every parameter is preserved, so you only need to add a battery. ![The copied scenario with parameters preserved](img/quickstart-46.png) ![Adding a battery storage technology](img/quickstart-47.png) Set the battery to **Must install** and specify a capacity of 100 kWh. Sympheny respects this constraint while optimizing the battery's operation and the size of the solar field. ![Setting the battery to must-install at 100 kWh](img/quickstart-48.png) Storage technologies expose a different set of parameters. ![Storage technology parameters](img/quickstart-49.png) Once the battery is added, execute the scenario with the same objectives and view the results. ![Executing the scenario with the battery](img/quickstart-50.png) Under **All stages**, the cost and emissions are slightly better with the battery. ![All-stages results improved by the battery](img/quickstart-51.png) In the detailed results you can see the battery's hourly state of charge — this view is zoomed in on a single month. ![Hourly state of charge of the battery](img/quickstart-52.png) --- # How-to guides The Sympheny web app organizes energy planning into a structured workflow. Projects are broken down into analyses, and each analysis is further divided into scenarios. ![Hierarchical structure of projects, analyses, and scenarios in the Sympheny web app](img/index-1.png) ## Hierarchical structure This hierarchical structure mirrors typical energy planning workflows: - **[Projects](managing-projects.md)** represent individual sites where you develop an optimal energy supply system. - **[Analyses](managing-analyses.md)** consist of multiple iterations that progressively refine the energy supply system design for a specific site. - **[Scenarios](modeling-scenarios/index.md)** let you explore different potential futures, such as energy price conditions or demand assumptions, or compare alternative design variants. ## Executing scenarios During optimization, you can run a single scenario or execute all scenarios within an analysis at once. On the [Execution](executing-scenarios.md) page, you can choose from a variety of objective functions and execution parameters. ## Scenario results After execution, you can access the input data and output files behind the optimal design and operation of your energy systems. An interactive dashboard also provides result visualizations for all scenarios. See [Scenario Results](scenario-results.md) for details. ## Database Center The [Database Center](database-center/index.md) gives you an overview of all your data. It also lets you download or upload databases from other sources directly to the web app. ## EnyTool [EnyTool](enytool/index.md) connects the web app to partner tools and datasets across the Sympheny ecosystem, including synthetic demand modelling with the [RAMP tool suite](enytool/ramp-tool-suite.md). ## EnyFlow [EnyFlow](enyflow/index.md) is a Jupyter Notebook environment for building custom workflows, analyses, and visualizations on top of the Sympheny API. --- # Managing projects This guide shows you how to create, edit, copy, share, delete, and manage your projects in Sympheny. ![Projects page showing a geolocation view of existing projects](img/managing-projects-1.png) ## Navigate your projects page When you log in, you land on your Projects page. This page shows a geolocation view of all your existing projects. A sample project named "Example Case" is available to demonstrate project functionality. ## Create a new project 1. Click the **Add project** ![Add project button](img/managing-projects-2.png) button. 2. Assign a name and geolocation for your project. 3. Click **Save**. ## Manage existing projects ![Project actions menu opened from the three-dot button](img/managing-projects-3.png) Most project management actions start by clicking the three dots on the project you want to work with. This opens a menu with the following options: - **Edit project** - **Copy project** - **Delete project** - **Send project copy** - **Reinitialise project** - **Share project** ## Send a project copy To send a project copy to another Sympheny user: 1. Choose **Send project copy** from the menu. 2. Enter the recipient's email address. 3. Click **Send** to deliver the project copy. !!! note The recipient receives a copy of the project's current state. Any changes you make afterward are not reflected in their copy. ## Share a project Sharing grants other users access to your Sympheny projects. To share a project: 1. Choose **Share project** from the menu. 2. Choose **Add secondary owner**. You can add multiple users. 3. For each user, set an access level: **Read-only** (view the project but not modify it) or **Edit** (full control). 4. A project locks after a user starts working in it. It unlocks automatically after 10 minutes of inactivity, or you can click the unlock button next to the project's name on the Analysis page. ![Share project dialog with secondary owners and access levels](img/managing-projects-4.png) ## Reinitialize a project This option is available only for the example projects provided by Sympheny. Click such a project, then select **Reinitialise project** to restore it to its original state. --- # Managing analyses The Analyses page is where you manage your analyses and their associated scenarios within a project. ![Analyses page listing analyses within a project](img/managing-analyses-1.png) ## Create a new analysis 1. Click the **Add analysis** ![Add analysis button](img/managing-analyses-2.png) button. 2. Assign a name. 3. Click **Add**. ## Manage an existing analysis - You can rename, copy, or delete existing analyses as needed. - As with analyses, you create a new scenario by clicking the **Add scenario** ![Add scenario button](img/managing-analyses-3.png) button and assigning a name. - You can rename, copy, or delete existing scenarios within an analysis. --- # Modeling scenarios ![Scenario editor with step tabs across the top](img/index-1.png) ## Modeling steps Modeling a scenario is a guided process. The scenario page walks you through a series of tabs, each dedicated to a specific element of your model, so you can build your scenario step by step: 1. [General](general-step.md) 2. [Hubs](hubs-step.md) 3. [Energy carriers](energy-carriers-step.md) 4. [Energy demands](energy-demands-step.md) 5. [On-site resources](on-site-resources-step.md) 6. [Imports & exports](imports-exports-step.md) 7. [Conversion technologies](conversion-technology-step.md) 8. [Storage technologies](storage-technologies-step.md) 9. [Network links](network-links-step.md) ## GIS map ![Interactive GIS map showing the hub network](img/index-2.png) Use the interactive GIS map to explore the hub network. After you select the hubs that interest you, the map shows GIS information for every hub, along with the buildings connected to it. ## Energy hub diagram ![Energy hub diagram at the bottom of a scenario editor tab](img/index-3.png) The energy hub diagram of your potential system appears at the bottom of each tab. It's empty when you start a new project, and updates automatically as you add components to your model. Use the drop-down menu at the top to move between the energy hub diagrams for each of your scenario's hubs and stages. The colors of the technologies in the energy hub diagram are determined by the primary output energy carrier of the technology. You can define these colors in the [Energy carriers step](energy-carriers-step.md). !!! tip The direction of the arrows in the energy hub diagram matches the direction of energy flows. A reversed energy demand (for example, a cooling demand) is shown as an arrow flowing away from the box representing that demand. Storages are the only technologies with bidirectional flows. --- # General step ## Currency The currency shown in cost parameters and results. When you select a currency other than CHF, an [exchange rate](https://exchangeratesapi.io/) from CHF is applied to all economic data in the technology databases. All economic data in the databases, including user-defined data, is stored in CHF. For more information, see [General parameters](../../concepts/parameters/general.md). ![Currency selection in the General step](img/general-step-1.png) Economic data already included in the scenario is **not** converted; only the economic data inside databases is converted. ## Stages Include the scenario's stages, along with their durations and economic parameters. For more information, see [Stages](../../concepts/stages.md). ![Stages configuration in the General step](img/general-step-2.png) --- # Hubs step In this step, you specify a list of the hubs that make up your site. Each hub must have a unique name, which identifies it in subsequent steps and in the results. For more information, see [Hubs](../../concepts/hubs.md). ![Hubs step in the scenario editor](img/hubs-step-1.png) ## Add a hub with the GIS add-on [Watch: adding a hub with the GIS add-on](https://www.youtube.com/watch?v=w-XKBjAswL0&t=28s&ab_channel=UrbanSympheny) --- # Energy carriers step This step lets you choose the types of energy your model considers. Each energy carrier needs a name, type, subtype, and color. For more information, see [Energy carriers](../../concepts/energy-carriers.md). ![Energy carriers step in the scenario editor](img/energy-carriers-step-1.png) !!! note Choosing the type and subtype doesn't affect any data directly — it only determines the default color used to represent that energy carrier in your model's visuals. You can always return to this step to add more energy carriers later. If you try to add, for example, a supply technology that isn't in your list of energy carriers, Sympheny asks if you'd like to add the missing energy carrier to the list. --- # Energy demands step In this step, you define all energy demands included in your scenario. Each demand must have a unique name and an energy carrier, and must be linked to at least one hub and one stage. For more information, see [Energy demands](../../concepts/energy-demands.md). ![Energy demands step in the scenario editor](img/energy-demands-step-1.png) ## Add new You have several options for creating energy demand profiles: - **Generate Profile**: automatically generate a profile based on building use types, standard norms, and your organization's internal database. - **Upload Profile**: upload a custom profile file directly. - **Select Saved**: choose an existing profile from your personal database. ![Add new energy demand dialog with profile options](img/energy-demands-step-2.png) !!! tip Integrate via the API to upload or modify multiple profiles in a single operation. If your license includes API access, contact support to get a template, code samples, and guidance. ## Generate profile Generate standard hourly energy demand profiles for buildings of different types. After clicking **Generate Profile**, a dialog opens where you specify the parameters of the profile. The process has three steps: ![Generate profile dialog steps](img/energy-demands-step-3.png) 1. **Database**: select the database to use — either Sympheny's database or your organization's database. For more information on databases, see [Database Center](../database-center/index.md). 2. **Profile type**: select a combination of demand type and building use to define the shape of the profile. This profile is normalized, meaning its total sum is 1 kWh/year. ![Profile type selection](img/energy-demands-step-4.png) 3. **Energy use**: the normalized profile is multiplied by the annual energy demand in kWh/year. Enter this value directly as **Total Annual Demand**, or select a **Building Age or Standard** to get an estimated **Energy Intensity** in kWh/year/m², and specify the **Energy Reference Area** in m². ![Energy use configuration](img/energy-demands-step-5.png) 4. **Summary**: review a statistical summary of the demand profile, including the source of the data used to generate it. For more detail on how profiles are generated and a list of available profiles, see the [demand profiles methodology](../../concepts/demand-profiles-methodology.md). ## Upload profile You can specify an energy demand profile in an XLSX file and upload it. The profile must be in kWh, for every hour of the year from January 1 to December 31. The maximum file size is 2 MB. The file must contain a single sheet with 2 columns, no header, and exactly 8760 rows. Replace any empty values with 0. The 1st column contains the index (incrementing integers from 1 to 8760); the 2nd column contains the hourly energy demand values in kWh. Download and edit this template (or any Sympheny demand profile) to make sure your format matches: [template profile XLSX](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/example-energy-demand-profile.xlsx) ![Upload profile dialog](img/energy-demands-step-6.png) !!! tip Make sure your custom profile matches a Sympheny year. A Sympheny year starts at 00:00 on a Monday, January 1, and ends at 23:00 on December 31. 2018 is a good reference year, since it starts on a Monday and isn't a leap year. ## Select saved When you upload or generate a profile, you can save it for future use. Use **Select Saved** to load an energy profile you saved previously. ## Visualization of demand data Once a demand is added and connected, a box representing it appears on the energy hub diagram. You can download the added demand profile as an Excel file. For each energy demand in the scenario, you can visualize hourly energy demand profiles and load duration curves. ![Hourly demand profile visualization](img/energy-demands-step-7.png) ![Load duration curve visualization](img/energy-demands-step-8.png) --- # On-site resources step ![On-site resources step in the scenario editor](img/on-site-resources-step-1.png) **On-site resources** are renewable resources with intermittent (temporally varying) availability. In Sympheny, you can quickly generate **solar irradiance** and **wind** profiles of 8760 timesteps using different methods. **On-site resources** are functionally identical to **imports**, but with fewer available parameters. For resources with constant availability, like geothermal energy or air used in a heat pump, create an **import** with a fixed **Maximum Capacity (kW)** and no **Energy Price (CHF/kWh)**, instead of an on-site resource. Energy produced from on-site resources can be curtailed. **Curtailment** occurs when the available on-site resource leads to higher energy production than required by demand and export (see diagram below) at any given time. ![Curtailment diagram](img/on-site-resources-step-2.png) ## Creating on-site resources Sympheny offers several workflows to create on-site resources: - **Add new > Generate profile > Available Resource Area (m²)**: generate a solar profile using the Sympheny database — easy for creating profiles across multiple hubs. - **Add new > Upload profile > Available Peak Load (kWp)**: upload your own normalized profile — easy for creating profiles across multiple hubs. - **Add new > Upload profile > Generic Availability (kWh/h)**: upload your own profile. - **Add from map > Solar Resource > Optimize slope and azimuth**: explore the optimal orientation of solar panels relative to the demand profile. - **Add from map > Solar Resource > Custom slope and azimuth**: accurately estimate the solar profile for a specific location, surface, and orientation. - **Add from map > Solar Resource > Weighted sum aggregation**: generate an average solar profile from multiple surfaces on the map. - **Add from map > Wind Resource**: generate a wind power production profile using terrain parameters. ## Add new Add a new on-site resource to your scenario. This resource is free and can be used whenever it's available. In the toolbox, select an **Energy Carrier** matching the resource type. A **Name** is generated based on the energy carrier and existing profiles, and can be edited. The **Hub** and **Stage** where the resource is available are selected automatically and can be edited. ![Add new on-site resource dialog](img/on-site-resources-step-3.png) ## Available Resource Area (m²) When sizing a new solar PV field, the only available information may be the **Available Resource Area (m²)** and location. Select **Generate Profile**, click **Generate profile**, select the **Database**, **Location**, **Type**, and **Slope**, then click **Next**. Sympheny generates a solar irradiance profile for a 1 m² surface area. ![Available Resource Area configuration](img/on-site-resources-step-4.png) The **Available Resource Area (m²)** is the maximum available irradiance profile. The optimization result determines the optimal size of solar technology to install. Since curtailment may occur, the installed capacity isn't always equal to the maximal operational capacity. ![Available Resource Area result](img/on-site-resources-step-5.png) ## Available Peak Load (kWp) When the hourly profile is measured or simulated with a third-party tool, use the **Upload profile** function to bring it into Sympheny. In this workflow, the maximum value of the uploaded profile should equal 1 kW. Total energy available depends on the **Available Peak Load (kWp)**. The profile can be the output of the technology (for example, PV production or wind turbine production), provided the technology's efficiency is 100%. In that case, the kW-peak (kWp) refers to the maximum capacity of the technology that uses this on-site resource. !!! tip To upload a profile, select or drag and drop an XLSX file with the correct format. The file must contain a single sheet with 2 columns, no header, and exactly 8760 rows. The 1st column must contain incrementing numbers from 1 to 8760. The 2nd column must contain the hourly profile values, for every hour of the year from 00:00 on January 1 to 23:00 on December 31. Make sure the units are correct. The maximum file size is 2 MB. Uploaded profiles can be saved for later use. [Template profile XLSX](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/example-energy-demand-profile.xlsx) For example, the hourly resource profile of **Windpower** indicates the availability of wind-sourced electricity in kW per unit of peak load (kW/kWp). In this case, a conversion efficiency is already factored into the hourly resource profile, and the conversion efficiency of the wind turbine technology should be 100%. ![Windpower resource profile example](img/on-site-resources-step-6.png) The use of the on-site resource is determined by the optimal capacity of the technologies that use that resource. ![On-site resource usage result](img/on-site-resources-step-7.png) ## Generic Availability (kWh/h) This workflow is more flexible than the previous two. For example, use it to create an intermittent industrial waste heat profile. In this workflow, the uploaded profile should be in kWh for each hour of the year. ![Generic Availability upload dialog](img/on-site-resources-step-8.png) !!! tip You can download irradiation profiles from external databases like [PVGIS](https://re.jrc.ec.europa.eu/pvg_tools/en/#MR) — just make sure the units are consistent with the Sympheny workflow. ## Add from map Add a new on-site resource to your scenario from the map. ![Add from map dialog](img/on-site-resources-step-9.png) ## Solar Resource > Optimize slope and azimuth Click **Select Surface from Map** to select a surface, like the outline of a hub, and get the surface area (m²) and geographic location of the geometry. The optimizer defines the optimal **Slope** and **Azimuth**. ![Optimize slope and azimuth dialog](img/on-site-resources-step-10.png) ## Solar Resource > Custom slope and azimuth Click **Select Surface from Map** to select a surface, like the outline of a hub, and get the surface area (m²) and geographic location of the geometry. Specify the **Slope** and **Azimuth**. Possible settings: - **Slope 0°**: flat - **Slope 90°**: vertical - **Azimuth 0°**: south - **Azimuth -90°**: east - **Azimuth 90°**: west - **Azimuth 180° / -180°**: north ![Custom slope and azimuth dialog](img/on-site-resources-step-11.png) ## Solar Resource > Weighted sum aggregation Calculate an aggregated solar profile, normalized in kW/m², for all selected surfaces. The calculation accounts for the slope and azimuth of each roof element. The generated profiles are aggregated using a weighted average for each surface, with surface areas serving as weights. ## Wind Resource Set **Surface (m²)**, **Terrain Type**, **Roughness Length (m)**, and **Height (m)** to generate a wind resource profile based on those parameters. - **Surface (m²)** should be the number of wind turbines multiplied by the total swept area per turbine. - **Terrain Type** describes the surrounding landscape. - **Roughness Length (m)** is based on the terrain type. - **Height (m)** is the height of the middle of the turbine. The maximum theoretical efficiency of a wind turbine technology using this resource profile (in kWh-wind) is 59.3%. For more information, see [Wind profile power law](https://en.wikipedia.org/wiki/Wind_profile_power_law). ![Wind resource configuration](img/on-site-resources-step-12.png) --- # Imports & exports step In this step, you define the energy your scenario can purchase from outside the system (imports, such as grid electricity or natural gas) and the energy it can sell or send out (exports). For background, see the [Imports](../../concepts/imports.md) and [Exports](../../concepts/exports.md) concept pages. !!! info "Coming soon" A step-by-step guide for this tab is in preparation. --- # Conversion technology step There are two ways to add conversion technology candidates to your scenario: **Add from Database** and **Create Custom**. For more information, see [Conversion technologies](../../concepts/conversion-technologies.md). ![Conversion technology step in the scenario editor](img/conversion-technology-step-1.png) ## Add from Database In the dialog that appears, follow these steps: 1. Select the database to load your data from. In most cases, the options are: 1. Sympheny Global database 2. Organization database (linked to your organization) 3. My User database (linked to your personal account) 2. Choose a technology category. 3. Select the specific technology you want to load into your scenario. Clicking a technology displays a summary of its key parameters (see figure below). ![Technology summary panel](img/conversion-technology-step-2.png) 4. Click **Select**. A window opens where you can view and further edit the technology model, with parameters from the database pre-filled into the corresponding fields. 5. Assign the technology to one or more hubs and stages in the **Optimization Options** section. This defines where and when the technology can be installed. Click **Add** at the bottom of the dialog to add the technology candidate to your scenario — it appears in the energy hub diagram at the bottom of the page. ![Optimization options and Add button](img/conversion-technology-step-3.png) !!! tip You can also build a customized technology database for the Sympheny web app. See [Database Center](../database-center/index.md). ## Create Custom Clicking **Create Custom** opens a dialog where you assign parameters for the specific technology. It's the same window as step 4 of **Add from Database**, but the fields aren't pre-filled with any values. --- # Storage technologies step In this step, you define the storage technology candidates the optimizer can install — systems that store an energy carrier for later use, such as batteries or thermal storage. For background, see the [Storage technologies](../../concepts/storage-technologies.md) concept page. !!! info "Coming soon" A step-by-step guide for this tab is in preparation. --- # Network links step In this step, you define the network link candidates that let energy flow between the hubs of your scenario — for example, a district heating pipe or an electrical connection. For background, see the [Network technologies](../../concepts/network-technologies.md) and [Intra-hub networks](../../concepts/intra-hub-networks.md) concept pages. !!! info "Coming soon" A step-by-step guide for this tab is in preparation. --- # Executing scenarios Once a scenario is fully [modeled](modeling-scenarios/index.md), you execute it to run the optimization and produce results, which are covered in [Scenario results](scenario-results.md). !!! info "Coming soon" A step-by-step guide for executing scenarios is in preparation. --- # Scenario results After [executing a scenario](executing-scenarios.md), you can explore the optimization results in the results dashboard and download them as files. The meaning of each output value is described in [Output parameters](../concepts/parameters/output-parameters.md). !!! info "Coming soon" A step-by-step guide for the results dashboard is in preparation. --- # Database Center The Database Center gives you an overview of all your data. Saved data can be called from the scenario editor across all scenarios. Through the Database Center, you can also [download databases](download-databases.md) or [upload databases](upload-databases.md) to the web app from other sources. ## Overview of the databases In the Sympheny Database Center (the database icon at the bottom left of your screen), you have access to up to two databases: ![Database Center overview](img/index-1.png) - **My User Database**: your own private database, available to you across all your scenarios. You can maintain this database directly. - **Organization Database**: the database specific to your organization, named after your organization. Only accounts from your organization can access this data — see the roles and permissions table below. ## Roles & permissions The account type and license determine which rights are available to which users. | Access | Organization Database | My User Database | | --- | --- | --- | | Download | Organization users | Individual user | | Upload / Delete | Organization admin users | Individual user | --- # Upload databases ## Direct upload from Scenario Editor ### Conversion and storage technologies While editing a scenario, you can upload single items to My User Database directly from the scenario editor (in Setup) by checking **Save the technology for future use?**. ![Save the technology for future use checkbox](img/upload-databases-1.png) ### Energy demand profiles This process is streamlined: 1. In the [Excel template](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/energy-demands-user-db-template.xlsx), enter profile names in Sheet 1. 2. In Sheet 2, add the corresponding profile under the columns with the same column names as in Sheet 1. #### Use demand profiles from My User Database To use the data, click **Select Saved** when adding a new demand in step 4. ![Select Saved option when adding a new demand](img/upload-databases-2.png) ## Upload from Database Center To upload data to your databases, first prepare your data in the correct format. The parameters available depend on the type of data you want to upload. The databases you're allowed to modify depend on your [roles and permissions](index.md#roles-permissions) within your organization. ### Conversion and storage technologies 1. Select the database (My User Database or Organization Database) you want to add or replace data for. 2. Select the type of data (Energy Demands, On-site Resources, or a category of Technology). 3. Drop or select your file, then click upload. By default, uploaded data is added to the existing database. To add new data without replacing the current content, keep **Append existing data** checked. To replace the entire database with the new data, uncheck **Append existing data** — this overwrites the existing database entirely. ![Upload dialog with Append existing data option](img/upload-databases-3.png) ### Energy carriers naming conventions Energy carriers (EC) must follow the exact nomenclature given in the table below. After adding a specific technology from the scenario editor, you can change the energy carriers to any other EC available in that scenario. | Energy carrier name | Nomenclature for templates | | --- | --- | | Cooling -20 - -10°C | COOLING_1 | | Cooling -10 - 0°C | COOLING_2 | | Cooling 0 - 10°C | COOLING_3 | | Cooling 10 - 20°C | COOLING_4 | | Ice | ICE | | Electricity | ELECTRICITY | | Electricity Renewable | ELECTRICITY_RENEWABLE | | Biogas | BIOGAS | | Gas | GAS | | Hydrogen | HYDROGEN | | Hydrogen Pressurized | HYDROGEN_PRESSURIZED | | Oil | OIL | | Coal | COAL | | Wood Chips | WOOD_CHIPS | | Wood Pellets | WOOD_PELLETS | | Heat 0-10 °C | HEAT_1 | | Heat 10-20 °C | HEAT_2 | | Heat 20-30 °C | HEAT_3 | | Heat 30-40 °C | HEAT_4 | | Heat 40-50 °C | HEAT_5 | | Heat 50-60 °C | HEAT_6 | | Heat 60-70 °C | HEAT_7 | | Heat 70-80 °C | HEAT_8 | | Heat 80-90 °C | HEAT_9 | | Heat Ambient | HEAT_AMBIENT | | Steam Low Pressure | STEAM_LOW_PRESSURE | | Biomass | BIOMASS | | Geothermal | GEOTHERMAL | | Hydro | HYDRO | | Process Waste Heat | PROCESS_WASTE_HEAT | | Solar Facade | SOLAR_FACADE | | Solar Parapet | SOLAR_PARAPET | | Solar Roof | SOLAR_ROOF | | Tidal | TIDAL | | Wind | WIND | ### Energy demands: usage and naming convention To upload energy demand profiles, fill in an Excel file with two sheets. There are currently two cases, depending on whether you're uploading to My User Database (see "Use demand profiles from My User Database" above) or to your Organization Database. #### Upload to Organization Database This method is preferred for batch upload. 1. In the [Excel template](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/energy-demands-org-db-template.xlsx), enter information about each profile in Sheet 1: Building Use, Demand Type, Building Age or Standard, and Specific Energy Demand. Follow the [naming convention](#naming-convention) below. The Specific Energy Demand (kWh/m²/a) for each combination of Building Use, Demand Type, and Building Age or Standard lets you scale the profiles to each scenario's requirements via the scenario editor. 2. In Sheet 2, add the corresponding profiles under the columns with the same column names as in Sheet 1, normalized to 1 kWh. Make sure the naming in row 1 of Sheet 2 matches the naming in column A of Sheet 1. ##### Naming convention Upload your demands under one of the four demand types listed below, using this nomenclature: | Demand names | Demand types | | --- | --- | | Electricity | ELECTRICITY | | Space Heating | SPACE_HEATING | | Hot Water | HOT_WATER | | Cooling | COOLING | Building use type must be one of the following: | Building use types | | --- | | RESIDENCE_MFH | | RESIDENCE_SFH | | ADMINISTRATION | | OFFICES | | SCHOOLS | | RETAIL | | RESTAURANT | | ASSEMBLY | | HOSPITALS | | INDUSTRY | | WAREHOUSE | | SPORTS_CENTER | | INDOOR_POOL | | HOTEL | Building age or standard must use the following nomenclature: | Building age or standard | | --- | | OTHERS | | SIA_2024_EXISTING_MFH | | SIA_2024_STANDARD_MFH | | SIA_2024_TARGET_MFH | | SIA_2024_EXISTING_SFH | | SIA_2024_STANDARD_SFH | | SIA_2024_TARGET_SFH | | SIA_2024_STANDARD_INDOOR_SWIMMING_POOL | | SIA_2024_TARGET_INDOOR_SWIMMING_POOL | | SIA_2024_EXISTING_SINGLE_GROUP_OFFICE | | SIA_2024_STANDARD_SINGLE_GROUP_OFFICE | | SIA_2024_TARGET_SINGLE_GROUP_OFFICE | | SIA_2024_EXISTING_OPEN_PLAN_OFFICE | | SIA_2024_STANDARD_OPEN_PLAN_OFFICE | | SIA_2024_TARGET_OPEN_PLAN_OFFICE | | SIA_2024_EXISTING_MEETING_ROOM | | SIA_2024_STANDARD_MEETING_ROOM | | SIA_2024_TARGET_MEETING_ROOM | | SIA_2024_EXISTING_COUNTER_HALL | | SIA_2024_STANDARD_COUNTER_HALL | | SIA_2024_TARGET_COUNTER_HALL | | SIA_2024_EXISTING_CLASS_ROOM | | SIA_2024_STANDARD_CLASS_ROOM | | SIA_2024_TARGET_CLASS_ROOM | | SIA_2024_EXISTING_TEACHERS_LOUNGE | | SIA_2024_STANDARD_TEACHERS_LOUNGE | | SIA_2024_TARGET_TEACHERS_LOUNGE | | SIA_2024_EXISTING_LIBRARY | | SIA_2024_STANDARD_LIBRARY | | SIA_2024_TARGET_LIBRARY | | SIA_2024_EXISTING_AUDITORIUM | | SIA_2024_STANDARD_AUDITORIUM | | SIA_2024_TARGET_AUDITORIUM | | SIA_2024_EXISTING_SCHOOL_SUBJECT_ROOM | | SIA_2024_STANDARD_SCHOOL_SUBJECT_ROOM | | SIA_2024_TARGET_SCHOOL_SUBJECT_ROOM | | SIA_2024_EXISTING_FOOD_SALE_STORE | | SIA_2024_STANDARD_FOOD_SALE_STORE | | SIA_2024_TARGET_FOOD_SALE_STORE | | SIA_2024_EXISTING_SPECIALTY_STORE | | SIA_2024_STANDARD_SPECIALTY_STORE | | SIA_2024_TARGET_SPECIALTY_STORE | | SIA_2024_EXISTING_SALES_FURNITURE_DIY_GARDEN | | SIA_2024_STANDARD_SALES_FURNITURE_DIY_GARDEN | | SIA_2024_TARGET_SALES_FURNITURE_DIY_GARDEN | | SIA_2024_EXISTING_PATIENT_ROOM | | SIA_2024_STANDARD_PATIENT_ROOM | | SIA_2024_TARGET_PATIENT_ROOM | | SIA_2024_EXISTING_WARD_ROOM | | SIA_2024_STANDARD_WARD_ROOM | | SIA_2024_TARGET_WARD_ROOM | | SIA_2024_EXISTING_TREATMENT_ROOM | | SIA_2024_STANDARD_TREATMENT_ROOM | | SIA_2024_TARGET_TREATMENT_ROOM | | MINERGIE_NEW_CONSTRUCTION | | MINERGIE_P_NEW_CONSTRUCTION | | MINERGIE_P_RENOVATION | | MINERGIE_RENOVATION | | SIA_2024_EXISTING_GYMNASIUM | | SIA_2024_STANDARD_GYMNASIUM | | SIA_2024_TARGET_GYMNASIUM | | SIA_2024_EXISTING_FITNESS_ROOM | | SIA_2024_STANDARD_FITNESS_ROOM | | SIA_2024_TARGET_FITNESS_ROOM | | SIA_2024_EXISTING_INDOOR_SWIMMING_POOL | | SIA_2024_EXISTING_HOTEL_ROOM | | SIA_2024_STANDARD_HOTEL_ROOM | | SIA_2024_TARGET_HOTEL_ROOM | | SIA_2024_EXISTING_WAREHOUSE | | SIA_2024_STANDARD_WAREHOUSE | | SIA_2024_TARGET_WAREHOUSE | | SIA_2024_EXISTING_LOBBY | | SIA_2024_STANDARD_LOBBY | | SIA_2024_TARGET_LOBBY | | AGE_1970_1980 | | AGE_1980_1995 | | AGE_1995_2005 | | AGE_2005_2015 | | AGE_UNDER_1970 | | AGE_OVER_2015 | | MINERGIE_A | #### Use demand profiles from My User Database To use your profile, click **Generate Profile** when adding a new demand in step 4, then click your organization database (in this example, "Sympheny database"): ![Selecting the organization database when generating a profile](img/upload-databases-4.png) ### Currency The cost database is maintained in CHF. #### Through the scenario editor When you save a technology to the database while working in another currency (for example, EUR), the data is converted to CHF using the exchange rate in the scenario. When that database entry is used again in the future, it's converted from CHF back to the current EUR value using the exchange rate of the new scenario. For example, working with EUR and an exchange rate of 1.1 (1 CHF = 1.1 EUR): - You save a technology from the scenario editor with a value of 1,100 EUR. - In the database, this technology is saved as 1,100 EUR × (1 / 1.1) CHF/EUR = 1,000 CHF. - In a later scenario with an exchange rate of 1.2 (1 CHF = 1.2 EUR), this technology, when selected from the database, is entered as 1,000 CHF × 1.2 = 1,200 EUR. #### Through the upload from Database Center When you upload data through the Excel upload, the data is in CHF. ## Templates Download the templates for the upload here: ### Conversion technologies [Conversion technologies template (XLSX)](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/conversion-technologies-template.xlsx) Last updated: 2024-11-04 ### Storage technologies [Storage technologies template (XLSX)](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/storage-technologies-template.xlsx) Last updated: 2024-11-04 ### Network technologies [Network technologies template (XLSX)](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/network-technologies-template.xlsx) Last updated: 2024-11-04 ### Energy demands #### My User Database [Energy demands template — My User Database (XLSX)](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/energy-demands-user-db-template.xlsx) Last updated: 2024-11-04 #### Organization Database [Energy demands template — Organization Database (XLSX)](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/energy-demands-org-db-template.xlsx) Last updated: 2024-11-04 --- # Download databases Downloading your database is useful when you want an overview of all your data, or need to do some post-processing or adjusting. ## Steps To download your data: 1. Navigate to the database and the type of data you want to download (for example, Energy Demands, On-site Resources, or a category of Technologies). 2. On the right side of your screen, click the **Download** button. 3. Scroll to the bottom of the page and click the download arrow. 4. Open the downloaded file in Excel. !!! tip The format of the downloaded Excel file matches the format required for uploading databases. ![Download button location](img/download-databases-1.png) ![Downloaded file dialog](img/download-databases-2.png) --- # EnyTool Sympheny EnyTool is a software package that provides direct access to services and data from the Sympheny ecosystem. It connects with tools and datasets developed by: - Sympheny partners - Research projects - Open-source tools and public data platforms This integration lets planners, researchers, and decision-makers access consistent, high-quality data and services for building, district, and city-scale energy planning. EnyTool acts as a gateway, linking simulation, optimization, and data layers across partners such as GeoImpact, Esri, Gilytics, Empa, Planeto, Ramp, JRC Solar, and [geo.admin.ch](https://www.geo.admin.ch/) (GWR). ## Ecosystem overview | Partner / source | Type | Main contribution / service | Example use in EnyTool | Website | | --- | --- | --- | --- | --- | | Esri | Commercial partner | GIS and spatial analytics (ArcGIS platform) | Mapping, geospatial data integration | [esri.com](https://www.esri.com/) | | GeoImpact | Partner / data provider | Swiss building energy & geospatial database | Access building data, retrofit potential, local energy insights | [geoimpact.ch](https://www.geoimpact.ch/) | | Gilytics | Partner / infrastructure planning | Cloud GIS for infrastructure routing & siting | Network routing, cable/pipe siting in energy scenarios | [gilytics.com](https://gilytics.com/) | | Empa | R&D partner | Research & development in digital twins, energy systems | Integration of R&D data models (for example, Digicities, GOES) | [empa.ch](https://www.empa.ch/) | | Planeto SA | Partner / software platform | District heating & cooling network design | Scenario generation for thermal networks | [planeto-energy.ch](https://planeto-energy.ch/) | | Ramp | Open-source tool | Synthetic multi-energy demand generation | Generate demand profiles where measured data is missing | [rampdemand.org](https://rampdemand.org/) | | Ramp Mobility | Open-source extension | Mobility & EV demand modelling | Integrate EV loads and transport demand | [rampdemand.org/mobility](https://rampdemand.org/) | | JRC Solar (PVGIS) | Open data / research | Solar irradiation & PV potential data | Assess renewable generation potential | [joint-research-centre.ec.europa.eu](https://joint-research-centre.ec.europa.eu/) | | GeoAdmin (GWR data) | Open government data | Swiss federal geo & building data | Geospatial base data for Swiss projects | [data.geo.admin.ch](https://data.geo.admin.ch/) | ## EnyTool resource architecture EnyTool integrates external services through standardized API connections and data connectors. These resources fall into three categories: ### Data resources - **GeoImpact**: building energy and geospatial data (Switzerland) - **GeoAdmin / GWR**: official geodata, cadastral and building registers - **JRC Solar**: European solar potential datasets ### Modelling & simulation tools - **Ramp / Ramp Mobility**: energy and mobility demand generation. See [RAMP tool suite](ramp-tool-suite.md). - **Planeto**: district heating & cooling network simulation - **Gilytics**: energy infrastructure routing and optimization ### Research & GIS frameworks - **Esri (ArcGIS)**: mapping and geospatial layer integration - **Empa**: research collaboration (for example, Digicities, GOES) for digital twin data exchange ## Use cases | Use case | Involved services | Description | | --- | --- | --- | | Building energy retrofit planning | GeoImpact, GeoAdmin, Ramp | Combine building data with synthetic energy demand to identify retrofit potential | | District heating network design | Planeto, GeoImpact, GeoAdmin | Use building data and network simulation to optimize district systems | | Mobility integration in energy planning | Ramp Mobility, Gilytics | Model EV charging demand and assess grid or infrastructure impact | | Solar potential assessment | JRC Solar, Esri | Use PVGIS data with spatial layers for renewable potential mapping | | Digital twin research integration | Empa (Digicities, GOES) | Apply Empa-developed semantic and digital twin data models | --- # RAMP tool suite The RAMP tool suite specializes in synthetic demand modelling for cases where measured datasets are unavailable or incomplete. It generates stochastic load profiles (domestic, hot water, EV, and more). **RAMP Mobility** is a dedicated sister repository focused on electric mobility demand modelling. It provides demand profiles for EV fleets and integrates them into energy system optimization. The complete RAMP Mobility documentation is available on [GitHub](https://github.com/RAMP-project/RAMP-mobility/blob/master/docs/getting_started.md). ## In EnyTool - RAMP (base) generates demand profiles for buildings, districts, and micro-grids within EnyTool workflows. - RAMP Mobility is integrated: you can model EV-based loads and mobility-related demand growth, and include them in scenario planning or network sizing. Key benefits: - Enables richer modelling for sites without measured loads. - Supports future-proofing by including EV loads and mobility transitions. - Plugs into district/building energy models in EnyTool to assess flexibility, grid impact, and network sizing. ## Generate an electric mobility demand profile To generate an electric mobility demand profile, you configure the following parameters: - **Total Users**: the number of EVs to simulate. - **Charging Station Capacity [kW]**: the installed capacity of available chargers. 11 kW or 22 kW are standard values for domestic charging stations; 66 kW or 120 kW may be available at public (fast-charging) stations. - **Charging Station Probability [%]**: the probability that users charge their car at that type of charging station. You must create at least two types of charging stations. 1. Select **Ramp Mobility**. ![Select Ramp Mobility](img/ramp-tool-suite-1.png) 2. Add parameters. The charging station probabilities must sum to 100%. ![Add parameters with probabilities summing to 100 percent](img/ramp-tool-suite-2.png) 3. After a couple of minutes, three profiles are generated. ![Three generated profiles](img/ramp-tool-suite-3.png) Before clicking **Submit**, three profiles are available to download: - The **mobility profile** (W) is the energy used by all EVs as they drive. - The **usage profile** (number of EVs) is the number of EVs driving at any given time. - The **charging profile** (kWh) is the electricity provided by all charging stations to the EV fleet. Click **Submit** to add the charging profile as a demand. ## Reference The RAMP-mobility tool was developed in collaboration with: - A. Mangipinto, F. Lombardi, F. Sanvito, M. Pavičević, S. Quoilin, E. Colombo, "Impact of mass-scale deployment of electric vehicles and benefits of smart charging across all European countries," Applied Energy, 2022, [doi.org/10.1016/j.apenergy.2022.118676](https://doi.org/10.1016/j.apenergy.2022.118676). - A. Mangipinto, F. Lombardi, F. Sanvito, S. Quoilin, M. Pavičević, E. Colombo, "RAMP-mobility: time series of electric vehicle consumption and charging strategies for all European countries," EMP-E, 2020, [doi.org/10.13140/RG.2.2.29560.26880](https://doi.org/10.13140/RG.2.2.29560.26880). - F. Lombardi, S. Balderrama, S. Quoilin, E. Colombo, "Generating high-resolution multi-energy load profiles for remote areas with an open-source stochastic model," Energy, 2019, [doi.org/10.1016/j.energy.2019.04.097](https://doi.org/10.1016/j.energy.2019.04.097). --- # Sympheny EnyFlow Sympheny EnyFlow is a Jupyter Notebook environment that combines energy planning, advanced problem-solving, and visualization while directly leveraging the Sympheny web application and its API. You work in notebooks — in Google Colab or in the Sympheny EnyFlow Jupyter framework — and call Sympheny to load projects, run optimizations, and retrieve results. EnyFlow lets you: - Connect to Sympheny via the API. - Build custom workflows and analyses in notebooks. - Automate and document advanced planning and optimization tasks. - Visualize and share results interactively. ![An EnyFlow notebook working with the Sympheny API](img/enyflow-1.png) ## Key features and advantages **Advanced problem solving.** Combine Sympheny's optimization with your own models to analyze multi-energy systems, optimize resource allocation and operation, evaluate renewable-integration strategies, and design and assess sustainable energy scenarios. **Data visualization.** Create interactive charts, tables, maps, and dashboards to explore energy data, interpret optimization results, and communicate findings to stakeholders. **Customized workflow integration.** Bring your own algorithms, models, simulation tools, data-processing pipelines, and optimization routines into the same notebook, alongside calls to the Sympheny API — adapting EnyFlow to your use cases while keeping your existing intellectual property. **Comprehensive energy planning support.** Support a broad range of tasks, such as load and demand forecasting, demand-response and flexibility analysis, renewable-integration studies, infrastructure and network planning, and scenario comparison and sensitivity analysis. **Collaboration and reproducibility.** Because EnyFlow is notebook-based, each analysis is documented as code, text, and results together. Share notebooks with your team via Git, shared drives, or Colab links, and reproduce results reliably by rerunning a notebook with the same inputs. **Efficiency and scalability.** Run EnyFlow locally or in the cloud (for example via the Sympheny interface in SageMaker, via Colab, or another Jupyter service) to scale up to larger problems and use more powerful hardware. ![Interactive visualizations built in EnyFlow](img/enyflow-2.png) ![An EnyFlow dashboard summarizing optimization results](img/enyflow-3.png) ## Using the Sympheny API with EnyFlow Whether you work in Google Colab or in the Sympheny EnyFlow Jupyter framework, the general pattern is the same: 1. Get your Sympheny API credentials — see [Authentication](../../../api/authentication.md) for the token flow. 2. Configure your notebook (Colab or Jupyter). 3. Call the Sympheny API to load projects, run optimizations, and retrieve results. 4. Analyze and visualize the results using EnyFlow tools. For the full list of endpoints, request and response shapes, and examples, see the [REST API reference](../../../api/index.md). If you prefer typed Python over raw HTTP calls, the [Python SDK](../../../sdk/index.md) wraps the same API and works well inside a notebook. --- # Optimization model Sympheny models an energy system as a network of hubs connected by energy flows. The optimizer decides which technologies to install, how to operate them, and how energy moves between hubs and over time, to meet demand at the lowest cost (or another objective you choose) across one or more stages. This section explains the concepts you'll configure when building a scenario, and the methodology behind the optimizer. ## Core building blocks - [Stages](stages.md) — the phases of investment and operation in a project's lifetime. - [Hubs](hubs.md) — the geographic areas or sites in your project. - [Energy carriers](energy-carriers.md) — the substances or media that carry energy through the system. - [Energy demands](energy-demands.md) — the energy use that the system must satisfy. - [Imports](imports.md) — energy purchased from outside the system. - [Exports](exports.md) — energy sold or sent outside the system. - [On-site resources](on-site-resources.md) — intermittent renewable resources available on site. - [Conversion technologies](conversion-technologies.md) — systems that transform one energy carrier into another. - [Storage technologies](storage-technologies.md) — systems that store energy for later use. - [Technology packages](technology-packages.md) — bundles of technologies considered together. - [Network technologies](network-technologies.md) — connections that move energy between hubs. - [Intra-hub networks](intra-hub-networks.md) — connections that move energy within a hub. ## Methodology - [Clustered profiles](clustered-profiles.md) — how Sympheny reduces solving time by clustering hourly profiles into typical days. - [Demand profiles methodology](demand-profiles-methodology.md) — how Sympheny's built-in demand profiles are generated. - [Discounted cash flow analysis](discounted-cash-flow-analysis.md) — how Sympheny converts future cash flows into present value. - [Capital recovery factor](capital-recovery-factor.md) — how Sympheny converts total cost into an equivalent annual cost. ## Reference - [Glossary](glossary.md) — definitions of terms used throughout the model. - [Parameters](parameters/index.md) — the full list of input and output parameters for each concept. --- # Stages ![Stages configuration in the scenario editor](img/stages-1.png) Technologies go through stages for installation, use, and potential reuse. Each stage has its own associated costs and demands. You define which stages each technology can be in. Technologies can be installed at the start of a stage and reused or salvaged at its end. The design and operation stay the same within a stage, which lets you optimize long-term projects with multiple phases of investment. For parameters, see [Stages parameters](parameters/stages.md). !!! note Sympheny uses discounted cash flow (DCF) analysis to convert the total cost (represented by the net present cost, NPC) into an annual cost. See [Discounted cash flow analysis](discounted-cash-flow-analysis.md) for details. --- # Hubs ![Hubs step in the scenario editor](img/hubs-1.png) Sympheny lets you define different geographic areas or sites within your project as hubs. A hub can be an individual building or a group of buildings treated as a single unit. You specify the energy demands and exports for each hub, then explore ways to supply that energy using imports, on-site resources, conversion technologies, and storage technologies. Hubs can also be connected through a network technology, so you can model how energy flows between them. For parameters, see [Hubs parameters](parameters/hubs.md). --- # Energy carriers An energy carrier is any substance or medium that contains energy and can be converted, stored, or delivered — a gaseous or solid fuel, an electric charge, thermal energy, solar irradiance, and so on. You provide the energy carriers that are used throughout the rest of the model. For parameters, see [Energy carrier parameters](parameters/energy-carriers.md). For every stage, hub, energy carrier, and time step, the following energy balance is applied: ![Energy balance equation for stage, hub, energy carrier, and time step](img/energy-carriers-1.png) Where *t* is the time step. --- # Energy demands Energy demands represent energy use. For example, a building uses heat for heating and hot water, electricity for appliances and mobility, and cold for cooling. An energy demand can also represent an industrial process or the district heating network of an entire region. Energy demands shape the results, since every demand must be satisfied at every time step. For parameters, see [Energy demands parameters](parameters/energy-demands.md). An energy demand is a profile that specifies the energy consumption for every hour of a year — 8,760 hours, in kWh. Make sure your custom profiles align with Sympheny's calendar year, which starts at 00:00 on Monday, January 1st and ends at 23:00 on December 31st. The year 2018 is a good reference, since it begins on a Monday and is not a leap year. !!! tip All profiles are clustered — a proven method for reducing solving time without affecting the results. Hourly profiles in the results may therefore not match the original energy demand profiles exactly. See [Clustered profiles](clustered-profiles.md). --- # Imports Imports are energy purchased from outside the system, such as grid electricity or natural gas, at a price you define. Imports are configured together with exports in the [Imports & exports step](../how-to/modeling-scenarios/imports-exports-step.md) of the scenario editor. For resources with intermittent availability, see [On-site resources](on-site-resources.md), which also explains when to model a constantly available resource as an import instead. !!! info "Coming soon" A full concept page for imports is in preparation. --- # Exports Exports are energy sold or sent outside the system — for example, feeding electricity back into the grid. Exports are configured together with imports in the [Imports & exports step](../how-to/modeling-scenarios/imports-exports-step.md) of the scenario editor. !!! info "Coming soon" A full concept page for exports is in preparation. --- # On-site resources ![On-site resources step in the scenario editor](img/on-site-resources-1.png) On-site resources are renewable resources with intermittent (temporally varying) availability. In Sympheny, you can quickly generate solar irradiance profiles and wind profiles of 8,760 time steps using several methods. On-site resources are functionally identical to imports, with fewer available parameters. For resources with constant availability, like geothermal energy or air used in a heat pump, create an **import** with a fixed **maximum capacity (kW)** and without an **energy price (CHF/kWh)**, instead of creating an on-site resource. Energy produced from on-site resources can be curtailed. Curtailment occurs when the available on-site resource leads to higher energy production than required by demand and export (see the diagram below) at any given time. ![Curtailment of on-site resource production above demand and export](img/on-site-resources-2.png) ## Creating on-site resources Sympheny offers several workflows for creating on-site resources: - **Add new > Generate profile > Available resource area (m2)** — generate a solar profile using the Sympheny database; easy to create profiles for multiple hubs. - **Add new > Upload profile > Available peak load (kWp)** — upload your own normalized profile; easy to create profiles for multiple hubs. - **Add new > Upload profile > Generic availability (kWh/h)** — upload your own profile. - **Add from map > Solar resource > Optimize slope and azimuth** — explore the optimal orientation of solar panels relative to the demand profile. - **Add from map > Solar resource > Custom slope and azimuth** — accurately estimate the solar profile for a specific location, surface, and orientation. - **Add from map > Solar resource > Weighted sum aggregation** — generate an average solar profile from multiple surfaces on the map. - **Add from map > Wind resource** — generate a wind power production profile using terrain parameters. ## Add new Add a new on-site resource to your scenario. This resource is free and can be exploited whenever it is available. In the toolbox, select an **energy carrier** corresponding to the resource type. A **name** is generated based on the energy carrier and existing profiles, and can be edited. The **hub** and **stage** where the resource is available are selected automatically and can be edited. ![Adding a new on-site resource](img/on-site-resources-3.png) ## Available resource area (m2) When sizing a new solar PV field, the only available information may be the available resource area (m2) and the location. Select **Generate profile**, click **Generate profile**, then select the **database**, **location**, **type**, and **slope**, and click Next. Sympheny generates a solar irradiance profile for a 1 m2 surface area. ![Generating a solar profile from resource area](img/on-site-resources-4.png) The available resource area (m2) is the maximum available irradiance profile. The optimization result determines the optimal size of the solar technology to install. As curtailment may happen, the installed capacity is not always equal to the maximal operational capacity. ![Installed capacity versus maximal operational capacity](img/on-site-resources-5.png) ## Available peak load (kWp) When the hourly profile is measured or simulated using a third-party tool, you can use it in Sympheny with the **Upload profile** function. In this workflow, the maximum value of the uploaded profile should equal 1 kW. The total energy available depends on the **available peak load (kWp)**. The profile can be the output of the technology (for example, PV production or wind turbine production), provided the technology's efficiency is 100%. In that case, the kW-peak (kWp) refers to the maximum capacity of the technology that uses this on-site resource. !!! tip To upload a profile, select or drag and drop an .xlsx file with the correct format. The file must consist of a single sheet with 2 columns, no header, and exactly 8,760 rows. The first column must contain incrementing numbers from 1 to 8,760. The second column must contain the values for the hourly profile, for every hour of the year from 00:00 on January 1st to 23:00 on December 31st. Make sure the units are correct. The maximum file size is 2 MB. Uploaded profiles can be saved for later use. [Download the template profile (XLSX)](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/templates/example-energy-demand-profile.xlsx) For example, the hourly resource profile of **wind power** indicates the availability of wind-sourced electricity in kW per unit of peak load (kW/kWp). In this case, a conversion efficiency is already factored into the hourly resource profile, so the conversion efficiency of the wind turbine technology should be 100%. ![Wind power hourly resource profile](img/on-site-resources-6.png) The use of the on-site resource is determined by the optimal capacity of the technologies that utilize that resource. ![Optimal capacity determining on-site resource use](img/on-site-resources-7.png) ## Generic availability (kWh/h) This workflow is more flexible than the previous two. For example, you can use it to create an intermittent industrial waste heat profile. In this workflow, the uploaded profile should be in kWh for each hour of the year. ![Uploading a generic availability profile](img/on-site-resources-8.png) !!! tip You can download irradiation profiles from external databases such as [PVGIS](https://re.jrc.ec.europa.eu/pvg_tools/en/#MR) — just make sure the units are consistent with the Sympheny workflow. ## Add from map Add a new on-site resource to your scenario from the map. ![Adding an on-site resource from the map](img/on-site-resources-9.png) ## Solar resource > Optimize slope and azimuth Click **Select surface from map** to select a surface, like the outline of a hub, to get the surface area (m2) of the geometry and its geographic location. The optimizer defines the optimal slope and azimuth. ![Optimizing slope and azimuth for a solar resource](img/on-site-resources-10.png) ## Solar resource > Custom slope and azimuth Click **Select surface from map** to select a surface, like the outline of a hub, to get the surface area (m2) of the geometry and its geographic location. Specify the slope and azimuth. Possible settings: - **Slope 0°**: flat - **Slope 90°**: vertical - **Azimuth 0°**: south - **Azimuth -90°**: east - **Azimuth 90°**: west - **Azimuth 180° / -180°**: north ![Setting a custom slope and azimuth for a solar resource](img/on-site-resources-11.png) ## Solar resource > Weighted sum aggregation Calculate an aggregated solar profile, normalized in kW/m2, for all selected surfaces. The calculation accounts for the slope and azimuth of each roof element. The generated profiles are aggregated using a weighted average for each surface, with surface areas as weights. ## Wind resource Set **surface (m2)**, **terrain type**, **roughness length (m)**, and **height (m)** to generate a wind resource profile based on those parameters. - **Surface (m2)** should be the number of wind turbines multiplied by the total swept area per turbine. - **Terrain type** determines the terrain classification. - **Roughness length (m)** is based on the terrain type. - **Height (m)** is the height of the middle of the turbine. The maximum theoretical efficiency of the wind turbine technology, using this resource profile in kWh-wind, is 59.3%. For more information, see [Wind profile power law](https://en.wikipedia.org/wiki/Wind_profile_power_law). ![Generating a wind resource profile](img/on-site-resources-12.png) --- # Conversion technologies ![Conversion technologies step in the scenario editor](img/conversion-technologies-1.png) Conversion technologies are systems that transform one or more energy carriers into different types — for example, a gas boiler converting natural gas to heat. Each technology is defined by: - **Technical parameters**: efficiencies and technical limits. - **Financial and environmental parameters**: investment costs (CAPEX), operational costs (OPEX), and embodied emissions. For parameters, see [Conversion technology parameters](parameters/conversion-technologies.md). ## Technology modes A mode represents a specific operational regime with its own set of inputs, outputs, and efficiencies. A single technology can have multiple modes to reflect different seasonal or functional behaviors. - **Example**: a reversible heat pump has a heating mode and a cooling mode, each with a distinct coefficient of performance (COP). - **Configuration**: technical parameters are applied at the mode level, to allow for this granular operational modeling. ## Primary vs. non-primary modes To ensure costs accurately reflect physical hardware requirements, modes are categorized: - **Primary mode**: a mode whose sizing must be reflected in cost and CO2 emissions. The technology's costs are derived from the capacity requirements of these modes. - **Non-primary mode**: a "bonus" mode. Its capacity does not increase the technology's investment or operational costs, or its CO2 emissions — it represents secondary use of existing hardware. ## Mode capacity The capacity of a specific mode is the maximum hourly sum of all primary outputs recorded for that mode. You can choose between two sizing behaviors: - **Optimize mode capacity**: optionally enter a minimum and/or maximum installed capacity; the optimal capacity is selected within this range. If a minimum capacity is specified and the default option ![Default option toggle](img/conversion-technologies-2.png) is selected, the installed capacity can be 0 or greater than the minimum. - **Specify mode capacity**: installed capacity is held at a fixed value. Operating capacity (which does not influence investment costs) may be equal to or lower than installed capacity. ## Technology capacity The technology capacity represents the installed capacity of the unit and is used for cost and CO2 calculations. It equals the maximum total primary output summed across all primary modes at any single point in time. ### Example calculation - **Mode A peak (primary)**: 100 kW at hour 5. - **Mode B peak (primary)**: peak of 200 kW at hour 10. - **Peak of the sum of primary modes**: at hour 8, modes A and B produce a combined 250 kW. **Result**: the technology capacity is 250 kW. ## Mode efficiency The efficiency of a mode indicates energy dissipation within systems. The sum of output efficiencies represents the mode's total efficiency: - A total efficiency of 100% means useful energy is conserved within the system. - A total efficiency below 100% indicates useful energy is lost in the system — for example, heat losses in the technology, which are not modeled as a "waste heat" flow. - A total efficiency above 100% indicates useful energy is created within the system — for example, useful heat extracted from the environment, which is not modeled as an "ambient air" flow. ### Example: heat pump The efficiency of a standard input (with two inputs) is set as follows: | Input EC | Input share | Output EC | Output efficiency [%] | | -------------- | ----------- | --------- | ---------------------- | | Electricity | 100 | HT heat | **100** | | Ambient heat | 200 | | | The calculation is: **Output EC(i) = Sum of inputs × efficiency output(i)** **HT heat = (100 + 200) × 100% = 300** In this case, 100 units of electricity and 200 units of ambient heat produce 300 units of HT heat. This corresponds to a yearly COP of 3. In the app, the numbers are entered as follows: ![Heat pump efficiency entered in the app](img/conversion-technologies-3.png) ### Example: chiller For chillers, there are two ways to model cooling energy. The first method treats cooling energy as a service, meaning the energy is generated and supplied. For example, when modeling a chiller with an energy efficiency ratio (EER) of 2, the process is as follows: | Input EC | Input share | Output EC | Output efficiency [%] | | ----------- | ----------- | --------- | ---------------------- | | Electricity | 100 | HT heat | 300% | | | | Cooling | 200% | This means that an input of 100 units of electricity produces 200 units of cooling (based on an EER of 2) and 300 units of heating (assuming the electricity is fully dissipated as heat). 100 units of electricity give, in this case, 300 units of HT heat and 200 units of cooling, from which an EER of 2 is calculated. Here, the cumulative output efficiency is greater than 100%, which reflects the "creation" of energy — because cooling energy is treated as an additional service. In the app, the numbers are entered as follows: ![Chiller efficiency entered in the app](img/conversion-technologies-4.png) ### Alternative method: chiller There's also an alternative method where cooling energy is treated as an extraction of energy demand. To use this method, set the cooling demand to "reversed." In this case, the chiller can be modeled as a heat pump with an EER of 2 (or a COP of 3). | Input EC | Input share | Output EC | Output efficiency [%] | | ----------- | ----------- | --------- | ---------------------- | | Electricity | 100 | HT heat | 100% | | Cooling | 200 | | | In the app, the numbers are entered as follows: ![Alternative chiller method entered in the app](img/conversion-technologies-5.png) For this method, it's crucial that the **reverse** box is ticked for the cooling demand in the Energy Demands step — this treats cooling as an extraction of heat. ![Reverse checkbox in Energy Demands step](img/conversion-technologies-6.png) ## Simultaneity of operation Different modes can operate simultaneously. To prevent this, leave the **simultaneous** checkbox unchecked, indicating the mode cannot run with others. This may increase optimization time. ![Simultaneous operation checkbox](img/conversion-technologies-7.png) Alternatively, a less computationally intensive option is to define a different [seasonal or hourly operation](#seasonal-and-hourly-parameters) for each mode. Some advanced parameters are not available to all plan tiers, but can be added through add-on options. Contact customer support for a demo and to discuss customizing these options to your needs. ## Seasonal and hourly parameters You can enter time-varying efficiencies, either as monthly or hourly values. To do so, select **Time varying** instead of **Fixed** for the output EC efficiency. ![Time-varying efficiency setting](img/conversion-technologies-8.png) ### The case of heat pumps For heat pumps, if you want to apply a time-varying COP, modify the input EC share rather than the output efficiency — the input EC share is what defines the COP (= heat HT / electricity). See the example below: ![Time-varying input EC share for a heat pump](img/conversion-technologies-9.png) | | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | Electricity | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | | Heat ambient | 100 | 150 | 150 | 200 | 200 | 250 | 250 | 250 | 200 | 150 | 100 | 100 | | HT heat | 100% (stays fixed) | | | | | | | | | | | | | COP | 2 | 2.5 | 2.5 | 3 | 3 | 3.5 | 3.5 | 3.5 | 3 | 2.5 | 2 | 2 | ![Resulting COP curve for a heat pump](img/conversion-technologies-10.png) --- # Storage technologies Storage technologies are systems that store an energy carrier for later use — for example, batteries or thermal storage tanks. Like [conversion technologies](conversion-technologies.md), each candidate is defined by technical, financial, and environmental parameters, and the optimizer decides whether and at what capacity to install it. Storage candidates are added in the [Storage technologies step](../how-to/modeling-scenarios/storage-technologies-step.md) of the scenario editor. !!! info "Coming soon" A full concept page for storage technologies is in preparation. --- # Technology packages Technology packages are bundles of technologies that the optimizer considers together. They build on the individual [conversion](conversion-technologies.md) and [storage](storage-technologies.md) technology candidates defined in your scenario. !!! info "Coming soon" A full concept page for technology packages is in preparation. --- # Network technologies ![Network technologies](img/network-technologies-1.png) Network technologies are connections that move energy between [hubs](hubs.md) — for example, a district heating pipe or an electrical link. Network link candidates are added in the [Network links step](../how-to/modeling-scenarios/network-links-step.md) of the scenario editor. For connections that move energy within a single hub, see [Intra-hub networks](intra-hub-networks.md). !!! info "Coming soon" A full concept page for network technologies is in preparation. --- # Intra-hub networks Intra-hub networks are connections that move energy within a single [hub](hubs.md), in contrast to [network technologies](network-technologies.md), which connect different hubs. Network link candidates are added in the [Network links step](../how-to/modeling-scenarios/network-links-step.md) of the scenario editor. !!! info "Coming soon" A full concept page for intra-hub networks is in preparation. --- # Clustered profiles ## What are clustered profiles? In the optimization process, machine-learning-generated clustered profiles are used to improve performance. These profiles are created by grouping similar daily patterns from all hourly input data in Sympheny, including energy demand, on-site resources, and hourly tariffs. A reduced number of representative days (typical days) is selected, but the model still operates in hourly time steps, so variations within each day are preserved. The clustered profiles let Sympheny reconstruct the full annual profile from these representative days. !!! note These profiles remain consistent across all solutions within a given scenario. Clustering is performed for each [stage](stages.md), meaning all profiles used in a stage are clustered together. ## How are typical days generated? The Sympheny engine selects a specific number of typical days based on the overall hourly profiles provided and the chosen temporal resolution. These typical days are selected from the 365 possible days in a year, based on patterns identified across the combined profiles. ![Typical day selection from a year of hourly profiles](img/clustered-profiles-1.png) The clustered profiles are created from the selected typical days, which are repeated throughout the year. For instance, if 20 typical days are chosen, each of these days, comprising 24 hours, is used to represent the entire year, filling in the 365 days. Each typical day is linked to specific data across all profiles, so the original days are not mixed and matched — a typical day consistently represents the same day across all profiles, rather than different days for different profiles. Each typical day consists of 24 hours multiplied by the number of profiles. For example, in a system with two demand profiles (heating and electricity), if a typical day represents days 5, 8, 12, 23, 36, and 45 for the heating profile, it also represents those same days for the electricity profile. ## Temporal resolution The number of typical days selected is determined by the temporal resolution chosen in the execution step. ![Temporal resolution setting in the execution step](img/clustered-profiles-2.png) The following settings define three resolution levels, each specifying the range of typical days allowed and the corresponding error limits for load duration and total sum: - **Low**: - Minimum days: 5 - Maximum days: 50 - Max load duration error: 15% - Max sum error: 2% - **Medium**: - Minimum days: 15 - Maximum days: 100 - Max load duration error: 7.5% - Max sum error: 1% - **High**: - Minimum days: 30 - Maximum days: 200 - Max load duration error: 3% - Max sum error: 0.5% The clustering process also ensures that the non-zero maximum and minimum values of each profile are preserved, and maintains the linear combination of the profiles — the peaks of two or more profiles occurring at the same time step are conserved. ## Clustered profiles metrics The clustered profiles exhibit a similar load duration curve to the original profiles, while ensuring both the sum and peaks of the profiles are preserved. In the results folder, the `Output.xlsx` file, which you can download once the optimization is complete, contains a sheet titled `Clustered Profiles-[Scenario Name].xlsx` with the following metrics: - **Number of typical time steps**: the total number of time steps, calculated as 24 × typical days. - **Max load duration error (%)**: the maximum load duration error across all profiles. - **Max sum error (%)**: the maximum sum error across all profiles. The error function used to calculate these metrics is the symmetric mean absolute percentage error (SMAPE) for each profile, from which the maximum error percentage is derived. --- # Sympheny demand profiles methodology The demand profiles in Sympheny are based on different sources depending on the building use. They are stored in three levels, each contributing to the overall shape of the demand profile: - **Demand type** refers to the energy carrier. Space heating and cooling depend on a normalized weather profile, while the other profiles are stochastic — they depend on the time of use of different appliances. - **Building use** affects the shape of the profile. For example, an office building is generally closed on weekends and less occupied in summer, while a hospital operates at high capacity throughout the year. - **Building age or standard** is used to derive an energy intensity (kWh/m2/year), to estimate annual demand in kWh from the energy reference area (m2). The SIA standards include values of peak load in kW. When you select SIA standards, profiles are slightly reshaped to match the annual demand in kWh and the peak load in kW. In the database, all profiles are normalized for annual energy demand, meaning the sum of annual energy demand is 1 kWh. The profile is then "scaled" — multiplied by the actual energy demand. The demand profiles in Sympheny are based on different sources depending on the building use: - [Fraunhofer-Gesellschaft](https://www.fraunhofer.de/en.html), a German applied research institute, provided data for: - Administration / office - Hospitals - Multi-family house - Retail - Schools - Single-family house - Open-source data provided by [Rutgers, The State University of New Jersey](https://data.mendeley.com/datasets/rfnp2d3kjp/1) provided profile data for: - Hotel - Indoor swimming pool - Industry 2-shift fabricated metals - Industry warehouse - Swiss building standards SIA 380 and SIA 2024 provided additional data for the remaining profiles: - Assembly - Industry - Sports center - Warehouse ## Fraunhofer-Gesellschaft profiles The Fraunhofer-Gesellschaft residential profiles (multi-family house, MFH, and single-family house, SFH) were generated using the [SynPro tool](https://synpro-lastprofile.de/) in 2020. The four non-residential profiles were generated using their [synGHD tool](https://www.ise.fraunhofer.de/de/forschungsprojekte/synghd.html) in 2020. All profiles were generated using [weather data for Zürich, 2018](https://prod-eu-north-1-sympheny-public.s3.eu-north-1.amazonaws.com/docs/data/weather-data-zurich-2018.csv). ### Residential profiles #### Multi-family house (MFH) The simulation is based on a renovated building constructed up until 1978, with a typical use of a small multi-family dwelling (up to 10 units). U-values for walls, windows, and roof are 0.3 W/m2·K, 0.5 W/m2·K, and 0.2 W/m2·K, respectively. The following parameters are used: - Window-to-wall ratio: 0.23 - Area-to-volume ratio: 0.43 - Set-points: - Heating: 20°C - Cooling: 24°C #### Single-family house (SFH) The simulation is based on a one-occupant renovated building constructed up until 1978. U-values for walls, windows, and roof are 0.3 W/m2·K, 0.5 W/m2·K, and 0.2 W/m2·K, respectively. The following parameters are used: - Window-to-wall ratio: 0.19 - Area-to-volume ratio: 0.92 - Set-points: - Heating: 20°C - Cooling: 24°C ### Non-residential profiles The simulation is based on the following building age classes: - Offices: 2002 until today. - Hospitals, restaurants, schools, and shops: until 1978, renovated. The following parameters are used: - Set-points: - Heating: 20°C - Cooling: 26°C --- # Glossary Short definitions of the terms used throughout the Sympheny optimization model. Each term links to its concept page — read those for the full explanation and parameters. | Term | Definition | Read more | | --- | --- | --- | | Hub | A geographic area or site in your project — an individual building or a group of buildings treated as a single unit — for which you define demands, supply options, and connections. | [Hubs](hubs.md) | | Energy carrier | Any substance or medium that contains energy and can be converted, stored, or delivered — a fuel, electricity, thermal energy, solar irradiance, and so on. | [Energy carriers](energy-carriers.md) | | Energy demand | An hourly profile (8,760 values, in kWh) of energy use that the system must satisfy at every time step. | [Energy demands](energy-demands.md) | | Stage | A phase of investment and operation in a project's lifetime; technologies can be installed at a stage's start and reused or salvaged at its end. | [Stages](stages.md) | | Import | Energy purchased from outside the system, such as grid electricity or natural gas. | [Imports](imports.md) | | Export | Energy sold or sent outside the system. | [Exports](exports.md) | | On-site resource | A renewable resource with intermittent availability — such as solar irradiance or wind — described by an hourly profile. | [On-site resources](on-site-resources.md) | | Conversion technology | A system that transforms one or more energy carriers into different ones — for example, a gas boiler converting natural gas to heat. | [Conversion technologies](conversion-technologies.md) | | Storage technology | A system that stores energy for later use. | [Storage technologies](storage-technologies.md) | | Network technology | A connection that moves energy between hubs. | [Network technologies](network-technologies.md) | | Technology package | A bundle of technologies considered together in the optimization. | [Technology packages](technology-packages.md) | | Intra-hub network | A connection that moves energy within a single hub. | [Intra-hub networks](intra-hub-networks.md) | | Clustered profiles | Machine-learning-generated representative days that stand in for the full year of hourly input data, reducing solving time while preserving hourly variation within each day. | [Clustered profiles](clustered-profiles.md) | | Discounted cash flow (DCF) analysis | The method Sympheny uses to convert expected future cash flows into present value, accounting for the cost of capital, loan structures, and risk premiums. | [Discounted cash flow analysis](discounted-cash-flow-analysis.md) | | Capital recovery factor (CRF) | The factor Sympheny uses to convert a present cost into an equivalent annual cost, making investments with different lifespans comparable. | [Capital recovery factor](capital-recovery-factor.md) | For the full list of input and output parameters for each concept, see [Parameters](parameters/index.md). --- # Discounted cash flow analysis Sympheny uses discounted cash flow (DCF) analysis to determine the present value of expected future cash flows. This approach is crucial for long-term energy projects, as it accounts for financing factors such as the cost of capital, loan structures, and risk premiums — ensuring that both initial investments and future cash flows are properly evaluated. **Interest rate:** - **Interest rate as financing cost**: when you take out a loan (especially an amortized one, with regular payments), the interest rate directly reflects the cost of borrowing that money — it's what the lender charges you. - **Discounting future cash flows**: the interest rate can also be used to calculate the present value of money expected in the future (a process called discounting). In this case, it reflects the opportunity cost of capital — the return you might earn if you invested the money elsewhere. A risk premium is added to this rate to cover risks such as price fluctuations or project-specific uncertainties. - **Dual use**: in practice, the interest rate is often used both as the cost of financing and as part of the discount rate. The effective discount rate can be constructed by combining the cost of financing with an additional risk premium. **Inflation rate:** The inflation rate is the expected annual percentage increase in the general price level of goods and services. It indicates the decline in the purchasing power of money over time and plays a critical role in long-term financial analysis, since it affects both the costs and revenues of future cash flows in real terms. The assumption is that the rate of inflation is the same for all costs. **Discount rate:** This rate converts future cash flows into their present value, reflecting the opportunity cost of capital and associated risks. The discount rate is derived by adjusting the nominal interest rate for inflation, producing a real rate that excludes inflation effects. ![Discount rate formula](img/discounted-cash-flow-analysis-1.png) The discount rate also plays a key role in converting one-time costs into an equivalent annual cost (EAC). This is done using the [capital recovery factor (CRF)](capital-recovery-factor.md). **Weighted average cost of capital (WACC):** In energy planning, the WACC is often used as the discount rate in DCF analysis. When cash flows are expressed in real terms (with inflation already accounted for), you might set WACC as the interest rate with inflation assumed to be zero, which results in the discount rate aligning with the interest rate. In Sympheny, you define these parameters along with other inputs in the Stage Parameters step. See [Stages parameters](parameters/stages.md) for details. --- # Capital recovery factor In Sympheny, the net present cost (NPC) is used to calculate the present value of all cash flows over a project's lifetime, taking into account the time value of money. NPC represents the discounted sum of all costs and revenues for every component in each stage. ![Net present cost formula](img/capital-recovery-factor-1.png) The equivalent annual cost (EAC) converts investments with different lifespans or cash flow patterns into uniform annual payments, making it easy to compare projects. To determine the EAC, start by calculating the capital recovery factor (CRF): ![Capital recovery factor formula](img/capital-recovery-factor-2.png) Where *i* is the [discount rate](discounted-cash-flow-analysis.md), and *n* is the number of years in a stage. Finally, the EAC is calculated using the CRF, which transforms the total NPC into an equal annual cost over the project's duration: ![Equivalent annual cost formula](img/capital-recovery-factor-3.png) --- # Parameters Reference definitions for every parameter used to build and read a Sympheny scenario. - [Input parameters](input-parameters.md) — the data you provide in the input Excel file, organized by worksheet: - [General parameters](general.md) - [Stages parameters](stages.md) - [Hubs parameters](hubs.md) - [Energy carriers parameters](energy-carriers.md) - [Conversion technology parameters](conversion-technologies.md) - [Energy demands parameters](energy-demands.md) - [Output parameters](output-parameters.md) — the results Sympheny produces after solving a scenario. --- # Input parameters Sympheny lets you consolidate all your input data into a single Excel file. This file is organized into separate worksheets, with each worksheet representing a specific component of your scenario model: - [General parameters](general.md) - [Stages parameters](stages.md) - [Hubs parameters](hubs.md) - [Energy carriers parameters](energy-carriers.md) - [Conversion technology parameters](conversion-technologies.md) - [Energy demands parameters](energy-demands.md) !!! note Any parameter without a default value is required. --- # General parameters | Parameter | Definition | Unit | Default | | --- | --- | --- | --- | | Currency | The currency specified is used to interpret the cost parameters in the input file. It does not influence the model itself; it is solely for parsing the input file and ensuring accurate representation of cost units in the web application and results. | – | CHF | | Exchange Rate | The exchange rate from CHF is applied to all economic data in the technology databases. | – | 1 | --- # Stages parameters | Parameter | Definition | Unit | Default | | --- | --- | --- | --- | | Stage Name | The name of the stage; each name must be unique. | – | – | | Stage Length | The duration of the stage in years. | Years | – | | Order | The chronological order of the stage. | – | – | | Interest Rate | The interest rate reflects the percentage paid for borrowing money through an amortized loan. It can also be used to discount future cash flows and reflects the opportunity cost of capital. This rate is used along with the inflation rate to calculate the [discount rate](../discounted-cash-flow-analysis.md). | Percentage | 0 | | Inflation Rate | The inflation rate indicates the expected annual increase in prices, which is used along with the interest rate to calculate the [discount rate](../discounted-cash-flow-analysis.md). | Percentage | 0 | --- # Hubs parameters | Parameter | Definition | Unit | Default | | --- | --- | --- | --- | | Hub Name | The name of the hub; each name must be unique. | – | – | --- # Energy carriers parameters | Parameter | Definition | Unit | Default | | --- | --- | --- | --- | | Energy Carrier Name | The name of the energy carrier; each name must be unique. | – | – | | Energy Carrier Type | The type of the energy carrier. Only used to determine the default color. | – | – | | Energy Carrier Subtype | The sub type of the energy carrier. Only used to determine the default color. | – | – | | Energy Carrier Color | The HEX color code of the energy carrier. Only used for the energy hub diagram and results dashboard. | – | – | --- # Conversion technology parameters | Parameter | Definition | Unit | Default | | --- | --- | --- | --- | | Technology Name | The name of the technology; must be unique within the scenario. | – | – | | Virtual Technology | A virtual technology is a technology used purely for accounting purposes in the optimization. It converts one energy carrier to another at zero cost and with 100% efficiency. If set to true, the efficiency, costs, and other values are automatically fixed to these values. | – | – | | Stages | List of stages where the installation and operation of this technology are permitted. | – | – | | Hubs | List of hubs where the installation and operation of this technology are permitted. | – | – | | Installation Options | These options are mutually exclusive, meaning only one can be selected at a time. Options: Can be installed, Must be installed, Must be installed in at least one hub. | – | Can be installed | | Primary Modes | At least one primary mode must be selected. The primary modes of a technology define which modes are used to calculate costs that depend on capacity. | – | – | | Seasonal & Hourly Operation | Specifies the allowed seasons for the technology's operation. If hourly operation is selected, you can upload a profile with values ranging from 100% to 0%, indicating the max allowable operation per hour as a percentage of installed capacity. | % (profile values) | – | | Input Energy Carriers | The input energy carriers of a technology mode; you can select multiple. | – | – | | Output Energy Carriers | The output energy carriers of a technology mode; you can select multiple. | – | – | | Input EC Share | For multi-input technologies, defines the ratio between inputs, representing the share of energy contributed by each energy carrier (EC). Values are absolute and can exceed 100. | – | – | | Output EC Efficiency | The conversion efficiency for producing a specific energy carrier in a mode relative to total inputs. | % | – | | Primary Output | Each technology mode must have a primary output energy carrier defining the mode's capacity for capacity-dependent cost calculations. | – | – | | Technology Capacity | Select whether to optimize capacity or specify capacity manually. | – | – | | Capacity | The pre-defined fixed capacity of the technology mode, determined by primary output energy carriers; visible only if Specify Capacity is selected. | kW | – | | Maximum Capacity | The maximum allowable capacity of the technology mode, determined by primary output energy carriers; visible only if the Optimize option is selected. | kW | – | | Minimum Capacity | The minimum allowable capacity of the technology mode, determined by primary output energy carriers; visible only if the Optimize option is selected. | kW | – | | Maximum Annual Output | The maximum allowable annual energy output of the technology mode, determined by primary output energy carriers. | kWh/year | – | | Minimum Annual Output | The minimum allowable annual energy output of the technology mode, determined by primary output energy carriers. | kWh/year | – | | Curtailment Limitation | The percentage of maximum power capacity that cannot be curtailed. For example, 100% means no curtailment is possible. | % | 100% | | Peak Power | Ratio of maximum operational power to installed capacity, allowing operation at higher or lower power levels without changing installed capacity or costs. | kWmax/kW | 1 | | Minimum Part Load | If greater than 0%, indicates the technology's lower operational capacity limit as a percentage of installed capacity. | % | – | | Minimum Up Time | Constrains the mode to remain operational for a minimum number of hours once started. | Hours | – | | Minimum Down Time | Constrains the mode to remain non-operational for a minimum number of hours once shut down. | Hours | – | | Simultaneous Operation | If False, prevents this mode from operating simultaneously with other modes within this technology. | – | True | | Lifetime | The technical lifetime of the technology in years, used for calculating replacement costs and salvage value. | Years | – | | Fixed Investment Cost | Fixed investment costs incurred upon installation regardless of size. | Currency | – | | Variable Investment Cost | Variable investment costs per kW of installed capacity, determined by primary output energy carriers of primary modes. | Currency/kW | – | | Fixed O&M Cost | Fixed operation and maintenance costs incurred annually. | Currency/year | – | | Variable O&M Cost | Variable operation and maintenance costs incurred annually, based on: percentage of total investment, per installed kW, or per total production. | %/year, Currency/kW/year, Currency/kWh/year | – | | Fixed Replacement Cost | Fixed replacement costs incurred when the technology is replaced at end of technical lifetime, regardless of size. | Currency/year | – | | Variable Replacement Cost | Variable replacement costs incurred when the technology is replaced at end of lifetime, based on percentage of total investment or per installed kW. | %, Currency/kW | – | | Fixed Salvage Value | Fixed salvage value incurred when the technology is salvaged at end of an investment stage, regardless of size. | Currency/year | – | | Variable Salvage Value | Variable salvage value incurred when the technology is salvaged at end of an investment stage, based on percentage of total investment or per installed kW. | %, Currency/kW | – | | Fixed Embodied CO2 | Fixed embodied CO2 emitted when the technology is installed, regardless of size. | kg-CO2 | – | | Variable Embodied CO2 | Variable embodied CO2 emitted, based on installed kW or total production. | kg-CO2/kW, kg-CO2/kWh/year | – | | Variable Captured CO2 | CO2 captured during operation, expressed per kWh of total input energy carrier of primary modes. | kg-CO2/kWh/year | – | Certain **advanced parameters** are not available to all plan users, but can be added through our add-on options. Contact our customer support team for a demo and to discuss how we could customize these options to your needs. --- # Energy demands parameters | Parameter | Definition | Unit | Default | | --- | --- | --- | --- | | Energy Demand Name | The unique name used to identify the energy demand within the scenario. | – | – | | Hubs | List of hubs where the energy demand occurs. Each demand must be linked to at least one hub. | – | – | | Stages | List of stages during which the demand is active. Each demand must be assigned to at least one stage. | – | – | | Energy Carrier | The energy carrier of the energy demand. | – | – | | Energy Price | The price of the energy used to meet the demand. A positive value represents a revenue, while a negative value represents a cost. | CHF/kWh | – | | Profile Name | The name of the hourly profile that defines the energy demand. | – | – | | Reverse | Indicates whether the demand is considered to be negative, i.e., whether the system consumes energy rather than produces it. | – | False | --- # Output parameters Output parameters are the values Sympheny reports after an optimization run — the counterpart of the [input parameters](input-parameters.md) you configure when modeling. They appear in the results dashboard and in the downloadable result files (see [Scenario results](../../how-to/scenario-results.md)). !!! info "Coming soon" A full output parameters reference is in preparation. --- # What's new Release notes for the Sympheny web application, newest first. - [November 2025](2025-november.md) - [April 2024](2024-april.md) - [March 2023](2023-march.md) - [January 2023](2023-january.md) - [November 2022](2022-november.md) - [September 2022](2022-september.md) - [June 2022](2022-june.md) - [May 2022](2022-may.md) - [April 2022](2022-april.md) - [March 2022](2022-march.md) - [November 2021](2021-november.md) --- # November 2025 **Sympheny: energy-model faster. See more. Share better.** Sympheny deployed a set of upgrades that make it easier to prepare data, run focused optimizations, and communicate results — at building, site, and district scales. ## What's new at a glance - **Download GIS data (now with building-level detail).** Export the spatial layers you create in Sympheny — complete with per-building attributes — for downstream GIS, CAD, or reporting workflows. ![Downloaded GIS data with building-level attributes](img/2025-november-1.png) ![Building-level GIS export detail](img/2025-november-2.png) - **Single-objective runs.** Run scenarios against one chosen objective (e.g., cost or CO₂) when you want a fast, focused answer. ![Single-objective run configuration](img/2025-november-3.png) - **Global OpenStreetMap queries.** Pull international OSM layers directly in Sympheny to accelerate site setup anywhere in the world. ![Global OpenStreetMap query results](img/2025-november-4.png) - **Network visualization + KPIs (Dashboard v3).** See optimized networks on the map and track headline KPIs (e.g., cost, CO₂, capacities) at a glance. ![Dashboard v3 network visualization and KPIs](img/2025-november-5.png) - **EnyMap (light mode).** Create scenarios from a simple Excel input file — perfect for rapid "what-if" variants without full model authoring. - **EnyTool.** A companion toolkit for power users to automate data prep and batch scenario runs. See [EnyTool](../how-to/enytool/index.md). ![EnyTool batch scenario workflow](img/2025-november-6.png) - **Multi-language UI.** Use Sympheny in multiple languages (initially including English, German, French, and Italian), with easy switching per user. ![Multi-language UI language switcher](img/2025-november-7.png) ## Benefits - **Less prep time:** bring in global context fast and export clean GIS for stakeholders. - **Faster answers:** single-objective runs speed up iteration. - **Clear storytelling:** network views and KPIs turn results into decisions. - **Scale your workflow:** EnyMap and EnyTool enable variant generation and automation. - **Work your way:** collaborate across teams and regions with a multi-language interface. --- # April 2024 **Exciting news: Sympheny's web app Version 3 is here!** We are thrilled to announce the release of the latest version of our web application! This release is packed with exciting features and improvements that will enhance your experience and empower you to achieve even more with our platform. Here are some highlights of what you can expect from this new release: 1. **Enhanced optimization engine**: Sense — energy hub solver engine 2. **New multi-stage interface** 3. **New dashboard interface** In addition to these new features, we have made several performance enhancements and bug fixes to ensure a smoother and more reliable user experience. We have prepared detailed documentation and resources to help you familiarize yourself with the new features and get the most out of them. Our customer support team is also available to assist you with any questions or concerns you may have. **What does it mean to you?** - Existing projects: - Your current projects in Version 2 remain available with the known interface. - To upgrade an existing project into Version 3 to leverage its benefits, you have to actively migrate the project. - New projects: - When creating a new project, you can currently choose whether to use the existing version (V2) or the new Version 3 (labelled as beta until 31 May). V2 will only receive bug fixes and no further development. We recommend adopting V3 for its ongoing support and access to all-new functionalities. - As of 1 June 2024, V3 is the default for any new project. **Summary of timeline:** - **29 April 2024**: V2 and V3 are available. You may migrate existing projects to V3 or continue working in the current V2 version. - **17 June 2024**: V3 becomes the default version for new projects. - **30 June 2024**: V2 is no longer supported. **How can I learn more about Sympheny Version 3?** - In June/July 2024, Sympheny hosted tutorials on the new version and its benefits. Contact us to register for specific trainings. **So what is new, and does it change the way of modelling?** - The modelling and parameters remain the same. Additional features available in V3 are listed below. ## User experience These new features are available for projects in both V2 (previous default version) and V3: - Download input files for previously executed scenarios - Compare multiple input files via API - Satellite map layer ## New optimization engine: Sense (available as Sympheny V3) The following new features are available for projects in V3: - **User experience enhancements** - **Performance boost:** achieve up to 5x faster executions for a smoother user experience - **Infeasible model insights:** clearer infeasibility messages provide insight into model limitations - **Enhanced readability:** input and output Excel sheets are now more user-friendly - **Execution history:** access past executions effortlessly, with options to download or delete - **Hourly clustered profiles:** hourly profiles clustered from user input data are now available as information - **Editable energy carriers:** personalize colors for energy carriers, reflected in the results dashboard for easier identification - **Modeling multi-stages** - **Long-term planning:** multi-stage technology deployment enables strategic long-term planning - **Technology reusability:** deployed technologies can be reused across planning stages, optimizing resource utilization and cost-efficiency - **Cost considerations:** calculate replacement costs and salvage values, enhancing financial planning - **Optimization objectives** - Choose from various new objectives including NPV, CAPEX, OPEX, import energy minimization, and more - **New results dashboard** - **Usability enhancements:** navigate scenarios seamlessly, download high-resolution graphs, and access specific data effortlessly - **Interactive energy diagrams:** engage with dynamic energy diagrams for intuitive visualization - **New modeling features** - **Imports and exports** - Allow multiple energy carriers per hub - Specify hourly max capacities, energy prices, and CO2 intensity - Support negative energy prices - **Demands** - Allow multiple energy carriers per hub - Define hourly demand sale prices - Enable reversing demand energy flow (energy extraction demand) - **On-site resources** - Allow multiple energy carriers per hub - **Conversion Technologies** - Specify multiple primary modes and outputs to make cost calculations and operational limits more flexible - Set design and operational parameters per mode - Define hourly efficiency, input shares, and allowed operation as a percentage of capacity - Specify peak power to allow technologies to operate above or below the design capacity - **Network Technologies** - Define maximum and minimum capacities per link - Specify hourly network losses - **Storage Technologies** - Specify hourly standby losses - Define variable O&M costs per total charging and discharging energy - **Execution parameters** - Set maximum execution time per job - Control resolution of hourly clustered profiles --- # March 2023 ## Database Center Update or replace all the different types of databases of your organization or your user at once with an Excel file. You can also download all the databases as an Excel file. [Learn more](../how-to/database-center/index.md) ## Share projects with other users Share your projects with your colleagues or other users so you can collaborate with them easily. [Learn more](../how-to/managing-projects.md) ## API documentation The documentation of how to use the Sympheny API in your own application is now available from the navigation bar of the Sympheny web app. ![API documentation link in the Sympheny web app navigation bar](img/2023-march-1.png) ## Visualize geoadmin data Visualize geoadmin data in Switzerland provided by the BAFU, such as CO2 emissions for each of the selected buildings in your site's hubs. ![Geoadmin CO2 emissions data overlay](img/2023-march-2.png) --- # January 2023 ## Peak shaving of energy demand profiles Upload an energy demand profile as an aggregation of several profiles and perform stochastic peak shaving on the demand profile. [Learn more](../how-to/modeling-scenarios/energy-demands-step.md) ## Control granularity (and speed) of the optimization Choose between three different speeds for the execution of your optimization. The granularity/precision of the optimization results changes depending on the speed selected. [Learn more](../how-to/executing-scenarios.md) ![Optimization speed selection](img/2023-january-1.png) ## Hourly efficiencies for Conversion Technologies Upload an Excel file of different energy efficiencies per hour for your Conversion Technology candidates. ## Updated EV batteries to run overnight EV batteries can now be plugged in and out overnight, from one day to the next. ## Updated API to execute and get results outside the Sympheny web app Execute, monitor, and get the results of your energy system optimization externally using your own software/platform instead of using the Sympheny web app. ## Receive example projects in your account The Sympheny team can send you project examples relevant to your type of project, to help you understand the modelling possibilities for your specific case. ## New plots of total investments in results dashboard - Total investments per optimal solution - Total investments per energy hub - Total investments per energy hub and technology ## Interface language in German More languages are coming soon. ## Undo & redo actions in your scenario Return to previous actions while you model your scenario. Only available for some windows; it will be available for all sections soon. --- # November 2022 ## EV Battery charging and discharging Add Electric Vehicle (EV) Battery smart charging and discharging to your system optimization. These batteries are fixed storage units that can provide daily flexibility to your energy system. --- # September 2022 ## New navigation page for projects Geolocate and organize all your projects at once on the same map. Order projects easily by name, favorite, or date created. A new sidebar gives access to the main sections of your project: *Design*, *Execution*, and *Results* of your scenario optimizations. ## CO2 Capture Technology candidates Evaluate Technology candidates in your scenario optimization that are able to capture and/or emit CO2 in their operation. CO2 streams can also be modelled to consider more complex CCS (Carbon Capture and Storage) systems. ## Upload and download geojson layers in/from the map Add GIS datasets (geojson) with basic geometry, building, and infrastructure information to the map of your scenario. Download the same data (geojson) and the information included for each energy hub of your scenario. ## Add building data (in Excel) to the map Directly upload your own building data based on the EGID identifier from Excel to the GIS map of Sympheny. ## New API service Integrate the Sympheny optimization engine and other services in your own software application. ![Sympheny API service overview](img/2022-september-1.png) --- # June 2022 ## How to model specific technologies A new section in the user guide is added with detailed explanations of how to model specific Technology candidates, such as: - Heat Pumps - Electrical Chiller - Reversible Heat Pump - Groundwater Heat Pump - Geothermal Heat Pump - Wastewater Heat Pump - Free Cooling - Ice Storage ## Sustainability labels In [scenario results](../how-to/scenario-results.md) you can now find relevant sustainability labels achieved by your optimized energy system. More labels will be added soon. ![Sustainability labels in the results dashboard](img/2022-june-1.png) --- # May 2022 ## Draw Network Link candidates in the map [Watch: drawing Network Link candidates in the map](https://youtu.be/TPEpZiqETcc) ## Interactive maps in Dashboard results [Watch: interactive maps in Dashboard results](https://youtu.be/WnuIMQoT7-U) --- # April 2022 ## Dynamic tariff for import & export candidates ## Change of currency in a scenario ## Time varying input share for Conversion Technology candidates ## MFA (multi-factor authentication) at log in To protect your organization against lost or stolen credentials, you can request the use of MFA to log in to your Sympheny account. ## Dynamic CO2 intensity for import & export candidates --- # March 2022 ## GIS definition of your urban site [Watch: GIS definition of your urban site](https://www.youtube.com/watch?v=w-XKBjAswL0&ab_channel=UrbanSympheny) ## SEP GIS data (add-on) ### How to show the data of selected buildings? [Watch: showing data of selected buildings](https://www.youtube.com/watch?v=dUMKo3XbN58) ### How many buildings can I query? Each add-on subscription gives access to a specific number of building queries. The current add-on subscription packages are the following: - SEP Add-on Small: access to information for 1 to 1,000 buildings - SEP Add-on Medium: access to information for 1,000 to 50,000 buildings - SEP Add-on Large: access to information for 1,000 to 50,000 buildings The amount of remaining building queries according to the selected subscription can be read from the My Profile window. ### What type of data is available? With the SEP add-on for Sympheny, you can get the data you need directly from the embedded GIS map on the web application. SEP provides data from its catalogue directly in Sympheny, including: - Building area and building category - Yearly heating and hot water demand of the building - Roof geometries of the building - Facade geometries of the building - If available: Minergie data, including standard and Minergie energy reference area ## On-site resource candidates Sympheny's step 4 Solar Resources is now **On-site Resources**. This means you can integrate hourly energy profiles for any type of On-site Resource candidate — be it *Wind*, *Tidal*, *Process waste heat*, or any other user-defined energy carrier. ## Add on-site resources directly from the GIS map Now you can select the available resource area of your urban site and automatically assign the on-site resource potential profile in kW/m2. ## New plots in results dashboard - Plot of total cost/income balance with cost breakdown of technologies - The same plot across the hubs of the system - Plot of imports vs. exports & demand of the system - Plot of on-site resources results ## New Help Center (user guide, tutorials, etc.) With this new portal it's now easier to navigate through all the documentation and resources available about Sympheny software. ![Sympheny Help Center portal](img/2022-march-1.png) --- # November 2021 ## Technology packages Save time by loading predefined sets of technologies into your project with one click. Create your own technology packages and save them for future use. ## Demand profiles generator Generate hourly energy demand profiles for different types of buildings, directly in the Sympheny web app. ## Bill Gates's Green Premium See the Green Premium of your optimal solutions, now automatically calculated in your dashboard. ## Project sharing Send your Sympheny projects to your colleagues, or to any other Sympheny user, with the click of a button. ## Expanded dashboards Gain more insight into the cost breakdown of your optimal solutions. ## Expanded technology databases Extended and more easily navigable databases of energy conversion and storage technologies. ## Organization-specific workflows Need to customize your Sympheny workflow with a tailored module? Now we can do that. ## Time varying efficiencies Assign a different energy efficiency per month for your Conversion Technology candidates. ## O&M cost as % of total investment costs Define fixed O&M cost of Conversion, Storage and Network Technologies as a % of the total investment cost. ## Expanded databases for demands and supply technologies Extended databases for Energy Demands (including SIA 2024 profile scaling), Conversion and Storage Technology candidates. ## And more - Define capacity costs for your Import/Export Energy Carrier candidates - Specify storage charging and discharging efficiencies - Specify up to 3 modes per technology - Expanded solar irradiation databases - Receive more specific feedback from our validation engine to help you quickly fix your scenario setup in case of failed execution --- # Troubleshooting and FAQs If you run into a problem, start here. - [FAQs](faqs.md) — answers to common questions about optimization and modeling in Sympheny. - [Common issues and solutions](common-issues.md) — fixes for issues you may run into. - [Contact support](contact-support.md) — how to reach the Sympheny team. --- # FAQs What does "optimization" exactly mean, and how is it applied in Sympheny? Our senior software development engineer, Youssef Sherif, answers a few questions that might have popped into your mind. ## What are the biggest challenges when planning a complex energy system? And why do we need optimization? Planning complex energy systems with sector coupling is more challenging than typical centralized energy systems. In terms of modeling, the degrees of freedom have become overwhelming. As a result, only simulating a few sets of system designs (i.e., rule-based search) to determine the optimal system design and operation runs the risk of missing out on optimal solutions. Although one could guarantee optimality by potentially iterating all possible system designs (i.e., brute-force search), such an approach is confined to small-scale systems because the number of possible solutions grows exponentially as the site grows. To identify optimal solutions, Sympheny's solver uses mathematical optimization. Relative to traditional methods, this approach not only guarantees optimality of results but also effectively handles large-scale systems. Sympheny is a powerful energy system optimization tool that streamlines the process of creating a mathematical model and solving it, letting you focus on designing the best system possible. ## What is mathematical optimization? And how does Sympheny apply it? Mathematical optimization is a sophisticated analytical tool that lets you describe complex real-world problems in a mathematical model and find a solution that optimizes an objective while adhering to user-defined constraints. It has a wide range of applications in manufacturing, scheduling, transportation, economics, control engineering, marketing, policy modeling, and more. Sympheny uses mathematical optimization to identify cost-effective and emission-minimizing system designs and operation strategies for new and existing sites. ![Mathematical optimization applied to energy system design](img/faqs-1.png) ## What is required to prepare and solve an optimization problem? An optimization problem or model consists of the following elements: 1. **Variables** (e.g., technology capacity variables, production per time step, binary variables (install or not install a technology)) 2. **Constraints and bounds** (e.g., max production per time step, max capacity) 3. **Objective function** (e.g., total cost/profit, total emissions) A typical optimization problem starts by defining the variables in the model. In the case of Sympheny, the variables are technologies, energy carriers, energy networks, etc. Then, constraints of these variables, such as maximum capacity, seasonal operation, and charging/discharging behaviors, are defined. Finally, the objective functions are set. Once the optimization problem is defined, it is solved mathematically to find the best set of values for all variables that minimize/maximize the objective function while satisfying all constraints in the model. ## How can I share a project with another user? You can share any project with another user by opening the options menu on the three-dot button and clicking **Send Project Copy**. ![Sharing a project via the three-dot options menu](img/faqs-2.png) ## How can I give priority to the use of a type of electricity (e.g. grid electricity vs. renewable electricity from PV) for a Conversion Technology? ![Multiple electricity inputs for a Conversion Technology](img/faqs-3.png) Within a multiple-input system, priority is a variable of the optimization, so the optimization engine chooses whichever input is most favorable for reaching the objectives of the optimization. For the best solution in terms of minimizing CO2, this means the optimization always favors renewable electricity over grid electricity (assuming the grid electricity has a higher CO2 intensity than the renewable electricity, which is true in most cases — except, for example, if you have very clean electricity from the grid and on-site production with PV and batteries with high grey energy). For the best solution in terms of minimizing life-cycle cost, this means the optimization favors PV when the price of buying grid electricity is higher than selling renewable electricity: it maximizes the internal use of renewable electricity automatically, and chooses renewable electricity (from your PV) over grid electricity for the Heat Pump. If installing a PV system is too expensive to be favored by the optimization while being necessary in your system design, you can force-install this technology under the **Optimization Options** tab. ## Can a Heat Pump and a Chiller also be installed as a bivalent system? ![Heat Pump and Chiller installed as a bivalent system](img/faqs-4.png) Yes — it's possible to use the waste heat of a cooling Technology candidate as an input for another Technology candidate (e.g., a Heat Pump). ## Why is the maximal energy produced by a Technology Candidate higher than the Optimal Capacity given in the results system diagram? This is because the Optimal Capacity given in the system diagram represents the capacity of the (selected) primary output, while the output given in the results plot "Energy Flow Out" is the combined output. In the example below, the Chiller candidate is dimensioned to an Optimal Capacity of 420 kW, but the maximal production in the results plot is 800 kWh/h for the combined outputs (Cooling and Waste Heat): ![Chiller candidate optimal capacity versus combined energy flow output](img/faqs-5.png) ![Combined output breakdown for the Chiller candidate](img/faqs-6.png) --- # Common issues and solutions !!! info "Coming soon" This page is in preparation. In the meantime, check the [FAQs](faqs.md) for answers to common questions, or [contact support](contact-support.md). --- # Contact support The fastest way to reach us is the [Sympheny support portal](https://urbansympheny.atlassian.net/servicedesk/customer/portal/2) — raise a request there for support questions, bug reports, and feedback. You can also click the **Help** button in the bottom-right corner of the web app, or email [support@sympheny.com](mailto:support@sympheny.com). --- # REST API The Sympheny REST API gives you programmatic access to everything you can do in the Sympheny web application: create projects and analyses, model energy hubs, demands, supply technologies and networks, run optimizations, and integrate Sympheny into your own tools and workflows. If you work in Python, the [Python SDK](../sdk/index.md) wraps this API with typed methods and automatic authentication — prefer it over calling the API directly. ## Base URL All requests go to a single host: ``` https://eu-north-1-api.sympheny.com ``` The path prefix selects the API area: | Prefix | Area | What it covers | | --- | --- | --- | | `/sympheny-app` | Web application | Projects, analyses, scenarios, hubs, energy carriers, demands, technologies, networks. | | `/backoffice` | Account | Access tokens and your user profile. | | `/sense-api` | Solver | Submitting solver jobs, tracking their progress, and your job quota. | ## Authentication Every endpoint except the token endpoint requires a Bearer token in the `Authorization` header. See [Authentication](authentication.md) for the login flow. ## Versioning Some web application endpoints carry a version segment in the path (`v2`, `v2_1`, `v2_2`). The [reference](reference/projects.md) documents the current version of each operation — use the paths exactly as shown there. ## Responses and errors Web application (`/sympheny-app`) endpoints wrap every response in an envelope: ```json { "data": { ... }, "status": { "code": "...", "desc": "...", "message": "..." } } ``` The payload is in `data`; `status` carries a machine-readable code and a human-readable message. Account (`/backoffice`) and solver (`/sense-api`) endpoints return the payload directly and report errors as a JSON object with a `detail` field. Errors use conventional HTTP status codes: `400` for invalid input, `401` for a missing, invalid, or expired token, `403` when the action isn't permitted for your account, `404` for an unknown resource, `409` for conflicts (for example a duplicate name), and `422` for request validation failures on account and solver endpoints. ## Known issues Some endpoints have surprising behaviors with client-side workarounds. They are tracked in [KNOWN_ISSUES.md](https://github.com/urban-sympheny/sympheny-toolbox/blob/main/KNOWN_ISSUES.md) in the SDK repository. ## Reference The [API reference](reference/projects.md) documents all operations, grouped by resource — each page lists the operations' parameters, request and response schemas, and example requests. ## API Explorer Prefer trying requests as you read? The [API Explorer](explorer.html){ target="_blank" rel="noopener" } renders the same specification interactively with live "try it" support — paste a [bearer token](authentication.md) and send requests straight from the browser. It opens in a new tab; this reference stays the canonical documentation. --- # Authentication The API authenticates with JWT Bearer tokens. You exchange your Sympheny account credentials (the email and password you use to log in to the web application) for an access token, then send that token with every request. ## Get a token Call [`POST /backoffice/auth/ext/token`](reference/auth.md#operation-post_oauth_webapp_backoffice_auth_ext_token_post) with your credentials: === "curl" ```bash curl -X POST "https://eu-north-1-api.sympheny.com/backoffice/auth/ext/token" \ -H "Content-Type: application/json" \ -d '{"email": "you@example.com", "password": "..."}' ``` === "Python" ```python import httpx response = httpx.post( "https://eu-north-1-api.sympheny.com/backoffice/auth/ext/token", json={"email": "you@example.com", "password": "..."}, ) response.raise_for_status() token = response.json()["access_token"] ``` The response contains the token and its lifetime in seconds: ```json { "access_token": "eyJhbGciOi...", "token_type": "Bearer", "expires_in": 86400 } ``` The token endpoint is rate-limited against bursts of login attempts, so fetch a token once and reuse it until expiry rather than logging in per request. ## Use the token Send the token in the `Authorization` header of every request: ```bash curl "https://eu-north-1-api.sympheny.com/sympheny-app/projects" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` A missing, invalid, or expired token yields `401 Unauthorized`. ## Token lifetime Tokens expire `expires_in` seconds after they are issued and cannot be refreshed — request a new one the same way. Tokens can also be revoked before their stated expiry, so treat any `401` as a signal to re-authenticate and retry once. !!! note The [Python SDK](../sdk/index.md) does all of this for you: it fetches a token lazily on the first request, caches it until shortly before expiry, and retries once with a fresh token on `401`. ## Keep credentials out of code Read credentials from environment variables or a local file excluded from version control — never commit them: ```python import os email = os.environ["SYMPHENY_EMAIL"] password = os.environ["SYMPHENY_PASSWORD"] ``` --- # Projects ## View my projects { #operation-viewMyProjects } ``` GET /sympheny-app/projects ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.projects.list()`](../../sdk/reference/projects.md#method-projects-list). Here you must use version=V2. Also name must be unique **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/projects" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoProjectSummaryResponseDto` | **Example response** (200) ```json { "data": { "projects": [ { "projectName": "string", "projectGuid": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "coverImage": "string", "projectOwnerEmail": "string", "secondaryOwners": [ { "email": "string", "canEdit": true, "favorite": true } ], "lockUserEmail": "string", "lock": true, "lockTime": "2026-01-01T00:00:00Z", "ownedByCurrentUser": true, "editableByCurrentUser": true, "originalDefaultProjectGuid": "string", "version": "V1", "favorite": true, "gisCentroidX": 0.0, "gisCentroidY": 0.0, "zoomExtentXmin": 0.0, "zoomExtentYmin": 0.0, "zoomExtentXmax": 0.0, "zoomExtentYmax": 0.0, "processing": true } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create new project { #operation-createNewProject } ``` POST /sympheny-app/projects ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.projects.create()`](../../sdk/reference/projects.md#method-projects-create). Here you must use version=V2. Also name must be unique **Request body** (`ProjectRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `projectName` | string | yes | | | `version` | string | yes | One of: `V1`, `V2`. | | `webhookUrl` | string, nullable | no | | | `favorite` | boolean, nullable | no | | | `gisCentroidX` | number, nullable | no | | | `gisCentroidY` | number, nullable | no | | | `zoomExtentXmin` | number, nullable | no | | | `zoomExtentYmin` | number, nullable | no | | | `zoomExtentXmax` | number, nullable | no | | | `zoomExtentYmax` | number, nullable | no | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/projects" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "projectName": "string", "version": "V1", "webhookUrl": "string", "favorite": true, "gisCentroidX": 0.0, "gisCentroidY": 0.0, "zoomExtentXmin": 0.0, "zoomExtentYmin": 0.0, "zoomExtentXmax": 0.0, "zoomExtentYmax": 0.0 }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoProjectResponseDto` | **Example response** (201) ```json { "data": { "projectName": "string", "projectGuid": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "coverImage": "string", "projectOwnerEmail": "string", "secondaryOwners": [ { "email": "string", "canEdit": true, "favorite": true } ], "lockUserEmail": "string", "lock": true, "lockTime": "2026-01-01T00:00:00Z", "ownedByCurrentUser": true, "editableByCurrentUser": true, "originalDefaultProjectGuid": "string", "version": "V1", "favorite": true, "gisCentroidX": 0.0, "gisCentroidY": 0.0, "zoomExtentXmin": 0.0, "zoomExtentYmin": 0.0, "zoomExtentXmax": 0.0, "zoomExtentYmax": 0.0, "processing": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## View project details { #operation-viewProjectDetails } ``` GET /sympheny-app/projects/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.projects.get()`](../../sdk/reference/projects.md#method-projects-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | | `includeAnalyses` | query | boolean | no | Default: `true`. | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/projects/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoProjectDetailResponseDto` | **Example response** (200) ```json { "data": { "images": [ { "url": "string", "guid": "string", "cover": true } ], "projectName": "string", "projectGuid": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "projectOwner": "string", "projectOwnerEmail": "string", "secondaryOwners": [ { "email": "string", "canEdit": true, "favorite": true } ], "lockUserEmail": "string", "lock": true, "lockTime": "2026-01-01T00:00:00Z", "ownedByCurrentUser": true, "editableByCurrentUser": true, "ownerHistory": [ { "ownedAt": "2026-01-01T00:00:00Z", "ownerEmail": "string" } ], "analyses": [ { "analysisGuid": "string", "analysisName": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "scenarios": [ { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": null, "interestRate": null, "exchangeCurrency": null, "exchangeRate": null, "scope": null, "technologies": null, "demands": null, "imports": null, "exports": null, "multiHubs": null }, "variant": true } ] } ], "coverImage": "string", "originalDefaultProjectGuid": "string", "version": "V1", "webhookUrl": "string", "favorite": true, "gisCentroidX": 0.0, "gisCentroidY": 0.0, "zoomExtentXmin": 0.0, "zoomExtentYmin": 0.0, "zoomExtentXmax": 0.0, "zoomExtentYmax": 0.0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete project { #operation-deleteProject } ``` DELETE /sympheny-app/projects/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.projects.delete()`](../../sdk/reference/projects.md#method-projects-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/projects/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoProjectSummaryResponseDto` | **Example response** (200) ```json { "data": { "projects": [ { "projectName": "string", "projectGuid": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "coverImage": "string", "projectOwnerEmail": "string", "secondaryOwners": [ { "email": "string", "canEdit": true, "favorite": true } ], "lockUserEmail": "string", "lock": true, "lockTime": "2026-01-01T00:00:00Z", "ownedByCurrentUser": true, "editableByCurrentUser": true, "originalDefaultProjectGuid": "string", "version": "V1", "favorite": true, "gisCentroidX": 0.0, "gisCentroidY": 0.0, "zoomExtentXmin": 0.0, "zoomExtentYmin": 0.0, "zoomExtentXmax": 0.0, "zoomExtentYmax": 0.0, "processing": true } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Analyses ## Delete analysis { #operation-deleteAnalysis } ``` DELETE /sympheny-app/analysis/{analysisGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.analyses.delete()`](../../sdk/reference/analyses.md#method-analyses-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `analysisGuid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/analysis/{analysisGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStatus` | **Example response** (200) ```json { "data": { "code": "string", "desc": "string", "message": "string" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## List 2 { #operation-list_2 } ``` GET /sympheny-app/projects/{guid}/analyses ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.analyses.list()`](../../sdk/reference/analyses.md#method-analyses-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/projects/{guid}/analyses" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `PagedResponseAnalysisResponseDto` | **Example response** (200) ```json { "data": [ { "analysisGuid": "string", "analysisName": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "scenarios": [ { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true } ] } ], "status": { "code": "string", "desc": "string", "message": "string" }, "totalElements": 0, "totalPages": 0, "hasNext": true } ``` ## Create new analysis { #operation-createNewAnalysis } ``` POST /sympheny-app/projects/{guid}/analyses ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.analyses.create()`](../../sdk/reference/analyses.md#method-analyses-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`AnalysisRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `analysisName` | string | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/projects/{guid}/analyses" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "analysisName": "string" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoAnalysisResponseDto` | **Example response** (201) ```json { "data": { "analysisGuid": "string", "analysisName": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "scenarios": [ { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## View analysis details { #operation-viewAnalysisDetails } ``` GET /sympheny-app/projects/{guid}/analysis/{analysisGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.analyses.get()`](../../sdk/reference/analyses.md#method-analyses-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | | `analysisGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/projects/{guid}/analysis/{analysisGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoAnalysisDetailsResponseDto` | **Example response** (200) ```json { "data": { "analysisGuid": "string", "analysisName": "string", "executionStatus": "IN_SPECIFICATION", "executionInProgress": true, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "coverImage": "string", "projectName": "string", "scenarios": [ { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true } ], "executionOptions": { "objective1": "string", "objective2": "string", "numberOfParetoPoints": 0, "scenarios": [ "string" ] }, "results": { "executionSubmitted": "2026-01-01T00:00:00Z", "scenarios": [ { "scenarioName": "string", "status": "IN_SPECIFICATION", "statusMessage": "string", "paretoPointsCompleted": "string", "inputFilepath": "string", "outputFilepath": "string" } ], "dashboardUrl": "string" }, "projectGuid": "string" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Scenarios ## List scenarios { #operation-listScenarios } ``` GET /sympheny-app/analysis/{guid}/scenario ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.scenarios.list()`](../../sdk/reference/scenarios.md#method-scenarios-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/analysis/{guid}/scenario" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListFScenarioResponseDto` | **Example response** (200) ```json { "data": [ { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create new scenario { #operation-createNewScenario } ``` POST /sympheny-app/analysis/{guid}/scenario ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.scenarios.create()`](../../sdk/reference/scenarios.md#method-scenarios-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`ScenarioRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `scenarioName` | string | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/analysis/{guid}/scenario" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "scenarioName": "string" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoScenarioResponseDto` | **Example response** (201) ```json { "data": { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get scenario { #operation-getScenario } ``` GET /sympheny-app/scenario/{scenarioGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.scenarios.get()`](../../sdk/reference/scenarios.md#method-scenarios-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenario/{scenarioGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoScenarioResponseDto` | **Example response** (200) ```json { "data": { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete scenario { #operation-deleteScenario } ``` DELETE /sympheny-app/scenario/{scenarioGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.scenarios.delete()`](../../sdk/reference/scenarios.md#method-scenarios-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenario/{scenarioGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStatus` | **Example response** (200) ```json { "data": { "code": "string", "desc": "string", "message": "string" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Copy scenario { #operation-copyScenario } ``` PUT /sympheny-app/scenarios/copy/{scenarioGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.scenarios.copy()`](../../sdk/reference/scenarios.md#method-scenarios-copy). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `analysisDestinationGuid` | query | string | no | | | `name` | query | string | no | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/copy/{scenarioGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoScenarioResponseDto` | **Example response** (200) ```json { "data": { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Rename scenario { #operation-renameScenario } ``` PUT /sympheny-app/scenarios/{scenarioGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.scenarios.rename()`](../../sdk/reference/scenarios.md#method-scenarios-rename). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`ScenarioRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `scenarioName` | string | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "scenarioName": "string" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoScenarioResponseDto` | **Example response** (200) ```json { "data": { "scenarioGuid": "string", "scenarioName": "string", "updated": "2026-01-01T00:00:00Z", "readyForExecution": true, "preparingExecutionV2": true, "masterScenarioGuid": "string", "projectGuid": "string", "projectName": "string", "analysisGuid": "string", "analysisName": "string", "enymap": { "length": 0, "interestRate": 0.0, "exchangeCurrency": "string", "exchangeRate": 0.0, "scope": "BUILDING_DEVELOPMENTS", "technologies": [ "PV" ], "demands": [ "HOT_WATER" ], "imports": [ "ELECTRICITY" ], "exports": [ "HEAT_AMBIENT" ], "multiHubs": true }, "variant": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Stages ## Get 1 { #operation-get_1 } ``` GET /sympheny-app/scenarios/stages/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.stages.get()`](../../sdk/reference/stages.md#method-stages-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/stages/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStageResponseDto` | **Example response** (200) ```json { "data": { "name": "string", "length": 0, "interestRate": 0.0, "inflationRate": 0.0, "index": 0, "guid": "00000000-0000-0000-0000-000000000000" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## List { #operation-list } ``` GET /sympheny-app/scenarios/{scenarioGuid}/stages ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.stages.list()`](../../sdk/reference/stages.md#method-stages-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/stages" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListStageResponseDto` | **Example response** (200) ```json { "data": [ { "name": "string", "length": 0, "interestRate": 0.0, "inflationRate": 0.0, "index": 0, "guid": "00000000-0000-0000-0000-000000000000" } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create { #operation-create } ``` POST /sympheny-app/scenarios/{scenarioGuid}/stages ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.stages.create()`](../../sdk/reference/stages.md#method-stages-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`StageRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `length` | integer (int32) | yes | | | `interestRate` | number, nullable | no | | | `inflationRate` | number, nullable | no | | | `index` | integer (int32) | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/stages" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "length": 0, "interestRate": 0.0, "inflationRate": 0.0, "index": 0 }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoStageResponseDto` | **Example response** (201) ```json { "data": { "name": "string", "length": 0, "interestRate": 0.0, "inflationRate": 0.0, "index": 0, "guid": "00000000-0000-0000-0000-000000000000" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update { #operation-update } ``` PUT /sympheny-app/scenarios/{scenarioGuid}/stages/{stageGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.stages.update()`](../../sdk/reference/stages.md#method-stages-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `stageGuid` | path | string (uuid) | yes | | **Request body** (`StageResponseDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `length` | integer (int32) | yes | | | `interestRate` | number, nullable | no | | | `inflationRate` | number, nullable | no | | | `index` | integer (int32) | yes | | | `guid` | string (uuid), nullable | no | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/stages/{stageGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "length": 0, "interestRate": 0.0, "inflationRate": 0.0, "index": 0, "guid": "00000000-0000-0000-0000-000000000000" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStageResponseDto` | **Example response** (200) ```json { "data": { "name": "string", "length": 0, "interestRate": 0.0, "inflationRate": 0.0, "index": 0, "guid": "00000000-0000-0000-0000-000000000000" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete { #operation-delete } ``` DELETE /sympheny-app/scenarios/{scenarioGuid}/stages/{stageGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.stages.delete()`](../../sdk/reference/stages.md#method-stages-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `stageGuid` | path | string (uuid) | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/stages/{stageGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | — | --- # Hubs ## Get hub { #operation-getHub } ``` GET /sympheny-app/scenarios/hubs/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.hubs.get()`](../../sdk/reference/hubs.md#method-hubs-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/hubs/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoHubResponseDto` | **Example response** (200) ```json { "data": { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete hub { #operation-deleteHub } ``` DELETE /sympheny-app/scenarios/hubs/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.hubs.delete()`](../../sdk/reference/hubs.md#method-hubs-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/hubs/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListHubResponseDto` | **Example response** (200) ```json { "data": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Find all hubs by scenario { #operation-findAllHubsByScenario } ``` GET /sympheny-app/scenarios/{scenarioGuid}/hubs ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.hubs.list()`](../../sdk/reference/hubs.md#method-hubs-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/hubs" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListFHubResponseDto` | **Example response** (200) ```json { "data": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create new hub { #operation-createNewHub } ``` POST /sympheny-app/scenarios/{scenarioGuid}/hubs ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.hubs.create()`](../../sdk/reference/hubs.md#method-hubs-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`HubRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `hubName` | string | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/hubs" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "hubName": "string" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoHubResponseDto` | **Example response** (201) ```json { "data": { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Edit hub { #operation-editHub } ``` PUT /sympheny-app/v2/scenarios/hubs/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.hubs.update()`](../../sdk/reference/hubs.md#method-hubs-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`HubResponseDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `hubGuid` | string | yes | | | `hubName` | string | yes | | | `updated` | string (date-time) | yes | | | `created` | string (date-time) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/hubs/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoHubResponseDto` | **Example response** (200) ```json { "data": { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Energy carriers ## Get energy carrier by guid { #operation-getEnergyCarrierByGuid } ``` GET /sympheny-app/carriers/{carrierGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_carriers.get()`](../../sdk/reference/energy_carriers.md#method-energy_carriers-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `carrierGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/carriers/{carrierGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyCarrierResponseDto` | **Example response** (200) ```json { "data": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete energy carrier { #operation-deleteEnergyCarrier } ``` DELETE /sympheny-app/scenarios/carriers/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_carriers.delete()`](../../sdk/reference/energy_carriers.md#method-energy_carriers-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/carriers/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyCarriersListResponseDto` | **Example response** (200) ```json { "data": { "energyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Find all energy carriers by scenario { #operation-findAllEnergyCarriersByScenario } ``` GET /sympheny-app/scenarios/{scenarioGuid}/carriers ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_carriers.list()`](../../sdk/reference/energy_carriers.md#method-energy_carriers-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/carriers" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyCarriersListResponseDto` | **Example response** (200) ```json { "data": { "energyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Edit energy carrier v2 { #operation-editEnergyCarrierV2 } ``` PUT /sympheny-app/v2/carriers/{carrierGuid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_carriers.update()`](../../sdk/reference/energy_carriers.md#method-energy_carriers-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `carrierGuid` | path | string | yes | | **Request body** (`EnergyCarrierResponseDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `energyCarrierGuid` | string | yes | | | `typeKey` | string | yes | | | `typeDisplayName` | string | yes | | | `subtypeKey` | string | yes | | | `subtypeDisplayName` | string | yes | | | `energyCarrierName` | string | yes | | | `colorHexCode` | string | yes | | | `fixedInputShare` | number, nullable | no | | | `outputEfficiency` | number, nullable | no | | | `customOutputEfficiencyActivated` | boolean | yes | | | `customInputEfficiencyActivated` | boolean | yes | | | `customSeasonalityValues` | array of `CustomSeasonalityResponseDto`, nullable | no | | | `outputEfficiencyProfileId` | integer (int64), nullable | no | | | `created` | string (date-time) | yes | | | `primary` | boolean, nullable | no | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2/carriers/{carrierGuid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyCarrierResponseDto` | **Example response** (200) ```json { "data": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create new energy carrier v2 { #operation-createNewEnergyCarrierV2 } ``` POST /sympheny-app/v2/scenarios/{scenarioGuid}/carriers ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_carriers.create()`](../../sdk/reference/energy_carriers.md#method-energy_carriers-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`EnergyCarrierRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `subType` | string | yes | One of: `ELECTRICITY`, `ELECTRICITY_RENEWABLE`, `WOOD_CHIPS`, `WOOD_PELLETS`, `COAL`, `OIL`, `GAS`, `BIOGAS`, `HYDROGEN`, `HYDROGEN_PRESSURIZED`, `COOLING_1`, `COOLING_2`, `COOLING_3`, `COOLING_4`, `ICE`, `HEAT_1`, `HEAT_2`, `HEAT_3`, `HEAT_4`, `HEAT_5`, `HEAT_6`, `HEAT_7`, `HEAT_8`, `HEAT_9`, `HEAT_AMBIENT`, `STEAM_LOW_PRESSURE`, `SOLAR_ROOF`, `SOLAR_FACADE`, `SOLAR_PARAPET`, `WIND`, `HYDRO`, `BIOMASS`, `GEOTHERMAL`, `TIDAL`, `PROCESS_WASTE_HEAT`, `CUSTOM`. | | `energyCarrierName` | string | yes | | | `colorHexCode` | string, nullable | no | | | `allowVirtualLoad` | boolean, nullable | no | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/carriers" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "subType": "ELECTRICITY", "energyCarrierName": "string", "colorHexCode": "string", "allowVirtualLoad": true }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoEnergyCarrierResponseDto` | **Example response** (201) ```json { "data": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Energy demands ## Delete energy demand profile { #operation-deleteEnergyDemandProfile } ``` DELETE /sympheny-app/scenarios/energy-demands/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_demands.delete()`](../../sdk/reference/energy_demands.md#method-energy_demands-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/energy-demands/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyDemandListResponseDto` | **Example response** (200) ```json { "data": { "energyDemands": [ { "energyDemandGuid": "string", "energyCarrierName": "string", "hubName": "string", "energyDemandName": "string", "energyCarrierGuid": "string", "hubGuid": "string", "demandSalePrice": 0.0, "energyDemandUserSavedMetadataGuid": "string", "energyDemandUserSavedMetadataName": "string", "energyDemandUserSavedMetadataReferenceArea": 0.0, "scalingFactor": 0.0, "energyDemandMetadataGuid": "string", "energyDemandMetadataName": "string", "energyDemandMetadataDbOrganization": "string", "energyDemandMetadataType": "ELECTRICITY", "energyDemandMetadataBuildingType": "RESIDENCE_MFH", "energyDemandMetadataBuildingAge": "AGE_UNDER_1970", "energyDemandMetadataOption": "OPTION_1", "energyDemandMetadataReferencedAreaM2": 0.0, "energyDemandMetadataSpecificEnergyDemandValueKWhM2": 0.0, "energyDemandMetadataTotalAnnualDemand": 0.0, "multiplicationFactorPreview": 0, "multiplicationFactor": 0 } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get energy demand details by guid v2 { #operation-getEnergyDemandDetailsByGuidV2 } ``` GET /sympheny-app/v2/energy-demands/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_demands.get()`](../../sdk/reference/energy_demands.md#method-energy_demands-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | | `scenarioVariantGuid` | query | string | no | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/energy-demands/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyDemandDetailResponseDtoV2` | **Example response** (200) ```json { "data": { "energyDemandGuid": "string", "energyDemandName": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "demandSalePrice": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "demandProfileId": 0, "demandScalingFactor": 0.0, "demandSalePriceProfileId": 0, "demandSalePriceScalingFactor": 0.0, "energyDemandUserSavedMetadataGuid": "string", "energyDemandUserSavedMetadataName": "string", "energyDemandUserSavedMetadataReferenceArea": 0.0, "scalingFactor": 0.0, "energyDemandMetadataGuid": "string", "energyDemandMetadataName": "string", "energyDemandMetadataDbOrganization": "string", "energyDemandMetadataType": "ELECTRICITY", "energyDemandMetadataBuildingType": "RESIDENCE_MFH", "energyDemandMetadataBuildingAge": "AGE_UNDER_1970", "energyDemandMetadataOption": "OPTION_1", "energyDemandMetadataReferencedAreaM2": 0.0, "energyDemandMetadataSpecificEnergyDemandValueKWhM2": 0.0, "energyDemandMetadataTotalAnnualDemand": 0.0, "multiplicationFactorPreview": 0, "multiplicationFactor": 0, "reverse": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all energy demands by scenario v2 { #operation-getAllEnergyDemandsByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/energy-demands ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_demands.list()`](../../sdk/reference/energy_demands.md#method-energy_demands-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/energy-demands" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListEnergyDemandResponseDtoV2` | **Example response** (200) ```json { "data": [ { "energyDemandGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "energyDemandName": "string", "energyCarrierGuid": "string", "demandSalePrice": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "demandProfileId": 0, "demandScalingFactor": 0.0, "demandSalePriceProfileId": 0, "demandSalePriceScalingFactor": 0.0, "energyDemandUserSavedMetadataGuid": "string", "energyDemandUserSavedMetadataName": "string", "energyDemandUserSavedMetadataReferenceArea": 0.0, "scalingFactor": 0.0, "energyDemandMetadataGuid": "string", "energyDemandMetadataName": "string", "energyDemandMetadataDbOrganization": "string", "energyDemandMetadataType": "ELECTRICITY", "energyDemandMetadataBuildingType": "RESIDENCE_MFH", "energyDemandMetadataBuildingAge": "AGE_UNDER_1970", "energyDemandMetadataOption": "OPTION_1", "energyDemandMetadataReferencedAreaM2": 0.0, "energyDemandMetadataSpecificEnergyDemandValueKWhM2": 0.0, "energyDemandMetadataTotalAnnualDemand": 0.0, "multiplicationFactorPreview": 0, "multiplicationFactor": 0, "reverse": true } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Upload new energy demand profile v2 1 { #operation-uploadNewEnergyDemandProfileV2_1 } ``` POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/energy-demands ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_demands.create()`](../../sdk/reference/energy_demands.md#method-energy_demands-create). demandProfileId and demandSalePrice must be exclusive **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`EnergyDemandRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `hubGuids` | array of string | yes | | | `energyCarrierGuid` | string | yes | | | `demandProfileId` | integer (int64) | yes | | | `demandScalingFactor` | number, nullable | no | | | `name` | string | yes | | | `demandSalePrice` | number, nullable | no | | | `demandSalePriceProfileId` | integer (int64), nullable | no | | | `demandSalePriceScalingFactor` | number, nullable | no | | | `stages` | array of string (uuid) | yes | | | `multiplicationFactor` | integer (int32), nullable | no | | | `reverse` | boolean, nullable | no | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/energy-demands" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "hubGuids": [ "string" ], "energyCarrierGuid": "string", "demandProfileId": 0, "demandScalingFactor": 0.0, "name": "string", "demandSalePrice": 0.0, "demandSalePriceProfileId": 0, "demandSalePriceScalingFactor": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "multiplicationFactor": 0, "reverse": true }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoEnergyDemandResponseDtoV2` | **Example response** (201) ```json { "data": { "energyDemandGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "energyDemandName": "string", "energyCarrierGuid": "string", "demandSalePrice": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "demandProfileId": 0, "demandScalingFactor": 0.0, "demandSalePriceProfileId": 0, "demandSalePriceScalingFactor": 0.0, "energyDemandUserSavedMetadataGuid": "string", "energyDemandUserSavedMetadataName": "string", "energyDemandUserSavedMetadataReferenceArea": 0.0, "scalingFactor": 0.0, "energyDemandMetadataGuid": "string", "energyDemandMetadataName": "string", "energyDemandMetadataDbOrganization": "string", "energyDemandMetadataType": "ELECTRICITY", "energyDemandMetadataBuildingType": "RESIDENCE_MFH", "energyDemandMetadataBuildingAge": "AGE_UNDER_1970", "energyDemandMetadataOption": "OPTION_1", "energyDemandMetadataReferencedAreaM2": 0.0, "energyDemandMetadataSpecificEnergyDemandValueKWhM2": 0.0, "energyDemandMetadataTotalAnnualDemand": 0.0, "multiplicationFactorPreview": 0, "multiplicationFactor": 0, "reverse": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update energy demand v2 2 { #operation-updateEnergyDemandV2_2 } ``` PUT /sympheny-app/v2_2/scenarios/{scenarioGuid}/energy-demands/{demand-guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.energy_demands.update()`](../../sdk/reference/energy_demands.md#method-energy_demands-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `demand-guid` | path | string | yes | | **Request body** (`EnergyDemandResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `energyDemandGuid` | string, nullable | no | | | `energyCarrierName` | string | yes | | | `hubs` | array of `HubResponseDto` | yes | | | `energyDemandName` | string | yes | | | `energyCarrierGuid` | string | yes | | | `demandSalePrice` | number, nullable | no | | | `stages` | array of string (uuid) | yes | | | `demandProfileId` | integer (int64) | yes | | | `demandScalingFactor` | number, nullable | no | | | `demandSalePriceProfileId` | integer (int64), nullable | no | | | `demandSalePriceScalingFactor` | number, nullable | no | | | `energyDemandUserSavedMetadataGuid` | string, nullable | no | | | `energyDemandUserSavedMetadataName` | string, nullable | no | | | `energyDemandUserSavedMetadataReferenceArea` | number, nullable | no | | | `scalingFactor` | number, nullable | no | | | `energyDemandMetadataGuid` | string, nullable | no | | | `energyDemandMetadataName` | string, nullable | no | | | `energyDemandMetadataDbOrganization` | string, nullable | no | | | `energyDemandMetadataType` | string, nullable | no | One of: `ELECTRICITY`, `SPACE_HEATING`, `HOT_WATER`, `COOLING`, `None`. | | `energyDemandMetadataBuildingType` | string, nullable | no | One of: `RESIDENCE_MFH`, `RESIDENCE_SFH`, `ADMINISTRATION`, `OFFICES`, `SCHOOLS`, `RETAIL`, `RESTAURANT`, `ASSEMBLY`, `HOSPITALS`, `INDUSTRY`, `WAREHOUSE`, `SPORTS_CENTER`, `INDOOR_POOL`, `HOTEL`, `INDUSTRY_1_SHIFT_FABRICATED_METALS`, `INDUSTRY_2_SHIFT_FABRICATED_METALS`, `INDUSTRY_FOOD_PROCESSING`, `INDUSTRY_GENERAL_MANUFACTURER`, `INDUSTRY_PHARMACEUTICAL`, `INDUSTRY_PLASTIC_MANUFACTURER`, `INDUSTRY_SERVICES`, `INDUSTRY_WAREHOUSE`, `None`. | | `energyDemandMetadataBuildingAge` | string, nullable | no | One of: `AGE_UNDER_1970`, `AGE_1970_1980`, `AGE_1980_1995`, `AGE_1995_2005`, `AGE_2005_2015`, `AGE_OVER_2015`, `SIA_2024_EXISTING_MFH`, `SIA_2024_EXISTING_SFH`, `SIA_2024_EXISTING_HOTEL_ROOM`, `SIA_2024_EXISTING_LOBBY`, `SIA_2024_EXISTING_SINGLE_GROUP_OFFICE`, `SIA_2024_EXISTING_OPEN_PLAN_OFFICE`, `SIA_2024_EXISTING_MEETING_ROOM`, `SIA_2024_EXISTING_COUNTER_HALL`, `SIA_2024_EXISTING_CLASS_ROOM`, `SIA_2024_EXISTING_TEACHERS_LOUNGE`, `SIA_2024_EXISTING_LIBRARY`, `SIA_2024_EXISTING_AUDITORIUM`, `SIA_2024_EXISTING_SCHOOL_SUBJECT_ROOM`, `SIA_2024_EXISTING_FOOD_SALE_STORE`, `SIA_2024_EXISTING_SPECIALTY_STORE`, `SIA_2024_EXISTING_SALES_FURNITURE_DIY_GARDEN`, `SIA_2024_EXISTING_PATIENT_ROOM`, `SIA_2024_EXISTING_WARD_ROOM`, `SIA_2024_EXISTING_TREATMENT_ROOM`, `SIA_2024_EXISTING_WAREHOUSE`, `SIA_2024_EXISTING_GYMNASIUM`, `SIA_2024_EXISTING_FITNESS_ROOM`, `SIA_2024_EXISTING_INDOOR_SWIMMING_POOL`, `SIA_2024_STANDARD_MFH`, `SIA_2024_STANDARD_SFH`, `SIA_2024_STANDARD_HOTEL_ROOM`, `SIA_2024_STANDARD_LOBBY`, `SIA_2024_STANDARD_SINGLE_GROUP_OFFICE`, `SIA_2024_STANDARD_OPEN_PLAN_OFFICE`, `SIA_2024_STANDARD_MEETING_ROOM`, `SIA_2024_STANDARD_COUNTER_HALL`, `SIA_2024_STANDARD_CLASS_ROOM`, `SIA_2024_STANDARD_TEACHERS_LOUNGE`, `SIA_2024_STANDARD_LIBRARY`, `SIA_2024_STANDARD_AUDITORIUM`, `SIA_2024_STANDARD_SCHOOL_SUBJECT_ROOM`, `SIA_2024_STANDARD_FOOD_SALE_STORE`, `SIA_2024_STANDARD_SPECIALTY_STORE`, `SIA_2024_STANDARD_SALES_FURNITURE_DIY_GARDEN`, `SIA_2024_STANDARD_PATIENT_ROOM`, `SIA_2024_STANDARD_WARD_ROOM`, `SIA_2024_STANDARD_TREATMENT_ROOM`, `SIA_2024_STANDARD_WAREHOUSE`, `SIA_2024_STANDARD_GYMNASIUM`, `SIA_2024_STANDARD_FITNESS_ROOM`, `SIA_2024_STANDARD_INDOOR_SWIMMING_POOL`, `SIA_2024_TARGET_MFH`, `SIA_2024_TARGET_SFH`, `SIA_2024_TARGET_HOTEL_ROOM`, `SIA_2024_TARGET_LOBBY`, `SIA_2024_TARGET_SINGLE_GROUP_OFFICE`, `SIA_2024_TARGET_OPEN_PLAN_OFFICE`, `SIA_2024_TARGET_MEETING_ROOM`, `SIA_2024_TARGET_COUNTER_HALL`, `SIA_2024_TARGET_CLASS_ROOM`, `SIA_2024_TARGET_TEACHERS_LOUNGE`, `SIA_2024_TARGET_LIBRARY`, `SIA_2024_TARGET_AUDITORIUM`, `SIA_2024_TARGET_SCHOOL_SUBJECT_ROOM`, `SIA_2024_TARGET_FOOD_SALE_STORE`, `SIA_2024_TARGET_SPECIALTY_STORE`, `SIA_2024_TARGET_SALES_FURNITURE_DIY_GARDEN`, `SIA_2024_TARGET_PATIENT_ROOM`, `SIA_2024_TARGET_WARD_ROOM`, `SIA_2024_TARGET_TREATMENT_ROOM`, `SIA_2024_TARGET_WAREHOUSE`, `SIA_2024_TARGET_GYMNASIUM`, `SIA_2024_TARGET_FITNESS_ROOM`, `SIA_2024_TARGET_INDOOR_SWIMMING_POOL`, `MINERGIE_NEW_CONSTRUCTION`, `MINERGIE_RENOVATION`, `MINERGIE_A`, `MINERGIE_P_NEW_CONSTRUCTION`, `MINERGIE_P_RENOVATION`, `OTHERS`, `None`. | | `energyDemandMetadataOption` | string, nullable | no | One of: `OPTION_1`, `OPTION_2`, `OPTION_3`, `None`. | | `energyDemandMetadataReferencedAreaM2` | number, nullable | no | | | `energyDemandMetadataSpecificEnergyDemandValueKWhM2` | number, nullable | no | | | `energyDemandMetadataTotalAnnualDemand` | number, nullable | no | | | `multiplicationFactorPreview` | integer (int32), nullable | no | | | `multiplicationFactor` | integer (int32), nullable | no | | | `reverse` | boolean | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_2/scenarios/{scenarioGuid}/energy-demands/{demand-guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "energyDemandGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "energyDemandName": "string", "energyCarrierGuid": "string", "demandSalePrice": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "demandProfileId": 0, "demandScalingFactor": 0.0, "demandSalePriceProfileId": 0, "demandSalePriceScalingFactor": 0.0, "energyDemandUserSavedMetadataGuid": "string", "energyDemandUserSavedMetadataName": "string", "energyDemandUserSavedMetadataReferenceArea": 0.0, "scalingFactor": 0.0, "energyDemandMetadataGuid": "string", "energyDemandMetadataName": "string", "energyDemandMetadataDbOrganization": "string", "energyDemandMetadataType": "ELECTRICITY", "energyDemandMetadataBuildingType": "RESIDENCE_MFH", "energyDemandMetadataBuildingAge": "AGE_UNDER_1970", "energyDemandMetadataOption": "OPTION_1", "energyDemandMetadataReferencedAreaM2": 0.0, "energyDemandMetadataSpecificEnergyDemandValueKWhM2": 0.0, "energyDemandMetadataTotalAnnualDemand": 0.0, "multiplicationFactorPreview": 0, "multiplicationFactor": 0, "reverse": true }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoEnergyDemandResponseDtoV2` | **Example response** (200) ```json { "data": { "energyDemandGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "energyDemandName": "string", "energyCarrierGuid": "string", "demandSalePrice": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "demandProfileId": 0, "demandScalingFactor": 0.0, "demandSalePriceProfileId": 0, "demandSalePriceScalingFactor": 0.0, "energyDemandUserSavedMetadataGuid": "string", "energyDemandUserSavedMetadataName": "string", "energyDemandUserSavedMetadataReferenceArea": 0.0, "scalingFactor": 0.0, "energyDemandMetadataGuid": "string", "energyDemandMetadataName": "string", "energyDemandMetadataDbOrganization": "string", "energyDemandMetadataType": "ELECTRICITY", "energyDemandMetadataBuildingType": "RESIDENCE_MFH", "energyDemandMetadataBuildingAge": "AGE_UNDER_1970", "energyDemandMetadataOption": "OPTION_1", "energyDemandMetadataReferencedAreaM2": 0.0, "energyDemandMetadataSpecificEnergyDemandValueKWhM2": 0.0, "energyDemandMetadataTotalAnnualDemand": 0.0, "multiplicationFactorPreview": 0, "multiplicationFactor": 0, "reverse": true }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Profiles ## List 1 { #operation-list_1 } ``` GET /sympheny-app/scenarios/{scenarioGuid}/profiles ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.profiles.list()`](../../sdk/reference/profiles.md#method-profiles-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/profiles" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListProfileResponseDto` | **Example response** (200) ```json { "data": [ { "id": 0, "name": "string" } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create json { #operation-createJson } ``` POST /sympheny-app/scenarios/{scenarioGuid}/profiles-json ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.profiles.create()`](../../sdk/reference/profiles.md#method-profiles-create). requestDto.values list size must be exactly 8760, with period from 1 to 8760, and positive demandValue **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`ProfileJsonRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `values` | array of `ProfilePeriodValueDto` | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/profiles-json" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "values": [ { "period": 0, "demandValue": 0.0 } ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoProfileResponseDto` | **Example response** (201) ```json { "data": { "id": 0, "name": "string" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get { #operation-get } ``` GET /sympheny-app/scenarios/{scenarioGuid}/profiles/{profileId} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.profiles.get()`](../../sdk/reference/profiles.md#method-profiles-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `profileId` | path | integer (int64) | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/profiles/{profileId}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoProfileDetailsResponseDto` | **Example response** (200) ```json { "data": { "id": 0, "name": "string", "values": [ { "period": 0, "demandValue": 0.0 } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete 1 { #operation-delete_1 } ``` DELETE /sympheny-app/scenarios/{scenarioGuid}/profiles/{profileId} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.profiles.delete()`](../../sdk/reference/profiles.md#method-profiles-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `profileId` | path | integer (int64) | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/profiles/{profileId}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | — | ## Edit json v2 { #operation-editJsonV2 } ``` PUT /sympheny-app/v2/scenarios/{scenarioGuid}/profiles-json/{profileId} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.profiles.update()`](../../sdk/reference/profiles.md#method-profiles-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `profileId` | path | integer (int64) | yes | | **Request body** (`ProfileDetailsResponseDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | integer (int64), nullable | no | | | `name` | string | yes | | | `values` | array of `ProfilePeriodValueDto` | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/profiles-json/{profileId}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "id": 0, "name": "string", "values": [ { "period": 0, "demandValue": 0.0 } ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoProfileDetailsResponseDto` | **Example response** (200) ```json { "data": { "id": 0, "name": "string", "values": [ { "period": 0, "demandValue": 0.0 } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Solar resources ## Delete solar on site resource { #operation-deleteSolarOnSiteResource } ``` DELETE /sympheny-app/scenarios/solar-on-site-resource/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solar_resources.delete()`](../../sdk/reference/solar_resources.md#method-solar_resources-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/solar-on-site-resource/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoSolarOnSiteResourceListResponseDto` | **Example response** (200) ```json { "data": { "solarResources": [ { "solarResourceGuid": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubName": "string", "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "string", "technologyDimensioningStdValue": 0.0 } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "irradianceProfileType": "GENERATED", "solarResourceMetadataName": "string", "solarResourceMetadataDbOrganization": "string", "solarResourceMetadataGuid": "string", "solarResourceMetadataLocation": "string", "solarResourceMetadataType": "string", "solarResourceMetadataSlope": 0.0, "solarResourceMetadataOrientation": "string" } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get solar on site resources v2 { #operation-getSolarOnSiteResourcesV2 } ``` GET /sympheny-app/v2/scenarios/solar-on-site-resource/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solar_resources.get()`](../../sdk/reference/solar_resources.md#method-solar_resources-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/solar-on-site-resource/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoSolarOnSiteResourceResponseDtoV2` | **Example response** (200) ```json { "data": { "name": "string", "solarResourceGuid": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubName": "string", "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "Area" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "irradianceProfileType": "GENERATED", "solarResourceMetadataName": "string", "solarResourceMetadataDbOrganization": "string", "solarResourceMetadataGuid": "string", "solarResourceMetadataLocation": "string", "solarResourceMetadataType": "string", "solarResourceMetadataSlope": 0.0, "solarResourceMetadataOrientation": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "profileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all solar on site resources by scenario v2 { #operation-getAllSolarOnSiteResourcesByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/solar-on-site-resource ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solar_resources.list()`](../../sdk/reference/solar_resources.md#method-solar_resources-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/solar-on-site-resource" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListSolarOnSiteResourceResponseDtoV2` | **Example response** (200) ```json { "data": [ { "name": "string", "solarResourceGuid": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubName": "string", "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "Area" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "irradianceProfileType": "GENERATED", "solarResourceMetadataName": "string", "solarResourceMetadataDbOrganization": "string", "solarResourceMetadataGuid": "string", "solarResourceMetadataLocation": "string", "solarResourceMetadataType": "string", "solarResourceMetadataSlope": 0.0, "solarResourceMetadataOrientation": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "profileId": 0 } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Upload new solar on site resource v2 1 { #operation-uploadNewSolarOnSiteResourceV2_1 } ``` POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/solar-on-site-resource ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solar_resources.create()`](../../sdk/reference/solar_resources.md#method-solar_resources-create). energyCarrierGuid must be a carrier with subType in: SOLAR_ROOF,BIOMASS,GEOTHERMAL,HYDRO,PROCESS_WASTE_HEAT,SOLAR_FACADE,SOLAR_PARAPET,TIDAL,WIND **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`SolarOnSiteResourceRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `energyCarrierGuid` | string | yes | | | `hubs` | array of `SolarOnSiteResourcesHubRequestDtoV2` | yes | | | `profileId` | integer (int64) | yes | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/solar-on-site-resource" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "energyCarrierGuid": "string", "hubs": [ { "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "Area" } ], "profileId": 0, "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoSolarOnSiteResourceResponseDtoV2` | **Example response** (201) ```json { "data": { "name": "string", "solarResourceGuid": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubName": "string", "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "Area" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "irradianceProfileType": "GENERATED", "solarResourceMetadataName": "string", "solarResourceMetadataDbOrganization": "string", "solarResourceMetadataGuid": "string", "solarResourceMetadataLocation": "string", "solarResourceMetadataType": "string", "solarResourceMetadataSlope": 0.0, "solarResourceMetadataOrientation": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "profileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Edit solar on site resource v2 2 { #operation-editSolarOnSiteResourceV2_2 } ``` PUT /sympheny-app/v2_2/scenarios/solar-on-site-resource/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solar_resources.update()`](../../sdk/reference/solar_resources.md#method-solar_resources-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`SolarOnSiteResourceResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `solarResourceGuid` | string, nullable | no | | | `energyCarrierGuid` | string | yes | | | `energyCarrierName` | string | yes | | | `hubs` | array of `HubSolarOnSiteResourceResponseDtoV2` | yes | | | `created` | string (date-time), nullable | no | | | `updated` | string (date-time), nullable | no | | | `irradianceProfileType` | string | yes | One of: `GENERATED`, `UPLOADED`, `SAVED`. | | `solarResourceMetadataName` | string, nullable | no | | | `solarResourceMetadataDbOrganization` | string, nullable | no | | | `solarResourceMetadataGuid` | string, nullable | no | | | `solarResourceMetadataLocation` | string, nullable | no | | | `solarResourceMetadataType` | string, nullable | no | | | `solarResourceMetadataSlope` | number, nullable | no | | | `solarResourceMetadataOrientation` | string, nullable | no | | | `stages` | array of string (uuid) | yes | | | `profileId` | integer (int64) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_2/scenarios/solar-on-site-resource/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "solarResourceGuid": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubName": "string", "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "Area" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "irradianceProfileType": "GENERATED", "solarResourceMetadataName": "string", "solarResourceMetadataDbOrganization": "string", "solarResourceMetadataGuid": "string", "solarResourceMetadataLocation": "string", "solarResourceMetadataType": "string", "solarResourceMetadataSlope": 0.0, "solarResourceMetadataOrientation": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "profileId": 0 }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoSolarOnSiteResourceResponseDtoV2` | **Example response** (200) ```json { "data": { "name": "string", "solarResourceGuid": "string", "energyCarrierGuid": "string", "energyCarrierName": "string", "hubs": [ { "hubName": "string", "hubGuid": "string", "availableSolarCollectorArea": 0.0, "availableResourceType": "Area" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "irradianceProfileType": "GENERATED", "solarResourceMetadataName": "string", "solarResourceMetadataDbOrganization": "string", "solarResourceMetadataGuid": "string", "solarResourceMetadataLocation": "string", "solarResourceMetadataType": "string", "solarResourceMetadataSlope": 0.0, "solarResourceMetadataOrientation": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "profileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Conversion technologies ## Get conversion tech details v2 { #operation-getConversionTechDetailsV2 } ``` GET /sympheny-app/v2/scenarios/conversion-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.conversion_technologies.get()`](../../sdk/reference/conversion_technologies.md#method-conversion_technologies-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/conversion-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoConversionTechnologyDetailResponseDtoV2` | **Example response** (200) ```json { "data": { "fixedInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "variableEmittedCo2": 0.0, "variableCapturedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalledInHubs": "canBeInstalled", "conversionTechnologyGuid": "string", "processName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "variableInvestmentCost": 0.0, "lifetime": 0.0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "technologyModes": [ { "capacity": 0.0, "minimumAnnualOutput": 0.0, "maximumAnnualOutput": 0.0, "curtailmentLimitation": 0.0, "peakPower": 0.0, "minPartLoad": 0.0, "minimumUpTime": 0, "minimumDownTime": 0, "technologyModeGuid": "string", "inputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "outputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "seasonalOperationName": "string", "seasonalOperationValue": "string", "allowedOperationProfileId": 0, "primary": true, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "simultaneousOperation": true } ], "category": "string", "technologyCategory": "string", "mutuallyExclusiveGroup": "string", "notes": "string", "virtual": true, "technologyOptional": true, "partOfTechnologyPackage": true, "technologyCapacity": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "comesFromDb": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete conversion technology v2 { #operation-deleteConversionTechnologyV2 } ``` DELETE /sympheny-app/v2/scenarios/conversion-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.conversion_technologies.delete()`](../../sdk/reference/conversion_technologies.md#method-conversion_technologies-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/conversion-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | — | ## Get all conversion technologies by scenario v2 { #operation-getAllConversionTechnologiesByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/conversion-technologies ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.conversion_technologies.list()`](../../sdk/reference/conversion_technologies.md#method-conversion_technologies-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/conversion-technologies" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoConversionTechnologyListResponseDtoV2` | **Example response** (200) ```json { "data": { "conversionTechnologies": [ { "conversionTechnologyGuid": "string", "processName": "string", "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "conversionTechnologyModes": [ { "capacity": 0.0, "minimumAnnualOutput": 0.0, "maximumAnnualOutput": 0.0, "curtailmentLimitation": 0.0, "peakPower": 0.0, "minPartLoad": 0.0, "minimumUpTime": 0, "minimumDownTime": 0, "technologyModeGuid": "string", "inputEnergyCarriers": [ { "energyCarrierGuid": null, "typeKey": null, "typeDisplayName": null, "subtypeKey": null, "subtypeDisplayName": null, "energyCarrierName": null, "colorHexCode": null, "outputEfficiency": null, "fixedInputShare": null, "customOutputEfficiencyActivated": null, "customInputShareActivated": null, "customSeasonalityValues": null, "inputShareProfileId": null, "outputEfficiencyProfileId": null, "created": null, "primary": null } ], "outputEnergyCarriers": [ { "energyCarrierGuid": null, "typeKey": null, "typeDisplayName": null, "subtypeKey": null, "subtypeDisplayName": null, "energyCarrierName": null, "colorHexCode": null, "outputEfficiency": null, "fixedInputShare": null, "customOutputEfficiencyActivated": null, "customInputShareActivated": null, "customSeasonalityValues": null, "inputShareProfileId": null, "outputEfficiencyProfileId": null, "created": null, "primary": null } ], "seasonalOperationName": "string", "seasonalOperationValue": "string", "allowedOperationProfileId": 0, "primary": true, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "simultaneousOperation": true } ], "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "virtual": true, "mustBeInstalledInHubs": "canBeInstalled", "stages": [ "00000000-0000-0000-0000-000000000000" ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update conversion technology { #operation-updateConversionTechnology } ``` PUT /sympheny-app/v2_1/scenarios/conversion-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.conversion_technologies.update()`](../../sdk/reference/conversion_technologies.md#method-conversion_technologies-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`ConversionTechnologyDetailResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixedInvestmentCost` | number, nullable | no | | | `fixedOmCostChf` | number, nullable | no | | | `variableOmCostPercent` | number, nullable | no | | | `variableOmCostYear` | number, nullable | no | | | `variableOmCost` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `variableEmbodiedCo2` | number, nullable | no | | | `variableEmittedCo2` | number, nullable | no | | | `variableCapturedCo2` | number, nullable | no | | | `fixedReplacementCost` | number, nullable | no | | | `variableReplacementCostPercent` | number, nullable | no | | | `variableReplacementCostCHF` | number, nullable | no | | | `fixedSalvageValue` | number, nullable | no | | | `variableSalvageValuePercent` | number, nullable | no | | | `variableSalvageValueCHF` | number, nullable | no | | | `mustBeInstalledInHubs` | string | yes | One of: `canBeInstalled`, `mustBeInstalled`, `mustBeInstalledInAtLeastOneHub`. | | `conversionTechnologyGuid` | string, nullable | no | | | `processName` | string | yes | | | `exchangeCurrency` | string, nullable | no | | | `exchangeRate` | number, nullable | no | | | `variableInvestmentCost` | number, nullable | no | | | `lifetime` | number | yes | | | `created` | string (date-time), nullable | no | | | `updated` | string (date-time), nullable | no | | | `hubs` | array of `HubResponseDto` | yes | | | `technologyModes` | array of `TechnologyModeResponseDtoV2`, nullable | no | | | `category` | string, nullable | no | | | `technologyCategory` | string, nullable | no | | | `mutuallyExclusiveGroup` | string, nullable | no | | | `notes` | string, nullable | no | | | `virtual` | boolean | yes | | | `technologyOptional` | boolean, nullable | no | | | `partOfTechnologyPackage` | boolean, nullable | no | | | `technologyCapacity` | string, nullable | no | | | `costComponents` | array of `AdvancedCostComponentResponseDto`, nullable | no | | | `comesFromDb` | string, nullable | no | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/conversion-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "fixedInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "variableEmittedCo2": 0.0, "variableCapturedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalledInHubs": "canBeInstalled", "conversionTechnologyGuid": "string", "processName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "variableInvestmentCost": 0.0, "lifetime": 0.0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "technologyModes": [ { "capacity": 0.0, "minimumAnnualOutput": 0.0, "maximumAnnualOutput": 0.0, "curtailmentLimitation": 0.0, "peakPower": 0.0, "minPartLoad": 0.0, "minimumUpTime": 0, "minimumDownTime": 0, "technologyModeGuid": "string", "inputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "outputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "seasonalOperationName": "string", "seasonalOperationValue": "string", "allowedOperationProfileId": 0, "primary": true, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "simultaneousOperation": true } ], "category": "string", "technologyCategory": "string", "mutuallyExclusiveGroup": "string", "notes": "string", "virtual": true, "technologyOptional": true, "partOfTechnologyPackage": true, "technologyCapacity": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "comesFromDb": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoConversionTechnologyResponseDtoV2` | **Example response** (200) ```json { "data": { "conversionTechnologyGuid": "string", "processName": "string", "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "conversionTechnologyModes": [ { "capacity": 0.0, "minimumAnnualOutput": 0.0, "maximumAnnualOutput": 0.0, "curtailmentLimitation": 0.0, "peakPower": 0.0, "minPartLoad": 0.0, "minimumUpTime": 0, "minimumDownTime": 0, "technologyModeGuid": "string", "inputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "outputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "seasonalOperationName": "string", "seasonalOperationValue": "string", "allowedOperationProfileId": 0, "primary": true, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "simultaneousOperation": true } ], "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "virtual": true, "mustBeInstalledInHubs": "canBeInstalled", "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Specify conversion technology v2 2 { #operation-specifyConversionTechnologyV2_2 } ``` POST /sympheny-app/v2_2/scenarios/{scenarioGuid}/conversion-technologies ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.conversion_technologies.create()`](../../sdk/reference/conversion_technologies.md#method-conversion_technologies-create). Needs at least 1 mode. Each mode needs at least 1 carrier INPUT and 1 carrier OUTPUT. Cannot have same carrier in both INPUT and OUTPUT **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`ConversionTechnologyRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixedInvestmentCost` | number, nullable | no | | | `fixedOmCostChf` | number, nullable | no | | | `variableOmCostPercent` | number, nullable | no | | | `variableOmCostYear` | number, nullable | no | | | `variableOmCost` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `variableEmbodiedCo2` | number, nullable | no | | | `variableEmittedCo2` | number, nullable | no | | | `variableCapturedCo2` | number, nullable | no | | | `fixedReplacementCost` | number, nullable | no | | | `variableReplacementCostPercent` | number, nullable | no | | | `variableReplacementCostCHF` | number, nullable | no | | | `fixedSalvageValue` | number, nullable | no | | | `variableSalvageValuePercent` | number, nullable | no | | | `variableSalvageValueCHF` | number, nullable | no | | | `mustBeInstalledInHubs` | string | yes | One of: `canBeInstalled`, `mustBeInstalled`, `mustBeInstalledInAtLeastOneHub`. | | `processName` | string | yes | | | `variableInvestmentCost` | number, nullable | no | | | `lifetime` | integer (int32) | yes | | | `hubGuids` | array of string | yes | | | `conversionTechnologyModes` | array of `TechnologyModeRequestDtoV2` | yes | | | `virtual` | boolean | yes | | | `costComponents` | array of `AdvancedCostComponentRequestDto`, nullable | no | | | `suggested` | boolean, nullable | no | | | `technologyCategory` | string, nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `comesFromDb` | string, nullable | no | | | `exchangeCurrency` | string | yes | | | `exchangeRate` | number | yes | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_2/scenarios/{scenarioGuid}/conversion-technologies" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "fixedInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "variableEmittedCo2": 0.0, "variableCapturedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalledInHubs": "canBeInstalled", "processName": "string", "variableInvestmentCost": 0.0, "lifetime": 0, "hubGuids": [ "string" ], "conversionTechnologyModes": [ { "capacity": 0.0, "minimumAnnualOutput": 0.0, "maximumAnnualOutput": 0.0, "curtailmentLimitation": 0.0, "peakPower": 0.0, "minPartLoad": 0.0, "minimumUpTime": 0, "minimumDownTime": 0, "primary": true, "seasonalOperation": "ALL_SEASONS", "allowedOperationProfileId": 0, "energyCarriers": [ { "energyCarrierGuid": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customInputShareActivated": true, "customOutputEfficiencyActivated": true, "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "type": "INPUT", "primary": true } ], "maximumCapacity": 0.0, "minimumCapacity": 0.0, "simultaneousOperation": true } ], "virtual": true, "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0 } ], "suggested": true, "technologyCategory": "string", "notes": "string", "source": "string", "comesFromDb": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoConversionTechnologyResponseDtoV2` | **Example response** (201) ```json { "data": { "conversionTechnologyGuid": "string", "processName": "string", "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "conversionTechnologyModes": [ { "capacity": 0.0, "minimumAnnualOutput": 0.0, "maximumAnnualOutput": 0.0, "curtailmentLimitation": 0.0, "peakPower": 0.0, "minPartLoad": 0.0, "minimumUpTime": 0, "minimumDownTime": 0, "technologyModeGuid": "string", "inputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "outputEnergyCarriers": [ { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "outputEfficiency": 0.0, "fixedInputShare": 0.0, "customOutputEfficiencyActivated": true, "customInputShareActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "inputShareProfileId": 0, "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true } ], "seasonalOperationName": "string", "seasonalOperationValue": "string", "allowedOperationProfileId": 0, "primary": true, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "simultaneousOperation": true } ], "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "virtual": true, "mustBeInstalledInHubs": "canBeInstalled", "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Storage technologies ## Delete storage technology { #operation-deleteStorageTechnology } ``` DELETE /sympheny-app/scenarios/storage-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.storage_technologies.delete()`](../../sdk/reference/storage_technologies.md#method-storage_technologies-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/storage-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStorageTechnologyListResponseDto` | **Example response** (200) ```json { "data": { "storageTechnologies": [ { "storageTechnologyGuid": "string", "storageName": "string", "lifetime": 0.0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get storage tech details v2 { #operation-getStorageTechDetailsV2 } ``` GET /sympheny-app/v2/scenarios/storage-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.storage_technologies.get()`](../../sdk/reference/storage_technologies.md#method-storage_technologies-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/storage-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStorageTechnologyDetailResponseDtoV2` | **Example response** (200) ```json { "data": { "variableOmCostPercent": 0.0, "variableOmEnergyFlowCost": 0.0, "capacity": 0.0, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "fixedInvestmentCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableOmCost": 0.0, "maximumChargingRate": 0.0, "maximumDischargingRate": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalled": "string", "storageTechnologyGuid": "string", "storageName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "lifetime": 0, "standbyLoss": 0.0, "standByLossProfileId": 0, "minimumSoc": 0.0, "storageChargingEfficiency": 0.0, "storageDischargingEfficiency": 0.0, "technologyCapacity": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "storageCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "category": "string", "technologyCategory": "string", "mutuallyExclusiveGroup": "string", "notes": "string", "source": "string", "technologyOptional": true, "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "comesFromDb": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "evPlugInTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugOutTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugInDurationHours": 0.0, "drivingDistanceKms": 0.0, "evSocStartPercent": 0.0, "evBatterySizeKWh": 0.0, "maximumSocPercent": 0.0, "evAverageKWhPerKm": 0.0, "evPlugInPowerKW": 0.0, "isEvBattery": true, "typeOfCharging": "Smart" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all storage technologies by scenario v2 { #operation-getAllStorageTechnologiesByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/storage-technologies ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.storage_technologies.list()`](../../sdk/reference/storage_technologies.md#method-storage_technologies-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/storage-technologies" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStorageTechnologyListResponseDtoV2` | **Example response** (200) ```json { "data": { "storageTechnologies": [ { "storageTechnologyGuid": "string", "storageName": "string", "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ], "standByLossProfileId": 0 } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Specify storage technology v2 1 { #operation-specifyStorageTechnologyV2_1 } ``` POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/storage-technologies ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.storage_technologies.create()`](../../sdk/reference/storage_technologies.md#method-storage_technologies-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`StorageTechnologyRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `variableOmCostPercent` | number, nullable | no | | | `variableOmEnergyFlowCost` | number, nullable | no | | | `capacity` | number, nullable | no | | | `maximumCapacity` | number, nullable | no | | | `minimumCapacity` | number, nullable | no | | | `fixedInvestmentCost` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `variableOmCost` | number, nullable | no | | | `maximumChargingRate` | number, nullable | no | | | `maximumDischargingRate` | number, nullable | no | | | `variableEmbodiedCo2` | number, nullable | no | | | `fixedReplacementCost` | number, nullable | no | | | `variableReplacementCostPercent` | number, nullable | no | | | `variableReplacementCostCHF` | number, nullable | no | | | `fixedSalvageValue` | number, nullable | no | | | `variableSalvageValuePercent` | number, nullable | no | | | `variableSalvageValueCHF` | number, nullable | no | | | `mustBeInstalled` | string | yes | | | `storageName` | string | yes | | | `variableInvestmentCost` | number, nullable | no | | | `fixedOmCostChf` | number, nullable | no | | | `lifetime` | integer (int32) | yes | | | `standbyLoss` | number, nullable | no | | | `standByLossProfileId` | integer (int64), nullable | no | | | `minimumSoc` | number, nullable | no | | | `hubGuids` | array of string | yes | | | `energyCarrierGuid` | string | yes | | | `storageChargingEfficiency` | number | yes | | | `storageDischargingEfficiency` | number | yes | | | `technologyCapacity` | string | yes | | | `costComponents` | array of `AdvancedCostComponentRequestDto`, nullable | no | | | `suggested` | boolean, nullable | no | | | `technologyCategory` | string, nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `comesFromDb` | string, nullable | no | | | `exchangeCurrency` | string, nullable | no | | | `exchangeRate` | number, nullable | no | | | `stages` | array of string (uuid) | yes | | | `evPlugInTime` | `LocalTime`, nullable | no | | | `evPlugOutTime` | `LocalTime`, nullable | no | | | `evPlugInDurationHours` | number, nullable | no | | | `drivingDistanceKms` | number, nullable | no | | | `evSocStartPercent` | number, nullable | no | | | `evBatterySizeKWh` | number, nullable | no | | | `maximumSocPercent` | number, nullable | no | | | `evAverageKWhPerKm` | number, nullable | no | | | `evPlugInPowerKW` | number, nullable | no | | | `isEvBattery` | boolean, nullable | no | | | `typeOfCharging` | string, nullable | no | One of: `Smart`, `Dump`, `V2G`, `None`, `None`. | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/storage-technologies" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "variableOmCostPercent": 0.0, "variableOmEnergyFlowCost": 0.0, "capacity": 0.0, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "fixedInvestmentCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableOmCost": 0.0, "maximumChargingRate": 0.0, "maximumDischargingRate": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalled": "string", "storageName": "string", "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "lifetime": 0, "standbyLoss": 0.0, "standByLossProfileId": 0, "minimumSoc": 0.0, "hubGuids": [ "string" ], "energyCarrierGuid": "string", "storageChargingEfficiency": 0.0, "storageDischargingEfficiency": 0.0, "technologyCapacity": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0 } ], "suggested": true, "technologyCategory": "string", "notes": "string", "source": "string", "comesFromDb": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ], "evPlugInTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugOutTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugInDurationHours": 0.0, "drivingDistanceKms": 0.0, "evSocStartPercent": 0.0, "evBatterySizeKWh": 0.0, "maximumSocPercent": 0.0, "evAverageKWhPerKm": 0.0, "evPlugInPowerKW": 0.0, "isEvBattery": true, "typeOfCharging": "Smart" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoStorageTechnologyResponseDtoV2` | **Example response** (201) ```json { "data": { "storageTechnologyGuid": "string", "storageName": "string", "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ], "standByLossProfileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update storage technology v2 2 { #operation-updateStorageTechnologyV2_2 } ``` PUT /sympheny-app/v2_2/scenarios/storage-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.storage_technologies.update()`](../../sdk/reference/storage_technologies.md#method-storage_technologies-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`StorageTechnologyDetailResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `variableOmCostPercent` | number, nullable | no | | | `variableOmEnergyFlowCost` | number, nullable | no | | | `capacity` | number, nullable | no | | | `maximumCapacity` | number, nullable | no | | | `minimumCapacity` | number, nullable | no | | | `fixedInvestmentCost` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `variableOmCost` | number, nullable | no | | | `maximumChargingRate` | number, nullable | no | | | `maximumDischargingRate` | number, nullable | no | | | `variableEmbodiedCo2` | number, nullable | no | | | `fixedReplacementCost` | number, nullable | no | | | `variableReplacementCostPercent` | number | yes | | | `variableReplacementCostCHF` | number, nullable | no | | | `fixedSalvageValue` | number, nullable | no | | | `variableSalvageValuePercent` | number | yes | | | `variableSalvageValueCHF` | number, nullable | no | | | `mustBeInstalled` | string | yes | | | `storageTechnologyGuid` | string, nullable | no | | | `storageName` | string | yes | | | `exchangeCurrency` | string | yes | | | `exchangeRate` | number | yes | | | `variableInvestmentCost` | number, nullable | no | | | `fixedOmCostChf` | number, nullable | no | | | `lifetime` | integer (int32) | yes | | | `standbyLoss` | number, nullable | no | | | `standByLossProfileId` | integer (int64), nullable | no | | | `minimumSoc` | number, nullable | no | | | `storageChargingEfficiency` | number | yes | | | `storageDischargingEfficiency` | number | yes | | | `technologyCapacity` | string | yes | | | `created` | string (date-time), nullable | no | | | `updated` | string (date-time), nullable | no | | | `storageCarrier` | `EnergyCarrierResponseDto` | yes | | | `hubs` | array of `HubResponseDto` | yes | | | `category` | string | yes | | | `technologyCategory` | string, nullable | no | | | `mutuallyExclusiveGroup` | string, nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `technologyOptional` | boolean, nullable | no | | | `costComponents` | array of `AdvancedCostComponentResponseDto` | yes | | | `comesFromDb` | string, nullable | no | | | `stages` | array of string (uuid) | yes | | | `evPlugInTime` | `LocalTime`, nullable | no | | | `evPlugOutTime` | `LocalTime`, nullable | no | | | `evPlugInDurationHours` | number, nullable | no | | | `drivingDistanceKms` | number, nullable | no | | | `evSocStartPercent` | number, nullable | no | | | `evBatterySizeKWh` | number, nullable | no | | | `maximumSocPercent` | number, nullable | no | | | `evAverageKWhPerKm` | number, nullable | no | | | `evPlugInPowerKW` | number, nullable | no | | | `isEvBattery` | boolean, nullable | no | | | `typeOfCharging` | string, nullable | no | One of: `Smart`, `Dump`, `V2G`, `None`, `None`. | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_2/scenarios/storage-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "variableOmCostPercent": 0.0, "variableOmEnergyFlowCost": 0.0, "capacity": 0.0, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "fixedInvestmentCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableOmCost": 0.0, "maximumChargingRate": 0.0, "maximumDischargingRate": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalled": "string", "storageTechnologyGuid": "string", "storageName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "lifetime": 0, "standbyLoss": 0.0, "standByLossProfileId": 0, "minimumSoc": 0.0, "storageChargingEfficiency": 0.0, "storageDischargingEfficiency": 0.0, "technologyCapacity": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "storageCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "category": "string", "technologyCategory": "string", "mutuallyExclusiveGroup": "string", "notes": "string", "source": "string", "technologyOptional": true, "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "comesFromDb": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "evPlugInTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugOutTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugInDurationHours": 0.0, "drivingDistanceKms": 0.0, "evSocStartPercent": 0.0, "evBatterySizeKWh": 0.0, "maximumSocPercent": 0.0, "evAverageKWhPerKm": 0.0, "evPlugInPowerKW": 0.0, "isEvBattery": true, "typeOfCharging": "Smart" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStorageTechnologyDetailResponseDtoV2` | **Example response** (200) ```json { "data": { "variableOmCostPercent": 0.0, "variableOmEnergyFlowCost": 0.0, "capacity": 0.0, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "fixedInvestmentCost": 0.0, "fixedEmbodiedCo2": 0.0, "variableOmCost": 0.0, "maximumChargingRate": 0.0, "maximumDischargingRate": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "mustBeInstalled": "string", "storageTechnologyGuid": "string", "storageName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "lifetime": 0, "standbyLoss": 0.0, "standByLossProfileId": 0, "minimumSoc": 0.0, "storageChargingEfficiency": 0.0, "storageDischargingEfficiency": 0.0, "technologyCapacity": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "storageCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "category": "string", "technologyCategory": "string", "mutuallyExclusiveGroup": "string", "notes": "string", "source": "string", "technologyOptional": true, "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "comesFromDb": "string", "stages": [ "00000000-0000-0000-0000-000000000000" ], "evPlugInTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugOutTime": { "hour": 0, "minute": 0, "second": 0, "nano": 0 }, "evPlugInDurationHours": 0.0, "drivingDistanceKms": 0.0, "evSocStartPercent": 0.0, "evBatterySizeKWh": 0.0, "maximumSocPercent": 0.0, "evAverageKWhPerKm": 0.0, "evPlugInPowerKW": 0.0, "isEvBattery": true, "typeOfCharging": "Smart" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Technology packages ## Delete technology package { #operation-deleteTechnologyPackage } ``` DELETE /sympheny-app/scenarios/{scenarioGuid}/technology-packages/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.technology_packages.delete()`](../../sdk/reference/technology_packages.md#method-technology_packages-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `guid` | path | string | yes | | | `deleteTechs` | query | boolean | no | Default: `false`. | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/technology-packages/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoTechnologyPackageListResponseDto` | **Example response** (200) ```json { "data": { "technologyPackages": [ { "name": "string", "guid": "string", "conversionTechnologies": [ "string" ], "storageTechnologies": [ "string" ], "dbOrganization": "string" } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all technology packages by scenario v2 { #operation-getAllTechnologyPackagesByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/technology-packages ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.technology_packages.list()`](../../sdk/reference/technology_packages.md#method-technology_packages-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/technology-packages" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoTechnologyPackageListResponseDtoV2` | **Example response** (200) ```json { "data": { "technologyPackages": [ { "maximumConversions": 0, "maximumStorages": 0, "mustBeInstalled": "canBeInstalled", "mutuallyExclusiveGroup": "string", "name": "string", "guid": "string", "conversionTechnologies": [ { "guid": "string", "name": "string" } ], "storageTechnologies": [ { "guid": "string", "name": "string" } ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get technology package by guid v2 { #operation-getTechnologyPackageByGuidV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/technology-packages/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.technology_packages.get()`](../../sdk/reference/technology_packages.md#method-technology_packages-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/technology-packages/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoTechnologyPackageResponseDtoV2` | **Example response** (200) ```json { "data": { "maximumConversions": 0, "maximumStorages": 0, "mustBeInstalled": "canBeInstalled", "mutuallyExclusiveGroup": "string", "name": "string", "guid": "string", "conversionTechnologies": [ { "guid": "string", "name": "string" } ], "storageTechnologies": [ { "guid": "string", "name": "string" } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Specify technology package v2 1 { #operation-specifyTechnologyPackageV2_1 } ``` POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/technology-packages ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.technology_packages.create()`](../../sdk/reference/technology_packages.md#method-technology_packages-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`TechnologyPackageRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `maximumConversions` | integer (int32), nullable | no | | | `maximumStorages` | integer (int32), nullable | no | | | `mustBeInstalled` | string | yes | One of: `canBeInstalled`, `mustBeInstalled`, `mustBeInstalledInAtLeastOneHub`. | | `mutuallyExclusiveGroup` | string, nullable | no | | | `name` | string | yes | | | `conversionTechnologies` | array of string | yes | | | `storageTechnologies` | array of string | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/technology-packages" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "maximumConversions": 0, "maximumStorages": 0, "mustBeInstalled": "canBeInstalled", "mutuallyExclusiveGroup": "string", "name": "string", "conversionTechnologies": [ "string" ], "storageTechnologies": [ "string" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoTechnologyPackageResponseDtoV2` | **Example response** (201) ```json { "data": { "maximumConversions": 0, "maximumStorages": 0, "mustBeInstalled": "canBeInstalled", "mutuallyExclusiveGroup": "string", "name": "string", "guid": "string", "conversionTechnologies": [ { "guid": "string", "name": "string" } ], "storageTechnologies": [ { "guid": "string", "name": "string" } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update technology package v2 1 { #operation-updateTechnologyPackageV2_1 } ``` PUT /sympheny-app/v2_1/scenarios/{scenarioGuid}/technology-packages/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.technology_packages.update()`](../../sdk/reference/technology_packages.md#method-technology_packages-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `guid` | path | string | yes | | **Request body** (`TechnologyPackageResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `maximumConversions` | integer (int32), nullable | no | | | `maximumStorages` | integer (int32), nullable | no | | | `mustBeInstalled` | string | yes | One of: `canBeInstalled`, `mustBeInstalled`, `mustBeInstalledInAtLeastOneHub`. | | `mutuallyExclusiveGroup` | string, nullable | no | | | `name` | string | yes | | | `guid` | string, nullable | no | | | `conversionTechnologies` | array of `GuidNameDto` | yes | | | `storageTechnologies` | array of `GuidNameDto` | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/technology-packages/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "maximumConversions": 0, "maximumStorages": 0, "mustBeInstalled": "canBeInstalled", "mutuallyExclusiveGroup": "string", "name": "string", "guid": "string", "conversionTechnologies": [ { "guid": "string", "name": "string" } ], "storageTechnologies": [ { "guid": "string", "name": "string" } ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoTechnologyPackageResponseDtoV2` | **Example response** (201) ```json { "data": { "maximumConversions": 0, "maximumStorages": 0, "mustBeInstalled": "canBeInstalled", "mutuallyExclusiveGroup": "string", "name": "string", "guid": "string", "conversionTechnologies": [ { "guid": "string", "name": "string" } ], "storageTechnologies": [ { "guid": "string", "name": "string" } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Network technologies ## Delete network technology { #operation-deleteNetworkTechnology } ``` DELETE /sympheny-app/scenarios/network-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_technologies.delete()`](../../sdk/reference/network_technologies.md#method-network_technologies-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/network-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkTechnologyListResponseDto` | **Example response** (200) ```json { "data": { "networkTechnologies": [ { "networkTechnologyGuid": "string", "networkTechnologyName": "string", "networkLoss": 0.0, "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "variableOmCostYear": 0.0, "fixedOmCostChf": 0.0, "fixedOmCostPercent": 0.0, "lifetime": 0.0, "maximumCapacity": 0.0, "minimumCapacity": 0.0, "variableEmbodiedCo2": 0.0, "fixedEmbodiedCo2": 0.0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": null, "value": null } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "category": "string", "technologyCategory": "string", "notes": "string", "source": "string", "networkSize": "string", "comesFromDb": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get network tech details v2 { #operation-getNetworkTechDetailsV2 } ``` GET /sympheny-app/v2/scenarios/network-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_technologies.get()`](../../sdk/reference/network_technologies.md#method-network_technologies-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/network-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkTechnologyResponseDtoV2` | **Example response** (200) ```json { "data": { "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCostCHFkWh": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "networkTechnologyGuid": "string", "networkTechnologyName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "category": "string", "technologyCategory": "string", "notes": "string", "source": "string", "networkSize": "string", "comesFromDb": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all network technologies by scenario v2 { #operation-getAllNetworkTechnologiesByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/network-technologies ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_technologies.list()`](../../sdk/reference/network_technologies.md#method-network_technologies-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/network-technologies" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkTechnologyListResponseDtoV2` | **Example response** (200) ```json { "data": { "networkTechnologies": [ { "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCostCHFkWh": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "networkTechnologyGuid": "string", "networkTechnologyName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "category": "string", "technologyCategory": "string", "notes": "string", "source": "string", "networkSize": "string", "comesFromDb": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update network technology v2 1 { #operation-updateNetworkTechnologyV2_1 } ``` PUT /sympheny-app/v2_1/scenarios/network-technologies/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_technologies.update()`](../../sdk/reference/network_technologies.md#method-network_technologies-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`NetworkTechnologyResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixedInvestmentCost` | number, nullable | no | | | `variableInvestmentCost` | number, nullable | no | | | `fixedOmCostChf` | number, nullable | no | | | `variableOmCostPercent` | number, nullable | no | | | `variableOmCostYear` | number, nullable | no | | | `variableOmCostCHFkWh` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `variableEmbodiedCo2` | number, nullable | no | | | `fixedReplacementCost` | number, nullable | no | | | `variableReplacementCostPercent` | number | yes | | | `variableReplacementCostCHF` | number, nullable | no | | | `fixedSalvageValue` | number, nullable | no | | | `variableSalvageValuePercent` | number | yes | | | `variableSalvageValueCHF` | number, nullable | no | | | `networkTechnologyGuid` | string, nullable | no | | | `networkTechnologyName` | string | yes | | | `exchangeCurrency` | string | yes | | | `exchangeRate` | number | yes | | | `lifetime` | integer (int32) | yes | | | `created` | string (date-time), nullable | no | | | `updated` | string (date-time), nullable | no | | | `energyCarrier` | `EnergyCarrierResponseDto` | yes | | | `category` | string | yes | | | `technologyCategory` | string, nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `networkSize` | string, nullable | no | | | `comesFromDb` | string, nullable | no | | | `costComponents` | array of `AdvancedCostComponentResponseDto` | yes | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/network-technologies/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCostCHFkWh": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "networkTechnologyGuid": "string", "networkTechnologyName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "category": "string", "technologyCategory": "string", "notes": "string", "source": "string", "networkSize": "string", "comesFromDb": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkTechnologyResponseDtoV2` | **Example response** (200) ```json { "data": { "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCostCHFkWh": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "networkTechnologyGuid": "string", "networkTechnologyName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "category": "string", "technologyCategory": "string", "notes": "string", "source": "string", "networkSize": "string", "comesFromDb": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Specify network technology v2 1 { #operation-specifyNetworkTechnologyV2_1 } ``` POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/network-technologies ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_technologies.create()`](../../sdk/reference/network_technologies.md#method-network_technologies-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`NetworkTechnologyRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixedInvestmentCost` | number, nullable | no | | | `variableInvestmentCost` | number, nullable | no | | | `fixedOmCostChf` | number, nullable | no | | | `variableOmCostPercent` | number, nullable | no | | | `variableOmCostYear` | number, nullable | no | | | `variableOmCostCHFkWh` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `variableEmbodiedCo2` | number, nullable | no | | | `fixedReplacementCost` | number, nullable | no | | | `variableReplacementCostPercent` | number, nullable | no | | | `variableReplacementCostCHF` | number, nullable | no | | | `fixedSalvageValue` | number, nullable | no | | | `variableSalvageValuePercent` | number, nullable | no | | | `variableSalvageValueCHF` | number, nullable | no | | | `networkTechnologyName` | string | yes | | | `lifetime` | integer (int32) | yes | | | `energyCarrierGuid` | string | yes | | | `costComponents` | array of `AdvancedCostComponentRequestDto`, nullable | no | | | `suggested` | boolean, nullable | no | | | `technologyCategory` | string, nullable | no | | | `networkSize` | string, nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `comesFromDb` | string, nullable | no | | | `exchangeCurrency` | string, nullable | no | | | `exchangeRate` | number, nullable | no | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/network-technologies" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCostCHFkWh": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "networkTechnologyName": "string", "lifetime": 0, "energyCarrierGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0 } ], "suggested": true, "technologyCategory": "string", "networkSize": "string", "notes": "string", "source": "string", "comesFromDb": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoNetworkTechnologyResponseDtoV2` | **Example response** (201) ```json { "data": { "fixedInvestmentCost": 0.0, "variableInvestmentCost": 0.0, "fixedOmCostChf": 0.0, "variableOmCostPercent": 0.0, "variableOmCostYear": 0.0, "variableOmCostCHFkWh": 0.0, "fixedEmbodiedCo2": 0.0, "variableEmbodiedCo2": 0.0, "fixedReplacementCost": 0.0, "variableReplacementCostPercent": 0.0, "variableReplacementCostCHF": 0.0, "fixedSalvageValue": 0.0, "variableSalvageValuePercent": 0.0, "variableSalvageValueCHF": 0.0, "networkTechnologyGuid": "string", "networkTechnologyName": "string", "exchangeCurrency": "string", "exchangeRate": 0.0, "lifetime": 0, "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "category": "string", "technologyCategory": "string", "notes": "string", "source": "string", "networkSize": "string", "comesFromDb": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Network links ## Delete network link { #operation-deleteNetworkLink } ``` DELETE /sympheny-app/scenarios/{scenarioGuid}/network-links/{network-link-guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_links.delete()`](../../sdk/reference/network_links.md#method-network_links-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `network-link-guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/network-links/{network-link-guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkLinkListResponseDto` | **Example response** (200) ```json { "data": { "networkLinks": [ { "networkLinkGuid": "string", "length": 0.0, "technologyCapacity": "optimize", "installedCapacity": 0.0, "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node1Name": "string", "node2Guid": "string", "node2Name": "string", "networkTechnologyName": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z" } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get network link details v2 { #operation-getNetworkLinkDetailsV2 } ``` GET /sympheny-app/v2/network-links/{network-link-guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_links.get()`](../../sdk/reference/network_links.md#method-network_links-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `network-link-guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/network-links/{network-link-guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkLinkResponseDtoV2` | **Example response** (200) ```json { "data": { "installedCapacity": 0.0, "maximumCapacity": 0.0, "networkLinkGuid": "string", "name": "string", "length": 0.0, "technologyCapacity": "optimize", "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node1Name": "string", "node2Guid": "string", "node2Name": "string", "networkTechnologyName": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "minimumCapacity": 0.0, "networkLoss": 0.0, "networkLossProfileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all network links by scenario v2 { #operation-getAllNetworkLinksByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/network-links ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_links.list()`](../../sdk/reference/network_links.md#method-network_links-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/network-links" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListNetworkLinkResponseDtoV2` | **Example response** (200) ```json { "data": [ { "installedCapacity": 0.0, "maximumCapacity": 0.0, "networkLinkGuid": "string", "name": "string", "length": 0.0, "technologyCapacity": "optimize", "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node1Name": "string", "node2Guid": "string", "node2Name": "string", "networkTechnologyName": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "minimumCapacity": 0.0, "networkLoss": 0.0, "networkLossProfileId": 0 } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Specify network link v2 1 { #operation-specifyNetworkLinkV2_1 } ``` POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/network-links ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_links.create()`](../../sdk/reference/network_links.md#method-network_links-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`NetworkLinkRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `installedCapacity` | number, nullable | no | | | `maximumCapacity` | number, nullable | no | | | `name` | string | yes | | | `length` | number | yes | | | `technologyCapacity` | string | yes | One of: `optimize`, `specify`. | | `uniDirectionalFlow` | boolean | yes | | | `mustBeInstalled` | boolean | yes | | | `node1Guid` | string | yes | | | `node2Guid` | string | yes | | | `networkTechnologyGuid` | string | yes | | | `costComponents` | array of `AdvancedCostComponentRequestDto`, nullable | no | | | `minimumCapacity` | number, nullable | no | | | `networkLoss` | number | yes | | | `networkLossProfileId` | integer (int64), nullable | no | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/{scenarioGuid}/network-links" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "installedCapacity": 0.0, "maximumCapacity": 0.0, "name": "string", "length": 0.0, "technologyCapacity": "optimize", "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node2Guid": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0 } ], "minimumCapacity": 0.0, "networkLoss": 0.0, "networkLossProfileId": 0 }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoNetworkLinkResponseDtoV2` | **Example response** (201) ```json { "data": { "installedCapacity": 0.0, "maximumCapacity": 0.0, "networkLinkGuid": "string", "name": "string", "length": 0.0, "technologyCapacity": "optimize", "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node1Name": "string", "node2Guid": "string", "node2Name": "string", "networkTechnologyName": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "minimumCapacity": 0.0, "networkLoss": 0.0, "networkLossProfileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update network link v2 2 { #operation-updateNetworkLinkV2_2 } ``` PUT /sympheny-app/v2_2/scenarios/{scenarioGuid}/network-links/{network-link-guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.network_links.update()`](../../sdk/reference/network_links.md#method-network_links-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | | `network-link-guid` | path | string | yes | | **Request body** (`NetworkLinkResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `installedCapacity` | number, nullable | no | | | `maximumCapacity` | number, nullable | no | | | `networkLinkGuid` | string, nullable | no | | | `name` | string | yes | | | `length` | number | yes | | | `technologyCapacity` | string | yes | One of: `optimize`, `specify`. | | `uniDirectionalFlow` | boolean | yes | | | `mustBeInstalled` | boolean | yes | | | `node1Guid` | string | yes | | | `node1Name` | string | yes | | | `node2Guid` | string | yes | | | `node2Name` | string | yes | | | `networkTechnologyName` | string | yes | | | `networkTechnologyGuid` | string | yes | | | `costComponents` | array of `AdvancedCostComponentResponseDto` | yes | | | `created` | string (date-time), nullable | no | | | `updated` | string (date-time), nullable | no | | | `minimumCapacity` | number, nullable | no | | | `networkLoss` | number | yes | | | `networkLossProfileId` | integer (int64), nullable | no | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_2/scenarios/{scenarioGuid}/network-links/{network-link-guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "installedCapacity": 0.0, "maximumCapacity": 0.0, "networkLinkGuid": "string", "name": "string", "length": 0.0, "technologyCapacity": "optimize", "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node1Name": "string", "node2Guid": "string", "node2Name": "string", "networkTechnologyName": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "minimumCapacity": 0.0, "networkLoss": 0.0, "networkLossProfileId": 0 }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoNetworkLinkResponseDtoV2` | **Example response** (200) ```json { "data": { "installedCapacity": 0.0, "maximumCapacity": 0.0, "networkLinkGuid": "string", "name": "string", "length": 0.0, "technologyCapacity": "optimize", "uniDirectionalFlow": true, "mustBeInstalled": true, "node1Guid": "string", "node1Name": "string", "node2Guid": "string", "node2Name": "string", "networkTechnologyName": "string", "networkTechnologyGuid": "string", "costComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "minimumCapacity": 0.0, "networkLoss": 0.0, "networkLossProfileId": 0 }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Intra-hub network links ## Get intra hub network link details { #operation-getIntraHubNetworkLinkDetails } ``` GET /sympheny-app/scenarios/intra-hub-network-links/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.intra_hub_network_links.get()`](../../sdk/reference/intra_hub_network_links.md#method-intra_hub_network_links-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/intra-hub-network-links/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoIntraHubNetworkLinkResponseDto` | **Example response** (200) ```json { "data": { "intraHubNetworkLinkGuid": "string", "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "outputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Delete intra hub network link { #operation-deleteIntraHubNetworkLink } ``` DELETE /sympheny-app/scenarios/intra-hub-network-links/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.intra_hub_network_links.delete()`](../../sdk/reference/intra_hub_network_links.md#method-intra_hub_network_links-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/intra-hub-network-links/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoIntraHubNetworkLinkListResponseDto` | **Example response** (200) ```json { "data": { "intraHubNetworkLinks": [ { "intraHubNetworkLinkGuid": "string", "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "outputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "stages": [ "00000000-0000-0000-0000-000000000000" ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get all intra hub network links { #operation-getAllIntraHubNetworkLinks } ``` GET /sympheny-app/scenarios/{scenarioGuid}/intra-hub-network-links ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.intra_hub_network_links.list()`](../../sdk/reference/intra_hub_network_links.md#method-intra_hub_network_links-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/scenarios/{scenarioGuid}/intra-hub-network-links" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoIntraHubNetworkLinkListResponseDto` | **Example response** (200) ```json { "data": { "intraHubNetworkLinks": [ { "intraHubNetworkLinkGuid": "string", "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "outputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "stages": [ "00000000-0000-0000-0000-000000000000" ] } ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Update intra hub network link v2 { #operation-updateIntraHubNetworkLinkV2 } ``` PUT /sympheny-app/v2/scenarios/intra-hub-network-links/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.intra_hub_network_links.update()`](../../sdk/reference/intra_hub_network_links.md#method-intra_hub_network_links-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`IntraHubNetworkLinkResponseDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `intraHubNetworkLinkGuid` | string, nullable | no | | | `name` | string | yes | | | `networkLoss` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `inputEnergyCarrier` | `EnergyCarrierResponseDto` | yes | | | `outputEnergyCarrier` | `EnergyCarrierResponseDto` | yes | | | `hubs` | array of `HubResponseDto` | yes | | | `advancedCostComponents` | array of `AdvancedCostComponentResponseDto` | yes | | | `created` | string (date-time), nullable | no | | | `updated` | string (date-time), nullable | no | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/intra-hub-network-links/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "intraHubNetworkLinkGuid": "string", "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "outputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoIntraHubNetworkLinkResponseDto` | **Example response** (200) ```json { "data": { "intraHubNetworkLinkGuid": "string", "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "outputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Specify intra hub network link v2 { #operation-specifyIntraHubNetworkLinkV2 } ``` POST /sympheny-app/v2/scenarios/{scenarioGuid}/intra-hub-network-links ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.intra_hub_network_links.create()`](../../sdk/reference/intra_hub_network_links.md#method-intra_hub_network_links-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`IntraHubNetworkLinkRequestDto`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `networkLoss` | number, nullable | no | | | `fixedEmbodiedCo2` | number, nullable | no | | | `inputEnergyCarrierGuid` | string | yes | | | `outputEnergyCarrierGuid` | string | yes | | | `hubGuids` | array of string | yes | | | `advancedCostComponents` | array of `AdvancedCostComponentRequestDto`, nullable | no | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/intra-hub-network-links" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrierGuid": "string", "outputEnergyCarrierGuid": "string", "hubGuids": [ "string" ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0 } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoIntraHubNetworkLinkResponseDto` | **Example response** (201) ```json { "data": { "intraHubNetworkLinkGuid": "string", "name": "string", "networkLoss": 0.0, "fixedEmbodiedCo2": 0.0, "inputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "outputEnergyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "hubs": [ { "hubGuid": "string", "hubName": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z" } ], "advancedCostComponents": [ { "name": "string", "value": 0.0, "category": "string", "lifetime": 0.0, "interestRate": 0.0, "length": 0.0, "complexityFactor": 0.0, "dataPoints": 0.0, "numberOfPumps": 0.0, "guid": "string", "categoryId": "string" } ], "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Imports and exports (impex) ## Delete impex { #operation-deleteImpex } ``` DELETE /sympheny-app/impex/{type}/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.impex.delete()`](../../sdk/reference/impex.md#method-impex-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `type` | path | string | yes | One of: `IMPORT`, `EXPORT`. | | `guid` | path | string | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sympheny-app/impex/{type}/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoStatus` | **Example response** (200) ```json { "data": { "code": "string", "desc": "string", "message": "string" }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Get impex by guid v2 { #operation-getImpexByGuidV2 } ``` GET /sympheny-app/v2/impex/{type}/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.impex.get()`](../../sdk/reference/impex.md#method-impex-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `type` | path | string | yes | One of: `IMPORT`, `EXPORT`. | | `guid` | path | string | yes | | | `scenarioVariantGuid` | query | string | no | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/impex/{type}/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoImportExportResponseDtoV2` | **Example response** (200) ```json { "data": { "energyPriceCHFkWh": 0.0, "maxCapacityKW": 0.0, "totalAnnualEnergyAvailableKWhA": 0.0, "capacityPriceCHFkWYear": 0.0, "name": "string", "hourlyEnergyPriceProfileId": 0, "capacityPriceCHFkWMonth": 0.0, "fixedOmPriceCHFYear": 0.0, "co2IntensityKgCo2kWhCo2CompensationKgCo2kWh": 0.0, "dynamicCo2ProfileId": 0, "maximumHourlyEnergyAvailableProfileId": 0, "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "type": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "hubUpdated": "2026-01-01T00:00:00Z", "hubCreated": "2026-01-01T00:00:00Z", "impexGuid": "string" } ], "guid": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z", "priceComponents": [ { "name": "string", "guid": "string", "value": 0.0, "priceCategory": "string", "priceCategoryId": "ENERGY_DELIVERY", "priceDimension": "string", "priceDimensionId": "ENERGY_PRICE_CHF_KWH", "type": "TIME_OF_USE", "timeOfUses": [ "string" ] } ], "timeOfUses": [ { "name": "string", "months": [ "string" ], "days": [ "string" ], "startTime": "string", "endTime": "string" } ], "product": "string", "year": 0, "notes": "string", "source": "string", "suggested": true, "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Find all by scenario v2 { #operation-findAllByScenarioV2 } ``` GET /sympheny-app/v2/scenarios/{scenarioGuid}/impexes ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.impex.list()`](../../sdk/reference/impex.md#method-impex-list). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sympheny-app/v2/scenarios/{scenarioGuid}/impexes" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoListImportExportResponseDtoV2` | **Example response** (200) ```json { "data": [ { "energyPriceCHFkWh": 0.0, "maxCapacityKW": 0.0, "totalAnnualEnergyAvailableKWhA": 0.0, "capacityPriceCHFkWYear": 0.0, "name": "string", "hourlyEnergyPriceProfileId": 0, "capacityPriceCHFkWMonth": 0.0, "fixedOmPriceCHFYear": 0.0, "co2IntensityKgCo2kWhCo2CompensationKgCo2kWh": 0.0, "dynamicCo2ProfileId": 0, "maximumHourlyEnergyAvailableProfileId": 0, "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "type": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "hubUpdated": "2026-01-01T00:00:00Z", "hubCreated": "2026-01-01T00:00:00Z", "impexGuid": "string" } ], "guid": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z", "priceComponents": [ { "name": "string", "guid": "string", "value": 0.0, "priceCategory": "string", "priceCategoryId": "ENERGY_DELIVERY", "priceDimension": "string", "priceDimensionId": "ENERGY_PRICE_CHF_KWH", "type": "TIME_OF_USE", "timeOfUses": [ "string" ] } ], "timeOfUses": [ { "name": "string", "months": [ "string" ], "days": [ "string" ], "startTime": "string", "endTime": "string" } ], "product": "string", "year": 0, "notes": "string", "source": "string", "suggested": true, "stages": [ "00000000-0000-0000-0000-000000000000" ] } ], "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Create new impex v2 1 { #operation-createNewImpexV2_1 } ``` POST /sympheny-app/v2_1/scenario/{scenarioGuid}/impex ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.impex.create()`](../../sdk/reference/impex.md#method-impex-create). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `scenarioGuid` | path | string | yes | | **Request body** (`ImportExportRequestDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `energyPriceCHFkWh` | number, nullable | no | | | `maxCapacityKW` | number, nullable | no | | | `totalAnnualEnergyAvailableKWhA` | number, nullable | no | | | `capacityPriceCHFkWYear` | number, nullable | no | | | `name` | string | yes | | | `hourlyEnergyPriceProfileId` | integer (int64), nullable | no | | | `capacityPriceCHFkWMonth` | number, nullable | no | | | `fixedOmPriceCHFYear` | number, nullable | no | | | `co2IntensityKgCo2kWhCo2CompensationKgCo2kWh` | number, nullable | no | | | `dynamicCo2ProfileId` | integer (int64), nullable | no | | | `maximumHourlyEnergyAvailableProfileId` | integer (int64), nullable | no | | | `energyCarrierGuid` | string | yes | | | `type` | string | yes | One of: `IMPORT`, `EXPORT`. | | `hubs` | array of `ImpexHubRequestDto` | yes | | | `product` | string, nullable | no | | | `year` | integer (int32), nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `suggested` | boolean, nullable | no | | | `priceComponents` | array of `AdvancedPriceComponentRequestDtoV2`, nullable | no | | | `timeOfUses` | array of `TimeOfUseRequestDto`, nullable | no | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenario/{scenarioGuid}/impex" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "energyPriceCHFkWh": 0.0, "maxCapacityKW": 0.0, "totalAnnualEnergyAvailableKWhA": 0.0, "capacityPriceCHFkWYear": 0.0, "name": "string", "hourlyEnergyPriceProfileId": 0, "capacityPriceCHFkWMonth": 0.0, "fixedOmPriceCHFYear": 0.0, "co2IntensityKgCo2kWhCo2CompensationKgCo2kWh": 0.0, "dynamicCo2ProfileId": 0, "maximumHourlyEnergyAvailableProfileId": 0, "energyCarrierGuid": "string", "type": "IMPORT", "hubs": [ { "hubGuid": "string" } ], "product": "string", "year": 0, "notes": "string", "source": "string", "suggested": true, "priceComponents": [ { "name": "string", "value": 0.0, "priceCategory": "ENERGY_DELIVERY", "priceDimension": "ENERGY_PRICE_CHF_KWH", "type": "TIME_OF_USE", "timeOfUses": [ "string" ], "priceCategoryId": "ENERGY_DELIVERY", "priceDimensionId": "ENERGY_PRICE_CHF_KWH" } ], "timeOfUses": [ { "name": "string", "months": [ "string" ], "days": [ "string" ], "startTime": "string", "endTime": "string" } ], "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Created | `ResponseDtoImportExportResponseDtoV2` | **Example response** (201) ```json { "data": { "energyPriceCHFkWh": 0.0, "maxCapacityKW": 0.0, "totalAnnualEnergyAvailableKWhA": 0.0, "capacityPriceCHFkWYear": 0.0, "name": "string", "hourlyEnergyPriceProfileId": 0, "capacityPriceCHFkWMonth": 0.0, "fixedOmPriceCHFYear": 0.0, "co2IntensityKgCo2kWhCo2CompensationKgCo2kWh": 0.0, "dynamicCo2ProfileId": 0, "maximumHourlyEnergyAvailableProfileId": 0, "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "type": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "hubUpdated": "2026-01-01T00:00:00Z", "hubCreated": "2026-01-01T00:00:00Z", "impexGuid": "string" } ], "guid": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z", "priceComponents": [ { "name": "string", "guid": "string", "value": 0.0, "priceCategory": "string", "priceCategoryId": "ENERGY_DELIVERY", "priceDimension": "string", "priceDimensionId": "ENERGY_PRICE_CHF_KWH", "type": "TIME_OF_USE", "timeOfUses": [ "string" ] } ], "timeOfUses": [ { "name": "string", "months": [ "string" ], "days": [ "string" ], "startTime": "string", "endTime": "string" } ], "product": "string", "year": 0, "notes": "string", "source": "string", "suggested": true, "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` ## Edit impex v2 1 { #operation-editImpexV2_1 } ``` PUT /sympheny-app/v2_1/scenarios/impex/{guid} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.impex.update()`](../../sdk/reference/impex.md#method-impex-update). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `guid` | path | string | yes | | **Request body** (`ImportExportResponseDtoV2`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `energyPriceCHFkWh` | number, nullable | no | | | `maxCapacityKW` | number, nullable | no | | | `totalAnnualEnergyAvailableKWhA` | number, nullable | no | | | `capacityPriceCHFkWYear` | number, nullable | no | | | `name` | string | yes | | | `hourlyEnergyPriceProfileId` | integer (int64), nullable | no | | | `capacityPriceCHFkWMonth` | number, nullable | no | | | `fixedOmPriceCHFYear` | number, nullable | no | | | `co2IntensityKgCo2kWhCo2CompensationKgCo2kWh` | number, nullable | no | | | `dynamicCo2ProfileId` | integer (int64), nullable | no | | | `maximumHourlyEnergyAvailableProfileId` | integer (int64), nullable | no | | | `energyCarrier` | `EnergyCarrierResponseDto` | yes | | | `type` | string | yes | | | `hubs` | array of `ImpexHubResponseDto` | yes | | | `guid` | string, nullable | no | | | `updated` | string (date-time), nullable | no | | | `created` | string (date-time), nullable | no | | | `priceComponents` | array of `AdvancedPriceComponentResponseDtoV2` | yes | | | `timeOfUses` | array of `TimeOfUseResponseDto` | yes | | | `product` | string, nullable | no | | | `year` | integer (int32), nullable | no | | | `notes` | string, nullable | no | | | `source` | string, nullable | no | | | `suggested` | boolean, nullable | no | | | `stages` | array of string (uuid) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sympheny-app/v2_1/scenarios/impex/{guid}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "energyPriceCHFkWh": 0.0, "maxCapacityKW": 0.0, "totalAnnualEnergyAvailableKWhA": 0.0, "capacityPriceCHFkWYear": 0.0, "name": "string", "hourlyEnergyPriceProfileId": 0, "capacityPriceCHFkWMonth": 0.0, "fixedOmPriceCHFYear": 0.0, "co2IntensityKgCo2kWhCo2CompensationKgCo2kWh": 0.0, "dynamicCo2ProfileId": 0, "maximumHourlyEnergyAvailableProfileId": 0, "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "type": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "hubUpdated": "2026-01-01T00:00:00Z", "hubCreated": "2026-01-01T00:00:00Z", "impexGuid": "string" } ], "guid": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z", "priceComponents": [ { "name": "string", "guid": "string", "value": 0.0, "priceCategory": "string", "priceCategoryId": "ENERGY_DELIVERY", "priceDimension": "string", "priceDimensionId": "ENERGY_PRICE_CHF_KWH", "type": "TIME_OF_USE", "timeOfUses": [ "string" ] } ], "timeOfUses": [ { "name": "string", "months": [ "string" ], "days": [ "string" ], "startTime": "string", "endTime": "string" } ], "product": "string", "year": 0, "notes": "string", "source": "string", "suggested": true, "stages": [ "00000000-0000-0000-0000-000000000000" ] }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | OK | `ResponseDtoImportExportResponseDtoV2` | **Example response** (200) ```json { "data": { "energyPriceCHFkWh": 0.0, "maxCapacityKW": 0.0, "totalAnnualEnergyAvailableKWhA": 0.0, "capacityPriceCHFkWYear": 0.0, "name": "string", "hourlyEnergyPriceProfileId": 0, "capacityPriceCHFkWMonth": 0.0, "fixedOmPriceCHFYear": 0.0, "co2IntensityKgCo2kWhCo2CompensationKgCo2kWh": 0.0, "dynamicCo2ProfileId": 0, "maximumHourlyEnergyAvailableProfileId": 0, "energyCarrier": { "energyCarrierGuid": "string", "typeKey": "string", "typeDisplayName": "string", "subtypeKey": "string", "subtypeDisplayName": "string", "energyCarrierName": "string", "colorHexCode": "string", "fixedInputShare": 0.0, "outputEfficiency": 0.0, "customOutputEfficiencyActivated": true, "customInputEfficiencyActivated": true, "customSeasonalityValues": [ { "month": "JANUARY", "value": 0.0 } ], "outputEfficiencyProfileId": 0, "created": "2026-01-01T00:00:00Z", "primary": true }, "type": "string", "hubs": [ { "hubGuid": "string", "hubName": "string", "hubUpdated": "2026-01-01T00:00:00Z", "hubCreated": "2026-01-01T00:00:00Z", "impexGuid": "string" } ], "guid": "string", "updated": "2026-01-01T00:00:00Z", "created": "2026-01-01T00:00:00Z", "priceComponents": [ { "name": "string", "guid": "string", "value": 0.0, "priceCategory": "string", "priceCategoryId": "ENERGY_DELIVERY", "priceDimension": "string", "priceDimensionId": "ENERGY_PRICE_CHF_KWH", "type": "TIME_OF_USE", "timeOfUses": [ "string" ] } ], "timeOfUses": [ { "name": "string", "months": [ "string" ], "days": [ "string" ], "startTime": "string", "endTime": "string" } ], "product": "string", "year": 0, "notes": "string", "source": "string", "suggested": true, "stages": [ "00000000-0000-0000-0000-000000000000" ] }, "status": { "code": "string", "desc": "string", "message": "string" } } ``` --- # Auth External API - auth resource ## Post Oauth Webapp { #operation-post_oauth_webapp_backoffice_auth_ext_token_post } ``` POST /backoffice/auth/ext/token ``` No authentication required. **Request body** (`Auth0UserCredentials`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | string (email) | yes | | | `password` | string | yes | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/backoffice/auth/ext/token" \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com", "password": "string" }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | `Auth0UserAccessToken` | | 400 | Bad Request | `AppException` | | 401 | Unauthorized | `AppException` | | 404 | Not Found | `AppException` | | 409 | Conflict | `AppException` | | 500 | Internal Server Error | `AppException` | | 422 | Validation Error | `HTTPValidationError` | **Example response** (200) ```json { "access_token": "string", "token_type": "string", "expires_in": 0 } ``` --- # Users External API - users resource ## Get User Profile { #operation-get_user_profile_backoffice_ext_users_profile_get } ``` GET /backoffice/ext/users/profile ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.users.profile()`](../../sdk/reference/users.md#method-users-profile). **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/backoffice/ext/users/profile" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | `GetUserProfileExt` | | 400 | Bad Request | `AppException` | | 401 | Unauthorized | `AppException` | | 404 | Not Found | `AppException` | | 409 | Conflict | `AppException` | | 500 | Internal Server Error | `AppException` | **Example response** (200) ```json { "account": { "email": "user@example.com", "planLimitationId": "string", "organizationId": "string", "subscriptionId": "string", "planExpiry": "2026-01-01", "numberOfExecutionsLeft": 0, "executionTimeWeekLeft": 0, "mfa": false, "deactivated": false, "superuser": false, "admin": false, "showMaintenanceInfo": false, "showGtc": false, "showUserGuide": false, "accountGuid": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z" }, "preferences": { "exchangeCurrencyDefault": "string", "unitSystemDefault": "string", "languageDefault": "English", "interestRateDefault": 0.0, "firstName": "string", "lastName": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z" }, "planLimitation": { "intraHubNetwork": false, "advancedCostComponents": false, "unitCommitment": false, "maxEnergyCarriersPerHub": 0, "maxEnergyDemands": 0, "maxHubs": 0, "maxStages": 1, "maxSolarResources": 0, "maxOtherResources": 0, "maxImports": 0, "maxExports": 0, "maxConversionTechs": 0, "maxConversionModes": 0, "maxStorageTechs": 0, "maxNetworkTechs": 0, "maxNetworkLinks": 0, "maxExecutions": 0, "maxSimultaneousExecutions": 0, "maxExecutionTime": 0, "maxExecutionTimeWeek": 0, "maxExecutionHistory": 100, "maxParetoPoints": 9, "fullTemporalResolution": false, "maxProjects": 0, "maxAnalyses": 0, "maxScenarios": 0, "shareProject": false, "organizationDb": false, "scenarioVariants": false, "maxScenarioVariants": 0, "name": "string", "id": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "sagemakerOn": true, "sagemakerRegions": [ "eu-north-1" ] }, "organization": { "name": "string", "gisOn": false, "sepOn": false, "sepBuildingsLimit": 0, "executionSlots": 0, "variableBilling": false, "maxExecutions": 0, "maxSimultaneousExecutions": 0, "maxExecutionTime": 0, "maxExecutionTimeWeek": 0, "numberOfExecutionsLeft": 0, "executionTimeWeekLeft": 0, "id": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z", "sepBuildingsConsumed": 0 }, "subscription": { "name": "string", "organizationId": "string", "startDate": "2026-01-01", "endDate": "2026-01-01", "billingCycle": "MONTHLY", "nextBillingDate": "2026-01-01", "variableBilling": false, "executionPriority": 0, "maxSimultaneousExecutions": 0, "maxExecutionsPerCycle": 0, "maxExecutionTimePerCycle": 0, "maxExecutionsPerWeek": 0, "maxExecutionTimePerWeek": 0, "userMaxExecutionsPerCycle": 0, "userMaxExecutionTimePerCycle": 0, "userMaxExecutionsPerWeek": 0, "userMaxExecutionTimePerWeek": 0, "id": "string", "created": "2026-01-01T00:00:00Z", "updated": "2026-01-01T00:00:00Z" }, "profilePicture": "string", "organizationPicture": "string" } ``` --- # Solver jobs ## Post Solver Jobs { #operation-post_solver_jobs_sense_api_ext_solver_jobs_post } ``` POST /sense-api/ext/solver/jobs ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solver_jobs.submit()`](../../sdk/reference/solver_jobs.md#method-solver_jobs-submit). **Request body** (array of `PostSolverJobExt`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `objective1` | `ObjectiveFunction` | yes | One of: `MIN_LIFE_CYCLE_COST`, `MIN_ANNUALIZED_COST`, `MIN_CO2_EMISSIONS`, `MIN_INVESTMENT`, `MIN_OM`, `MIN_FUEL_IMPORTS`, `MIN_REPLACEMENT`, `MAX_EXPORTS`, `MAX_SALVAGE`. | | `objective2` | `ObjectiveFunction`, nullable | no | | | `scenarioGuid` | string, nullable | no | | | `scenarioName` | string, nullable | no | | | `temporalResolution` | `TemporalResolution` | yes | One of: `LOW`, `MEDIUM`, `HIGH`, `FULL`. | | `points` | integer | yes | | | `timeLimit` | integer | yes | | | `mipGap` | number | yes | | | `inputFileId` | string (uuid4), nullable | no | | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sense-api/ext/solver/jobs" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '[ { "name": "string", "objective1": "MIN_LIFE_CYCLE_COST", "objective2": "MIN_LIFE_CYCLE_COST", "scenarioGuid": "string", "scenarioName": "string", "temporalResolution": "LOW", "points": 0, "timeLimit": 0, "mipGap": 0.0, "inputFileId": "string" } ]' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | array of `SolverJob` | | 400 | Bad Request | `CustomHTTPException` | | 401 | Unauthorized | `CustomHTTPException` | | 404 | Not Found | `CustomHTTPException` | | 409 | Conflict | `CustomHTTPException` | | 413 | Request Entity Too Large | `CustomHTTPException` | | 500 | Internal Server Error | `CustomHTTPException` | | 422 | Validation Error | `HTTPValidationError` | **Example response** (200) ```json [ { "status": "VALIDATING", "statusMsg": "Validating", "batchId": "string", "pointsCompleted": 0, "started": "2026-01-01T00:00:00Z", "terminated": "2026-01-01T00:00:00Z", "infeasibilityInfo": "string", "name": "string", "objective1": "MIN_LIFE_CYCLE_COST", "objective2": "MIN_LIFE_CYCLE_COST", "scenarioGuid": "string", "scenarioName": "string", "temporalResolution": "LOW", "points": 0, "timeLimit": 0, "mipGap": 0.0, "accountGuid": "string", "organizationId": "string", "subscriptionId": "string", "id": "string", "created": "2026-01-01T00:00:00Z" } ] ``` ## Post Get Scenario Jobs { #operation-post_get_scenario_jobs_sense_api_ext_solver_jobs_get_scenarios_post } ``` POST /sense-api/ext/solver/jobs/get-scenarios ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solver_jobs.list_for_scenarios()`](../../sdk/reference/solver_jobs.md#method-solver_jobs-list_for_scenarios). **Request body** (`GetScenarioGuidsPage`) | Field | Type | Required | Description | | --- | --- | --- | --- | | `scenarioGuids` | array of string | yes | | | `limit` | integer | no | Default: `200`. | **Example request** ```bash curl -X POST "https://eu-north-1-api.sympheny.com/sense-api/ext/solver/jobs/get-scenarios" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "scenarioGuids": [ "string" ], "limit": 200 }' ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | array of `SolverJob` | | 400 | Bad Request | `CustomHTTPException` | | 401 | Unauthorized | `CustomHTTPException` | | 404 | Not Found | `CustomHTTPException` | | 409 | Conflict | `CustomHTTPException` | | 413 | Request Entity Too Large | `CustomHTTPException` | | 500 | Internal Server Error | `CustomHTTPException` | | 422 | Validation Error | `HTTPValidationError` | **Example response** (200) ```json [ { "status": "VALIDATING", "statusMsg": "Validating", "batchId": "string", "pointsCompleted": 0, "started": "2026-01-01T00:00:00Z", "terminated": "2026-01-01T00:00:00Z", "infeasibilityInfo": "string", "name": "string", "objective1": "MIN_LIFE_CYCLE_COST", "objective2": "MIN_LIFE_CYCLE_COST", "scenarioGuid": "string", "scenarioName": "string", "temporalResolution": "LOW", "points": 0, "timeLimit": 0, "mipGap": 0.0, "accountGuid": "string", "organizationId": "string", "subscriptionId": "string", "id": "string", "created": "2026-01-01T00:00:00Z" } ] ``` ## Get Solver Jobs Usage { #operation-get_solver_jobs_usage_sense_api_ext_solver_jobs_usage_get } ``` GET /sense-api/ext/solver/jobs/usage ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solver_jobs.usage()`](../../sdk/reference/solver_jobs.md#method-solver_jobs-usage). **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sense-api/ext/solver/jobs/usage" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | `GetUsageExt` | | 400 | Bad Request | `CustomHTTPException` | | 401 | Unauthorized | `CustomHTTPException` | | 404 | Not Found | `CustomHTTPException` | | 409 | Conflict | `CustomHTTPException` | | 413 | Request Entity Too Large | `CustomHTTPException` | | 500 | Internal Server Error | `CustomHTTPException` | **Example response** (200) ```json { "subscription": { "totalCountOverage": 0, "totalMinutesOverage": 0, "weeklyCountOverage": 0, "weeklyMinutesOverage": 0, "totalCount": 0, "totalMinutes": 0, "currentWeekCount": 0, "currentWeekMinutes": 0 }, "user": { "totalCount": 0, "totalMinutes": 0, "currentWeekCount": 0, "currentWeekMinutes": 0, "historyCount": 0 } } ``` ## Get Solver Job { #operation-get_solver_job_sense_api_ext_solver_jobs__id__get } ``` GET /sense-api/ext/solver/jobs/{id} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solver_jobs.get()`](../../sdk/reference/solver_jobs.md#method-solver_jobs-get). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | path | string (uuid) | yes | | **Example request** ```bash curl -X GET "https://eu-north-1-api.sympheny.com/sense-api/ext/solver/jobs/{id}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | `GetSolverJobExt` | | 400 | Bad Request | `CustomHTTPException` | | 401 | Unauthorized | `CustomHTTPException` | | 404 | Not Found | `CustomHTTPException` | | 409 | Conflict | `CustomHTTPException` | | 413 | Request Entity Too Large | `CustomHTTPException` | | 500 | Internal Server Error | `CustomHTTPException` | | 422 | Validation Error | `HTTPValidationError` | **Example response** (200) ```json { "status": "VALIDATING", "statusMsg": "Validating", "batchId": "string", "pointsCompleted": 0, "started": "2026-01-01T00:00:00Z", "terminated": "2026-01-01T00:00:00Z", "infeasibilityInfo": "string", "name": "string", "objective1": "MIN_LIFE_CYCLE_COST", "objective2": "MIN_LIFE_CYCLE_COST", "scenarioGuid": "string", "scenarioName": "string", "temporalResolution": "LOW", "points": 0, "timeLimit": 0, "mipGap": 0.0, "accountGuid": "string", "organizationId": "string", "subscriptionId": "string", "id": "string", "created": "2026-01-01T00:00:00Z", "inputFile": "string", "outputFile": "string" } ``` ## Delete Solver Job { #operation-delete_solver_job_sense_api_ext_solver_jobs__id__delete } ``` DELETE /sense-api/ext/solver/jobs/{id} ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solver_jobs.delete()`](../../sdk/reference/solver_jobs.md#method-solver_jobs-delete). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | path | string (uuid) | yes | | **Example request** ```bash curl -X DELETE "https://eu-north-1-api.sympheny.com/sense-api/ext/solver/jobs/{id}" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | string | | 400 | Bad Request | `CustomHTTPException` | | 401 | Unauthorized | `CustomHTTPException` | | 404 | Not Found | `CustomHTTPException` | | 409 | Conflict | `CustomHTTPException` | | 413 | Request Entity Too Large | `CustomHTTPException` | | 500 | Internal Server Error | `CustomHTTPException` | | 422 | Validation Error | `HTTPValidationError` | **Example response** (200) ```json "string" ``` ## Stop Job { #operation-stop_job_sense_api_ext_solver_jobs__id__stop_put } ``` PUT /sense-api/ext/solver/jobs/{id}/stop ``` Requires a [Bearer token](../authentication.md). SDK method: [`client.solver_jobs.stop()`](../../sdk/reference/solver_jobs.md#method-solver_jobs-stop). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | path | string (uuid) | yes | | **Example request** ```bash curl -X PUT "https://eu-north-1-api.sympheny.com/sense-api/ext/solver/jobs/{id}/stop" \ -H "Authorization: Bearer $SYMPHENY_TOKEN" ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Successful Response | string | | 400 | Bad Request | `CustomHTTPException` | | 401 | Unauthorized | `CustomHTTPException` | | 404 | Not Found | `CustomHTTPException` | | 409 | Conflict | `CustomHTTPException` | | 413 | Request Entity Too Large | `CustomHTTPException` | | 500 | Internal Server Error | `CustomHTTPException` | | 422 | Validation Error | `HTTPValidationError` | **Example response** (200) ```json "string" ``` --- # Python SDK `sympheny-toolbox` is the official Python client for the Sympheny API. It exposes every documented REST endpoint as a typed method, validates requests and responses with Pydantic models, and handles authentication (login, token caching, refresh) for you. ## Install ```sh pip install sympheny-toolbox ``` Requires Python 3.11 or newer. ## One API, sync and async Every method exists on both `Sympheny` and `AsyncSympheny` with identical signatures — the sync client is generated from the async source, so the two can never diverge. These docs describe the async client once; every code example has a **Sync** / **Async** tab, and your choice persists across all pages. ## Quickstart Authenticate with your Sympheny account credentials, then reach the endpoints through resource groups on the client (`client.projects`, `client.scenarios`, …): === "Async" ```python import asyncio from sympheny_toolbox import AsyncSympheny async def main() -> None: async with AsyncSympheny("you@example.com", "password") as client: projects = await client.projects.list() for project in projects: print(project.project_name, project.project_guid) asyncio.run(main()) ``` === "Sync" ```python from sympheny_toolbox import Sympheny with Sympheny("you@example.com", "password") as client: projects = client.projects.list() for project in projects: print(project.project_name, project.project_guid) ``` The client is a context manager; it closes its HTTP connection pool on exit. Outside a `with` block, call `aclose()` (async) or `close()` (sync) yourself. ### Client options | Argument | Default | Description | | --- | --- | --- | | `username` | — | Sympheny account email address. | | `password` | — | Sympheny account password. | | `is_dev` | `False` | Use the development environment instead of production. | | `base_url` | production URL | Override the API base URL entirely (takes precedence over `is_dev`). | | `timeout` | `30.0` | Request timeout in seconds. | ### Errors Failed requests raise typed exceptions from `sympheny_toolbox.errors`, all subclasses of `SymphenyError`: `AuthenticationError` (401), `PermissionDeniedError` (403), `NotFoundError` (404), `APIError` (any other unsuccessful status, with `status_code` and `body` attributes), and `UnexpectedResponseError` (the response lacked the expected payload). ## Where to go next - [Workflows](workflows/index.md) — end-to-end guides: create a scenario from Excel, run a solver job, and download the results. - [SDK reference](reference/projects.md) — one page per resource group, one section per method, each cross-linked to the REST operation it wraps. - [Model reference](reference/models/common.md) — the Pydantic request/response models, grouped by resource. - [REST API reference](../api/index.md) — the underlying HTTP API, if you need to call it directly. --- # Workflows The [SDK reference](../reference/projects.md) documents one method at a time. These guides string those methods together into the end-to-end flows you actually run: take a scenario from an Excel workbook, optimize it, and read the results back. ## The end-to-end flow Most automation follows the same three steps, each covered by one guide: 1. **[Create a scenario from Excel](scenario-from-excel.md)** — upload a filled-in scenario workbook and turn it into a scenario you can execute. 2. **[Run a solver job](run-solver-job.md)** — submit the scenario to the solver and poll until the optimization finishes. 3. **[Download the results](download-results.md)** — fetch the result file of a finished job, or link straight to its results dashboard. You can also start in the middle: if you already modelled a scenario in the [web application](../../web-app/index.md), skip to step 2 with its scenario GUID. ## Prerequisites - The SDK installed and a Sympheny account — see the [SDK overview](../index.md). - Familiarity with the Sympheny domain model helps; the [concepts](../../web-app/concepts/index.md) pages define hubs, energy carriers, demands, and technologies once, and the reference pages link back to them. ## Sync or async Every example has a **Sync** and an **Async** tab, and your choice persists across pages. The two are identical apart from `Sympheny`/`AsyncSympheny`, `await`, and `time.sleep` vs `asyncio.sleep`. !!! note "Convenience helpers are sync-only" The `sympheny_toolbox.workflows` module bundles several of these flows into one-line helpers (for example `workflows.execute_scenario`). They are built on the synchronous client and have no async twin — each guide points them out where they apply, and shows the client-level calls you would use on the async client. --- # Create a scenario from Excel Turn a filled-in scenario Excel workbook into a Sympheny scenario you can execute. This is the fastest way to create a fully-specified scenario in one call instead of building it stage by stage. ## Prerequisites - An **analysis GUID** to create the scenario in. List your projects with [`client.projects.list()`](../reference/projects.md#method-projects-list) and their analyses with [`client.analyses.list(project_guid)`](../reference/analyses.md#method-analyses-list), or copy the GUID from the analysis URL in the [web application](../../web-app/how-to/managing-analyses.md). - A scenario **Excel workbook** with the sheets the importer expects (`Stages`, `Hubs`, `Energy Carriers`, `Demands`, `Conversion Techs`, …). Export one from an existing scenario in the web app to use as a template. ## Steps Uploading happens in three calls: ask for a presigned upload URL, PUT the file to it, then create the scenario from that URL. === "Async" ```python import asyncio from pathlib import Path from sympheny_toolbox import AsyncSympheny async def main() -> None: analysis_guid = "your-analysis-guid" content = Path("scenario.xlsx").read_bytes() async with AsyncSympheny("you@example.com", "password") as client: upload_url = await client.unofficial.get_upload_url() await client.unofficial.upload_to_presigned_url(upload_url, content) scenario_guid = await client.unofficial.create_scenario_from_excel_url( upload_url, "Scenario from Excel", analysis_guid ) print("created scenario", scenario_guid) asyncio.run(main()) ``` === "Sync" ```python from pathlib import Path from sympheny_toolbox import Sympheny analysis_guid = "your-analysis-guid" content = Path("scenario.xlsx").read_bytes() with Sympheny("you@example.com", "password") as client: upload_url = client.unofficial.get_upload_url() client.unofficial.upload_to_presigned_url(upload_url, content) scenario_guid = client.unofficial.create_scenario_from_excel_url( upload_url, "Scenario from Excel", analysis_guid ) print("created scenario", scenario_guid) ``` `create_scenario_from_excel_url` returns the new scenario's GUID — pass it straight to [Run a solver job](run-solver-job.md). !!! note "Unofficial endpoints" [`get_upload_url`](../reference/unofficial.md#method-unofficial-get_upload_url), [`upload_to_presigned_url`](../reference/unofficial.md#method-unofficial-upload_to_presigned_url), and [`create_scenario_from_excel_url`](../reference/unofficial.md#method-unofficial-create_scenario_from_excel_url) wrap endpoints that are **not part of the published REST spec**. They power the web app's Excel import and are stable in practice, but may change without a version bump. ## Shortcut (sync client only) The `workflows` module collapses the three calls into one. It reads the file, uploads it, and creates the scenario: ```python from sympheny_toolbox import Sympheny, workflows with Sympheny("you@example.com", "password") as client: scenario_guid = workflows.create_scenario_from_excel( client, "scenario.xlsx", "Scenario from Excel", analysis_guid ) ``` This helper is built on the synchronous client and has no async twin; on the async client, use the three calls above. ## What to read next - [Run a solver job](run-solver-job.md) — optimize the scenario you just created. - [Scenarios reference](../reference/scenarios.md) — inspect, rename, copy, or delete the scenario. - [Modeling scenarios](../../web-app/how-to/modeling-scenarios/index.md) — what each workbook sheet corresponds to in the scenario editor. --- # Run a solver job Submit a scenario to the Sympheny solver and wait for the optimization to finish. This mirrors clicking **Execute** in the [web application](../../web-app/how-to/executing-scenarios.md), but scripted end to end. ## Prerequisites - A **scenario GUID** that is ready for execution — for example the one returned by [Create a scenario from Excel](scenario-from-excel.md), or an existing scenario's GUID. - Solver quota on your subscription. Check it with [`client.solver_jobs.usage()`](../reference/solver_jobs.md#method-solver_jobs-usage). ## Build the request A solver job is described by a [`PostSolverJobExt`](../reference/models/solver.md#model-PostSolverJobExt). The request is plain data, so you build it the same way whichever client you use: ```python from sympheny_toolbox.models import ObjectiveFunction, PostSolverJobExt, TemporalResolution request = PostSolverJobExt( name="Battery evaluation", objective1=ObjectiveFunction.min_life_cycle_cost, objective2=ObjectiveFunction.min_co2_emissions, scenario_guid="your-scenario-guid", temporal_resolution=TemporalResolution.low, points=2, time_limit=30, mip_gap=1.0, ) ``` - **`objective1` / `objective2`** — the optimization objectives (see [`ObjectiveFunction`](../reference/models/solver.md#model-ObjectiveFunction)). With two objectives the solver returns a Pareto front of `points` solutions. - **`temporal_resolution`** — how aggressively the 8760-hour year is [clustered](../../web-app/concepts/clustered-profiles.md) before solving (`LOW`/`MEDIUM`/`HIGH`/`FULL`); lower is faster, coarser. - **`mip_gap`** — the optimality gap, in percent, at which the solver stops. !!! warning "`time_limit` is in minutes" `time_limit` is the solver's processing budget in **minutes** (queue time excluded), not seconds. The server terminates a job once it is exceeded. ## Submit and poll Submit the request, then poll the job until it reaches a terminal status. `DONE` means the optimization succeeded; `STOPPED`, `FAILED`, and `INVALID` are terminal failures. === "Async" ```python import asyncio from sympheny_toolbox import AsyncSympheny from sympheny_toolbox.models import JobStatus TERMINAL = {JobStatus.done, JobStatus.stopped, JobStatus.failed, JobStatus.invalid} async def main() -> None: async with AsyncSympheny("you@example.com", "password") as client: submitted = await client.solver_jobs.submit([request]) job_id = submitted[0].id while True: job = await client.solver_jobs.get(job_id) print(job.status) if job.status in TERMINAL: break await asyncio.sleep(10) if job.status is not JobStatus.done: raise RuntimeError(f"Job did not finish cleanly: {job.status} — {job.infeasibility_info}") print("finished job", job_id) asyncio.run(main()) ``` === "Sync" ```python import time from sympheny_toolbox import Sympheny from sympheny_toolbox.models import JobStatus TERMINAL = {JobStatus.done, JobStatus.stopped, JobStatus.failed, JobStatus.invalid} with Sympheny("you@example.com", "password") as client: submitted = client.solver_jobs.submit([request]) job_id = submitted[0].id while True: job = client.solver_jobs.get(job_id) print(job.status) if job.status in TERMINAL: break time.sleep(10) if job.status is not JobStatus.done: raise RuntimeError(f"Job did not finish cleanly: {job.status} — {job.infeasibility_info}") print("finished job", job_id) ``` [`submit`](../reference/solver_jobs.md#method-solver_jobs-submit) takes a **list** of requests and returns one [`SolverJob`](../reference/models/solver.md#model-SolverJob) per request, so you can batch several scenarios in a single call and poll each `id`. ## Shortcut (sync client only) `workflows.execute_scenario` builds the request, submits it, and polls to termination in one call, raising if the scenario is infeasible: ```python from sympheny_toolbox import Sympheny, workflows with Sympheny("you@example.com", "password") as client: job = workflows.execute_scenario(client, "your-scenario-guid", time_limit=30) print(job.status) # JobStatus.done ``` Use `workflows.execute_scenarios` to submit many at once. Both are built on the synchronous client; on the async client, use the submit-and-poll loop above. ## What to read next - [Download the results](download-results.md) — read the result file of the finished job. - [Solver jobs reference](../reference/solver_jobs.md) — every method on `client.solver_jobs`, including `list_for_scenarios`, `stop`, and `delete`. - [`POST /sense-api/ext/solver/jobs`](../../api/reference/solver-jobs.md#operation-post_solver_jobs_sense_api_ext_solver_jobs_post) — the underlying REST operation. --- # Download the results Fetch the result file of a finished solver job, or link straight to its results dashboard in the [web application](../../web-app/how-to/scenario-results.md). ## Prerequisites - The **job id** of a finished job — the one returned by [Run a solver job](run-solver-job.md). If you only have a scenario GUID, list its jobs with [`client.solver_jobs.list_for_scenarios([scenario_guid])`](../reference/solver_jobs.md#method-solver_jobs-list_for_scenarios). ## Get the result file URL A finished job carries an `output_file` — a presigned URL to a zip of result workbooks, one Excel file per Pareto solution. It is only populated once the job's status is `DONE`. === "Async" ```python import asyncio from sympheny_toolbox import AsyncSympheny from sympheny_toolbox.models import JobStatus async def main() -> None: job_id = "your-job-id" async with AsyncSympheny("you@example.com", "password") as client: job = await client.solver_jobs.get(job_id) if job.status is not JobStatus.done or job.output_file is None: raise RuntimeError(f"No results available (status {job.status})") print(str(job.output_file.root)) # presigned URL to the results zip asyncio.run(main()) ``` === "Sync" ```python from sympheny_toolbox import Sympheny from sympheny_toolbox.models import JobStatus job_id = "your-job-id" with Sympheny("you@example.com", "password") as client: job = client.solver_jobs.get(job_id) if job.status is not JobStatus.done or job.output_file is None: raise RuntimeError(f"No results available (status {job.status})") print(str(job.output_file.root)) # presigned URL to the results zip ``` With the URL in hand you can download the zip with any HTTP client and open the workbooks yourself, or use the helper below to parse them for you. ## Read a solution (sync client only) `workflows.get_output_file_dict` downloads the zip, opens one solution's workbook, and returns its `Cost & CO2` summary plus every `Mode *` profile sheet as plain Python data: ```python from sympheny_toolbox import Sympheny, workflows with Sympheny("you@example.com", "password") as client: result = workflows.get_output_file_dict(client, "your-job-id", solution_num=1) print(result["Cost & CO2"]) ``` ## Link to the dashboard instead To send someone to the interactive results dashboard rather than the raw file, `workflows.dashboard_url` returns the web-app URL of a scenario's first finished job: ```python from sympheny_toolbox import Sympheny, workflows with Sympheny("you@example.com", "password") as client: print(workflows.dashboard_url(client, "your-scenario-guid")) ``` Both helpers are built on the synchronous client and have no async twin. ## What to read next - [Scenario results](../../web-app/how-to/scenario-results.md) — how to read a results dashboard in the web app. - [Solver jobs reference](../reference/solver_jobs.md) — the full [`GetSolverJobExt`](../reference/models/solver.md#model-GetSolverJobExt) a job returns. - [`GET /sense-api/ext/solver/jobs/{id}`](../../api/reference/solver-jobs.md#operation-get_solver_job_sense_api_ext_solver_jobs__id__get) — the underlying REST operation. --- # Projects Operations on projects. Available on the client as `client.projects`. ## projects.list { #method-projects-list } ```python async def list() -> list[ProjectResponseDto] ``` List all projects visible to the authenticated user. REST operation: [`GET /sympheny-app/projects`](../../api/reference/projects.md#operation-viewMyProjects) **Returns:** list of [`ProjectResponseDto`](models/projects.md#model-ProjectResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: projects = await client.projects.list() ``` === "Sync" ```python with Sympheny(username, password) as client: projects = client.projects.list() ``` ## projects.create { #method-projects-create } ```python async def create(request: ProjectRequestDto) -> ProjectResponseDto ``` Create a new project. Only V2 projects are supported. REST operation: [`POST /sympheny-app/projects`](../../api/reference/projects.md#operation-createNewProject) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `request` | [`ProjectRequestDto`](models/projects.md#model-ProjectRequestDto) | yes | Request body. | **Returns:** [`ProjectResponseDto`](models/projects.md#model-ProjectResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: project = await client.projects.create(request) ``` === "Sync" ```python with Sympheny(username, password) as client: project = client.projects.create(request) ``` ## projects.get { #method-projects-get } ```python async def get( project_guid: str, *, include_analyses: bool | None = None, ) -> ProjectDetailResponseDto ``` Get project details. REST operation: [`GET /sympheny-app/projects/{guid}`](../../api/reference/projects.md#operation-viewProjectDetails) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `project_guid` | `str` | yes | GUID of the project. | | `include_analyses` | `bool`, optional | no | Also return the project's analyses. | **Returns:** [`ProjectDetailResponseDto`](models/projects.md#model-ProjectDetailResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: project = await client.projects.get(project_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: project = client.projects.get(project_guid) ``` ## projects.delete { #method-projects-delete } ```python async def delete(project_guid: str) -> ProjectSummaryResponseDto ``` Delete a project; returns the remaining projects. REST operation: [`DELETE /sympheny-app/projects/{guid}`](../../api/reference/projects.md#operation-deleteProject) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `project_guid` | `str` | yes | GUID of the project. | **Returns:** [`ProjectSummaryResponseDto`](models/projects.md#model-ProjectSummaryResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.projects.delete(project_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.projects.delete(project_guid) ``` --- # Analyses Operations on analyses. Available on the client as `client.analyses`. ## analyses.list { #method-analyses-list } ```python async def list(project_guid: str) -> list[AnalysisResponseDto] ``` List the analyses of a project. REST operation: [`GET /sympheny-app/projects/{guid}/analyses`](../../api/reference/analyses.md#operation-list_2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `project_guid` | `str` | yes | GUID of the project. | **Returns:** list of [`AnalysisResponseDto`](models/projects.md#model-AnalysisResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: analyses = await client.analyses.list(project_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: analyses = client.analyses.list(project_guid) ``` ## analyses.create { #method-analyses-create } ```python async def create(project_guid: str, request: AnalysisRequestDto) -> AnalysisResponseDto ``` Create a new analysis in a project. REST operation: [`POST /sympheny-app/projects/{guid}/analyses`](../../api/reference/analyses.md#operation-createNewAnalysis) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `project_guid` | `str` | yes | GUID of the project. | | `request` | [`AnalysisRequestDto`](models/projects.md#model-AnalysisRequestDto) | yes | Request body. | **Returns:** [`AnalysisResponseDto`](models/projects.md#model-AnalysisResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: analysis = await client.analyses.create(project_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: analysis = client.analyses.create(project_guid, request) ``` ## analyses.get { #method-analyses-get } ```python async def get(project_guid: str, analysis_guid: str) -> AnalysisDetailsResponseDto ``` Get analysis details. REST operation: [`GET /sympheny-app/projects/{guid}/analysis/{analysisGuid}`](../../api/reference/analyses.md#operation-viewAnalysisDetails) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `project_guid` | `str` | yes | GUID of the project. | | `analysis_guid` | `str` | yes | GUID of the analysis. | **Returns:** [`AnalysisDetailsResponseDto`](models/projects.md#model-AnalysisDetailsResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: analysis = await client.analyses.get(project_guid, analysis_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: analysis = client.analyses.get(project_guid, analysis_guid) ``` ## analyses.delete { #method-analyses-delete } ```python async def delete(analysis_guid: str) -> Status ``` Delete an analysis. REST operation: [`DELETE /sympheny-app/analysis/{analysisGuid}`](../../api/reference/analyses.md#operation-deleteAnalysis) The API returns no `data` payload for this endpoint even on success, so a missing payload is treated as an empty [`Status`](models/common.md#model-Status) rather than an error. **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str` | yes | GUID of the analysis. | **Returns:** [`Status`](models/common.md#model-Status) === "Async" ```python async with AsyncSympheny(username, password) as client: status = await client.analyses.delete(analysis_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: status = client.analyses.delete(analysis_guid) ``` --- # Scenarios Operations on scenarios. Available on the client as `client.scenarios`. ## scenarios.list { #method-scenarios-list } ```python async def list(analysis_guid: str) -> list[ScenarioResponseDto] ``` List the scenarios of an analysis. REST operation: [`GET /sympheny-app/analysis/{guid}/scenario`](../../api/reference/scenarios.md#operation-listScenarios) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str` | yes | GUID of the analysis. | **Returns:** list of [`ScenarioResponseDto`](models/common.md#model-ScenarioResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: scenarios = await client.scenarios.list(analysis_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: scenarios = client.scenarios.list(analysis_guid) ``` ## scenarios.create { #method-scenarios-create } ```python async def create(analysis_guid: str, request: ScenarioRequestDto) -> ScenarioResponseDto ``` Create a new scenario in an analysis. REST operation: [`POST /sympheny-app/analysis/{guid}/scenario`](../../api/reference/scenarios.md#operation-createNewScenario) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str` | yes | GUID of the analysis. | | `request` | [`ScenarioRequestDto`](models/scenarios.md#model-ScenarioRequestDto) | yes | Request body. | **Returns:** [`ScenarioResponseDto`](models/common.md#model-ScenarioResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: scenario = await client.scenarios.create(analysis_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: scenario = client.scenarios.create(analysis_guid, request) ``` ## scenarios.get { #method-scenarios-get } ```python async def get(scenario_guid: str) -> ScenarioResponseDto ``` Get scenario details. REST operation: [`GET /sympheny-app/scenario/{scenarioGuid}`](../../api/reference/scenarios.md#operation-getScenario) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`ScenarioResponseDto`](models/common.md#model-ScenarioResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: scenario = await client.scenarios.get(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: scenario = client.scenarios.get(scenario_guid) ``` ## scenarios.rename { #method-scenarios-rename } ```python async def rename(scenario_guid: str, request: ScenarioRequestDto) -> ScenarioResponseDto ``` Rename a scenario in place. REST operation: [`PUT /sympheny-app/scenarios/{scenarioGuid}`](../../api/reference/scenarios.md#operation-renameScenario) Unlike [`copy`](#method-scenarios-copy), this sets the scenario's name directly, so it works within the scenario's current analysis without creating a duplicate. **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`ScenarioRequestDto`](models/scenarios.md#model-ScenarioRequestDto) | yes | Request body. | **Returns:** [`ScenarioResponseDto`](models/common.md#model-ScenarioResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: scenario = await client.scenarios.rename(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: scenario = client.scenarios.rename(scenario_guid, request) ``` ## scenarios.delete { #method-scenarios-delete } ```python async def delete(scenario_guid: str) -> Status ``` Delete a scenario. REST operation: [`DELETE /sympheny-app/scenario/{scenarioGuid}`](../../api/reference/scenarios.md#operation-deleteScenario) The API returns no `data` payload for this endpoint even on success, so a missing payload is treated as an empty [`Status`](models/common.md#model-Status) rather than an error. **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`Status`](models/common.md#model-Status) === "Async" ```python async with AsyncSympheny(username, password) as client: status = await client.scenarios.delete(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: status = client.scenarios.delete(scenario_guid) ``` ## scenarios.copy { #method-scenarios-copy } ```python async def copy( scenario_guid: str, *, analysis_destination_guid: str | None = None, name: str | None = None, ) -> ScenarioResponseDto ``` Copy a scenario, optionally into another analysis. REST operation: [`PUT /sympheny-app/scenarios/copy/{scenarioGuid}`](../../api/reference/scenarios.md#operation-copyScenario) Broken as of this writing (to be fixed server-side): the `name` argument is only applied when `analysis_destination_guid` is omitted (the copy stays in the source's analysis). When a destination *is* given, `name` is ignored and the copy takes the source's name *without* deduplicating, so copying the same source into one analysis twice fails the `scenario_name + analysis_id` unique constraint. To place a renamed copy in another analysis: copy into it without a name (the server assigns a unique "... (Copy)" name), then copy that in place with the wanted name. **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `analysis_destination_guid` | `str`, optional | no | GUID of the destination analysis; when omitted the copy stays in the source scenario's analysis. | | `name` | `str`, optional | no | Name for the copy; see the caveat above. | **Returns:** [`ScenarioResponseDto`](models/common.md#model-ScenarioResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: scenario = await client.scenarios.copy(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: scenario = client.scenarios.copy(scenario_guid) ``` --- # Stages Operations on stages. Available on the client as `client.stages`. ## stages.list { #method-stages-list } ```python async def list(scenario_guid: str) -> list[StageResponseDto] ``` List the stages of a scenario. REST operation: [`GET /sympheny-app/scenarios/{scenarioGuid}/stages`](../../api/reference/stages.md#operation-list) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`StageResponseDto`](models/scenarios.md#model-StageResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: stages = await client.stages.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: stages = client.stages.list(scenario_guid) ``` ## stages.create { #method-stages-create } ```python async def create(scenario_guid: str, request: StageRequestDto) -> StageResponseDto ``` Create a new stage in a scenario. REST operation: [`POST /sympheny-app/scenarios/{scenarioGuid}/stages`](../../api/reference/stages.md#operation-create) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`StageRequestDto`](models/scenarios.md#model-StageRequestDto) | yes | Request body. | **Returns:** [`StageResponseDto`](models/scenarios.md#model-StageResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: stage = await client.stages.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: stage = client.stages.create(scenario_guid, request) ``` ## stages.get { #method-stages-get } ```python async def get(stage_guid: str) -> StageResponseDto ``` Get stage details. REST operation: [`GET /sympheny-app/scenarios/stages/{guid}`](../../api/reference/stages.md#operation-get_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `stage_guid` | `str` | yes | GUID of the stage. | **Returns:** [`StageResponseDto`](models/scenarios.md#model-StageResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: stage = await client.stages.get(stage_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: stage = client.stages.get(stage_guid) ``` ## stages.update { #method-stages-update } ```python async def update(scenario_guid: str, stage_guid: str, request: StageResponseDto) -> StageResponseDto ``` Update a stage. REST operation: [`PUT /sympheny-app/scenarios/{scenarioGuid}/stages/{stageGuid}`](../../api/reference/stages.md#operation-update) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `stage_guid` | `str` | yes | GUID of the stage. | | `request` | [`StageResponseDto`](models/scenarios.md#model-StageResponseDto) | yes | Request body. | **Returns:** [`StageResponseDto`](models/scenarios.md#model-StageResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: stage = await client.stages.update(scenario_guid, stage_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: stage = client.stages.update(scenario_guid, stage_guid, request) ``` ## stages.delete { #method-stages-delete } ```python async def delete(scenario_guid: str, stage_guid: str) -> None ``` Delete a stage. REST operation: [`DELETE /sympheny-app/scenarios/{scenarioGuid}/stages/{stageGuid}`](../../api/reference/stages.md#operation-delete) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `stage_guid` | `str` | yes | GUID of the stage. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.stages.delete(scenario_guid, stage_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: client.stages.delete(scenario_guid, stage_guid) ``` --- # Hubs Operations on hubs. Available on the client as `client.hubs`. ## hubs.list { #method-hubs-list } ```python async def list(scenario_guid: str) -> list[HubResponseDto] ``` List the hubs of a scenario. REST operation: [`GET /sympheny-app/scenarios/{scenarioGuid}/hubs`](../../api/reference/hubs.md#operation-findAllHubsByScenario) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`HubResponseDto`](models/common.md#model-HubResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: hubs = await client.hubs.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: hubs = client.hubs.list(scenario_guid) ``` ## hubs.create { #method-hubs-create } ```python async def create(scenario_guid: str, request: HubRequestDto) -> HubResponseDto ``` Create a new hub in a scenario. REST operation: [`POST /sympheny-app/scenarios/{scenarioGuid}/hubs`](../../api/reference/hubs.md#operation-createNewHub) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`HubRequestDto`](models/scenarios.md#model-HubRequestDto) | yes | Request body. | **Returns:** [`HubResponseDto`](models/common.md#model-HubResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: hub = await client.hubs.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: hub = client.hubs.create(scenario_guid, request) ``` ## hubs.get { #method-hubs-get } ```python async def get(hub_guid: str) -> HubResponseDto ``` Get hub details. REST operation: [`GET /sympheny-app/scenarios/hubs/{guid}`](../../api/reference/hubs.md#operation-getHub) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | GUID of the hub. | **Returns:** [`HubResponseDto`](models/common.md#model-HubResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: hub = await client.hubs.get(hub_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: hub = client.hubs.get(hub_guid) ``` ## hubs.update { #method-hubs-update } ```python async def update(hub_guid: str, request: HubResponseDto) -> HubResponseDto ``` Update a hub. REST operation: [`PUT /sympheny-app/v2/scenarios/hubs/{guid}`](../../api/reference/hubs.md#operation-editHub) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | GUID of the hub. | | `request` | [`HubResponseDto`](models/common.md#model-HubResponseDto) | yes | Request body. | **Returns:** [`HubResponseDto`](models/common.md#model-HubResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: hub = await client.hubs.update(hub_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: hub = client.hubs.update(hub_guid, request) ``` ## hubs.delete { #method-hubs-delete } ```python async def delete(hub_guid: str) -> builtins.list[HubResponseDto] ``` Delete a hub; returns the remaining hubs. REST operation: [`DELETE /sympheny-app/scenarios/hubs/{guid}`](../../api/reference/hubs.md#operation-deleteHub) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | GUID of the hub. | **Returns:** list of [`HubResponseDto`](models/common.md#model-HubResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.hubs.delete(hub_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.hubs.delete(hub_guid) ``` --- # Energy carriers Operations on energy carriers. Available on the client as `client.energy_carriers`. ## energy_carriers.create { #method-energy_carriers-create } ```python async def create(scenario_guid: str, request: EnergyCarrierRequestDtoV2) -> EnergyCarrierResponseDto ``` Create a new energy carrier in a scenario. REST operation: [`POST /sympheny-app/v2/scenarios/{scenarioGuid}/carriers`](../../api/reference/energy-carriers.md#operation-createNewEnergyCarrierV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`EnergyCarrierRequestDtoV2`](models/energy.md#model-EnergyCarrierRequestDtoV2) | yes | Request body. | **Returns:** [`EnergyCarrierResponseDto`](models/common.md#model-EnergyCarrierResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: carrier = await client.energy_carriers.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: carrier = client.energy_carriers.create(scenario_guid, request) ``` ## energy_carriers.list { #method-energy_carriers-list } ```python async def list(scenario_guid: str) -> EnergyCarriersListResponseDto ``` List the energy carriers of a scenario. REST operation: [`GET /sympheny-app/scenarios/{scenarioGuid}/carriers`](../../api/reference/energy-carriers.md#operation-findAllEnergyCarriersByScenario) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`EnergyCarriersListResponseDto`](models/energy.md#model-EnergyCarriersListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: carriers = await client.energy_carriers.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: carriers = client.energy_carriers.list(scenario_guid) ``` ## energy_carriers.get { #method-energy_carriers-get } ```python async def get(carrier_guid: str) -> EnergyCarrierResponseDto ``` Get energy carrier details. REST operation: [`GET /sympheny-app/carriers/{carrierGuid}`](../../api/reference/energy-carriers.md#operation-getEnergyCarrierByGuid) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `carrier_guid` | `str` | yes | GUID of the carrier. | **Returns:** [`EnergyCarrierResponseDto`](models/common.md#model-EnergyCarrierResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: carrier = await client.energy_carriers.get(carrier_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: carrier = client.energy_carriers.get(carrier_guid) ``` ## energy_carriers.update { #method-energy_carriers-update } ```python async def update(carrier_guid: str, request: EnergyCarrierResponseDto) -> EnergyCarrierResponseDto ``` Update an energy carrier. REST operation: [`PUT /sympheny-app/v2/carriers/{carrierGuid}`](../../api/reference/energy-carriers.md#operation-editEnergyCarrierV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `carrier_guid` | `str` | yes | GUID of the carrier. | | `request` | [`EnergyCarrierResponseDto`](models/common.md#model-EnergyCarrierResponseDto) | yes | Request body. | **Returns:** [`EnergyCarrierResponseDto`](models/common.md#model-EnergyCarrierResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: carrier = await client.energy_carriers.update(carrier_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: carrier = client.energy_carriers.update(carrier_guid, request) ``` ## energy_carriers.delete { #method-energy_carriers-delete } ```python async def delete(carrier_guid: str) -> EnergyCarriersListResponseDto ``` Delete an energy carrier; returns the remaining carriers. REST operation: [`DELETE /sympheny-app/scenarios/carriers/{guid}`](../../api/reference/energy-carriers.md#operation-deleteEnergyCarrier) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `carrier_guid` | `str` | yes | GUID of the carrier. | **Returns:** [`EnergyCarriersListResponseDto`](models/energy.md#model-EnergyCarriersListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.energy_carriers.delete(carrier_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.energy_carriers.delete(carrier_guid) ``` --- # Energy demands Operations on energy demands. Available on the client as `client.energy_demands`. ## energy_demands.create { #method-energy_demands-create } ```python async def create(scenario_guid: str, request: EnergyDemandRequestDtoV2) -> EnergyDemandResponseDtoV2 ``` Create a new energy demand in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/energy-demands`](../../api/reference/energy-demands.md#operation-uploadNewEnergyDemandProfileV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`EnergyDemandRequestDtoV2`](models/energy.md#model-EnergyDemandRequestDtoV2) | yes | Request body. | **Returns:** [`EnergyDemandResponseDtoV2`](models/energy.md#model-EnergyDemandResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: demand = await client.energy_demands.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: demand = client.energy_demands.create(scenario_guid, request) ``` ## energy_demands.list { #method-energy_demands-list } ```python async def list(scenario_guid: str) -> list[EnergyDemandResponseDtoV2] ``` List the energy demands of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/energy-demands`](../../api/reference/energy-demands.md#operation-getAllEnergyDemandsByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`EnergyDemandResponseDtoV2`](models/energy.md#model-EnergyDemandResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: demands = await client.energy_demands.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: demands = client.energy_demands.list(scenario_guid) ``` ## energy_demands.get { #method-energy_demands-get } ```python async def get( demand_guid: str, *, scenario_variant_guid: str | None = None, ) -> EnergyDemandDetailResponseDtoV2 ``` Get energy demand details. REST operation: [`GET /sympheny-app/v2/energy-demands/{guid}`](../../api/reference/energy-demands.md#operation-getEnergyDemandDetailsByGuidV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `demand_guid` | `str` | yes | GUID of the demand. | | `scenario_variant_guid` | `str`, optional | no | GUID of the scenario variant to read from. | **Returns:** [`EnergyDemandDetailResponseDtoV2`](models/energy.md#model-EnergyDemandDetailResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: demand = await client.energy_demands.get(demand_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: demand = client.energy_demands.get(demand_guid) ``` ## energy_demands.update { #method-energy_demands-update } ```python async def update( scenario_guid: str, demand_guid: str, request: EnergyDemandResponseDtoV2, ) -> EnergyDemandResponseDtoV2 ``` Update an energy demand. REST operation: [`PUT /sympheny-app/v2_2/scenarios/{scenarioGuid}/energy-demands/{demand-guid}`](../../api/reference/energy-demands.md#operation-updateEnergyDemandV2_2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `demand_guid` | `str` | yes | GUID of the demand. | | `request` | [`EnergyDemandResponseDtoV2`](models/energy.md#model-EnergyDemandResponseDtoV2) | yes | Request body. | **Returns:** [`EnergyDemandResponseDtoV2`](models/energy.md#model-EnergyDemandResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: demand = await client.energy_demands.update(scenario_guid, demand_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: demand = client.energy_demands.update(scenario_guid, demand_guid, request) ``` ## energy_demands.delete { #method-energy_demands-delete } ```python async def delete(demand_guid: str) -> EnergyDemandListResponseDto ``` Delete an energy demand; returns the remaining demands. REST operation: [`DELETE /sympheny-app/scenarios/energy-demands/{guid}`](../../api/reference/energy-demands.md#operation-deleteEnergyDemandProfile) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `demand_guid` | `str` | yes | GUID of the demand. | **Returns:** [`EnergyDemandListResponseDto`](models/energy.md#model-EnergyDemandListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.energy_demands.delete(demand_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.energy_demands.delete(demand_guid) ``` --- # Profiles Operations on profiles. Available on the client as `client.profiles`. ## profiles.create { #method-profiles-create } ```python async def create(scenario_guid: str, request: ProfileJsonRequestDto) -> ProfileResponseDto ``` Create a new profile in a scenario. REST operation: [`POST /sympheny-app/scenarios/{scenarioGuid}/profiles-json`](../../api/reference/profiles.md#operation-createJson) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`ProfileJsonRequestDto`](models/energy.md#model-ProfileJsonRequestDto) | yes | Request body. | **Returns:** [`ProfileResponseDto`](models/energy.md#model-ProfileResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: profile = await client.profiles.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: profile = client.profiles.create(scenario_guid, request) ``` ## profiles.list { #method-profiles-list } ```python async def list(scenario_guid: str) -> list[ProfileResponseDto] ``` List the profiles of a scenario. REST operation: [`GET /sympheny-app/scenarios/{scenarioGuid}/profiles`](../../api/reference/profiles.md#operation-list_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`ProfileResponseDto`](models/energy.md#model-ProfileResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: profiles = await client.profiles.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: profiles = client.profiles.list(scenario_guid) ``` ## profiles.get { #method-profiles-get } ```python async def get(scenario_guid: str, profile_id: int) -> ProfileDetailsResponseDto ``` Get profile details. REST operation: [`GET /sympheny-app/scenarios/{scenarioGuid}/profiles/{profileId}`](../../api/reference/profiles.md#operation-get) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `profile_id` | `int` | yes | Numeric id of the profile. | **Returns:** [`ProfileDetailsResponseDto`](models/energy.md#model-ProfileDetailsResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: profile = await client.profiles.get(scenario_guid, profile_id) ``` === "Sync" ```python with Sympheny(username, password) as client: profile = client.profiles.get(scenario_guid, profile_id) ``` ## profiles.update { #method-profiles-update } ```python async def update( scenario_guid: str, profile_id: int, request: ProfileDetailsResponseDto, ) -> ProfileDetailsResponseDto ``` Update a profile. REST operation: [`PUT /sympheny-app/v2/scenarios/{scenarioGuid}/profiles-json/{profileId}`](../../api/reference/profiles.md#operation-editJsonV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `profile_id` | `int` | yes | Numeric id of the profile. | | `request` | [`ProfileDetailsResponseDto`](models/energy.md#model-ProfileDetailsResponseDto) | yes | Request body. | **Returns:** [`ProfileDetailsResponseDto`](models/energy.md#model-ProfileDetailsResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: profile = await client.profiles.update(scenario_guid, profile_id, request) ``` === "Sync" ```python with Sympheny(username, password) as client: profile = client.profiles.update(scenario_guid, profile_id, request) ``` ## profiles.delete { #method-profiles-delete } ```python async def delete(scenario_guid: str, profile_id: int) -> None ``` Delete a profile. REST operation: [`DELETE /sympheny-app/scenarios/{scenarioGuid}/profiles/{profileId}`](../../api/reference/profiles.md#operation-delete_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `profile_id` | `int` | yes | Numeric id of the profile. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.profiles.delete(scenario_guid, profile_id) ``` === "Sync" ```python with Sympheny(username, password) as client: client.profiles.delete(scenario_guid, profile_id) ``` --- # Solar resources Operations on solar on-site resources. Available on the client as `client.solar_resources`. ## solar_resources.create { #method-solar_resources-create } ```python async def create( scenario_guid: str, request: SolarOnSiteResourceRequestDtoV2, ) -> SolarOnSiteResourceResponseDtoV2 ``` Create a new solar on-site resource in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/solar-on-site-resource`](../../api/reference/solar-resources.md#operation-uploadNewSolarOnSiteResourceV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`SolarOnSiteResourceRequestDtoV2`](models/energy.md#model-SolarOnSiteResourceRequestDtoV2) | yes | Request body. | **Returns:** [`SolarOnSiteResourceResponseDtoV2`](models/energy.md#model-SolarOnSiteResourceResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: resource = await client.solar_resources.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: resource = client.solar_resources.create(scenario_guid, request) ``` ## solar_resources.list { #method-solar_resources-list } ```python async def list(scenario_guid: str) -> list[SolarOnSiteResourceResponseDtoV2] ``` List the solar on-site resources of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/solar-on-site-resource`](../../api/reference/solar-resources.md#operation-getAllSolarOnSiteResourcesByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`SolarOnSiteResourceResponseDtoV2`](models/energy.md#model-SolarOnSiteResourceResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: resources = await client.solar_resources.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: resources = client.solar_resources.list(scenario_guid) ``` ## solar_resources.get { #method-solar_resources-get } ```python async def get(resource_guid: str) -> SolarOnSiteResourceResponseDtoV2 ``` Get solar on-site resource details. REST operation: [`GET /sympheny-app/v2/scenarios/solar-on-site-resource/{guid}`](../../api/reference/solar-resources.md#operation-getSolarOnSiteResourcesV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `resource_guid` | `str` | yes | GUID of the resource. | **Returns:** [`SolarOnSiteResourceResponseDtoV2`](models/energy.md#model-SolarOnSiteResourceResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: resource = await client.solar_resources.get(resource_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: resource = client.solar_resources.get(resource_guid) ``` ## solar_resources.update { #method-solar_resources-update } ```python async def update( resource_guid: str, request: SolarOnSiteResourceResponseDtoV2, ) -> SolarOnSiteResourceResponseDtoV2 ``` Update a solar on-site resource. REST operation: [`PUT /sympheny-app/v2_2/scenarios/solar-on-site-resource/{guid}`](../../api/reference/solar-resources.md#operation-editSolarOnSiteResourceV2_2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `resource_guid` | `str` | yes | GUID of the resource. | | `request` | [`SolarOnSiteResourceResponseDtoV2`](models/energy.md#model-SolarOnSiteResourceResponseDtoV2) | yes | Request body. | **Returns:** [`SolarOnSiteResourceResponseDtoV2`](models/energy.md#model-SolarOnSiteResourceResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: resource = await client.solar_resources.update(resource_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: resource = client.solar_resources.update(resource_guid, request) ``` ## solar_resources.delete { #method-solar_resources-delete } ```python async def delete(resource_guid: str) -> SolarOnSiteResourceListResponseDto ``` Delete a solar on-site resource; returns the remaining resources. REST operation: [`DELETE /sympheny-app/scenarios/solar-on-site-resource/{guid}`](../../api/reference/solar-resources.md#operation-deleteSolarOnSiteResource) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `resource_guid` | `str` | yes | GUID of the resource. | **Returns:** [`SolarOnSiteResourceListResponseDto`](models/energy.md#model-SolarOnSiteResourceListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.solar_resources.delete(resource_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.solar_resources.delete(resource_guid) ``` --- # Conversion technologies Operations on conversion technologies. Available on the client as `client.conversion_technologies`. ## conversion_technologies.create { #method-conversion_technologies-create } ```python async def create( scenario_guid: str, request: ConversionTechnologyRequestDtoV2, ) -> ConversionTechnologyResponseDtoV2 ``` Create a conversion technology in a scenario. REST operation: [`POST /sympheny-app/v2_2/scenarios/{scenarioGuid}/conversion-technologies`](../../api/reference/conversion-technologies.md#operation-specifyConversionTechnologyV2_2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`ConversionTechnologyRequestDtoV2`](models/technologies.md#model-ConversionTechnologyRequestDtoV2) | yes | Request body. | **Returns:** [`ConversionTechnologyResponseDtoV2`](models/technologies.md#model-ConversionTechnologyResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.conversion_technologies.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.conversion_technologies.create(scenario_guid, request) ``` ## conversion_technologies.list { #method-conversion_technologies-list } ```python async def list(scenario_guid: str) -> ConversionTechnologyListResponseDtoV2 ``` List the conversion technologies of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/conversion-technologies`](../../api/reference/conversion-technologies.md#operation-getAllConversionTechnologiesByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`ConversionTechnologyListResponseDtoV2`](models/technologies.md#model-ConversionTechnologyListResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technologies = await client.conversion_technologies.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: technologies = client.conversion_technologies.list(scenario_guid) ``` ## conversion_technologies.get { #method-conversion_technologies-get } ```python async def get(technology_guid: str) -> ConversionTechnologyDetailResponseDtoV2 ``` Get conversion technology details. REST operation: [`GET /sympheny-app/v2/scenarios/conversion-technologies/{guid}`](../../api/reference/conversion-technologies.md#operation-getConversionTechDetailsV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | **Returns:** [`ConversionTechnologyDetailResponseDtoV2`](models/technologies.md#model-ConversionTechnologyDetailResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.conversion_technologies.get(technology_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.conversion_technologies.get(technology_guid) ``` ## conversion_technologies.update { #method-conversion_technologies-update } ```python async def update( technology_guid: str, request: ConversionTechnologyDetailResponseDtoV2, ) -> ConversionTechnologyResponseDtoV2 ``` Update a conversion technology. REST operation: [`PUT /sympheny-app/v2_1/scenarios/conversion-technologies/{guid}`](../../api/reference/conversion-technologies.md#operation-updateConversionTechnology) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | | `request` | [`ConversionTechnologyDetailResponseDtoV2`](models/technologies.md#model-ConversionTechnologyDetailResponseDtoV2) | yes | Request body. | **Returns:** [`ConversionTechnologyResponseDtoV2`](models/technologies.md#model-ConversionTechnologyResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.conversion_technologies.update(technology_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.conversion_technologies.update(technology_guid, request) ``` ## conversion_technologies.delete { #method-conversion_technologies-delete } ```python async def delete(technology_guid: str) -> None ``` Delete a conversion technology. REST operation: [`DELETE /sympheny-app/v2/scenarios/conversion-technologies/{guid}`](../../api/reference/conversion-technologies.md#operation-deleteConversionTechnologyV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.conversion_technologies.delete(technology_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: client.conversion_technologies.delete(technology_guid) ``` --- # Storage technologies Operations on storage technologies. Available on the client as `client.storage_technologies`. ## storage_technologies.create { #method-storage_technologies-create } ```python async def create( scenario_guid: str, request: StorageTechnologyRequestDtoV2, ) -> StorageTechnologyResponseDtoV2 ``` Create a storage technology in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/storage-technologies`](../../api/reference/storage-technologies.md#operation-specifyStorageTechnologyV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`StorageTechnologyRequestDtoV2`](models/technologies.md#model-StorageTechnologyRequestDtoV2) | yes | Request body. | **Returns:** [`StorageTechnologyResponseDtoV2`](models/technologies.md#model-StorageTechnologyResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.storage_technologies.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.storage_technologies.create(scenario_guid, request) ``` ## storage_technologies.list { #method-storage_technologies-list } ```python async def list(scenario_guid: str) -> StorageTechnologyListResponseDtoV2 ``` List the storage technologies of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/storage-technologies`](../../api/reference/storage-technologies.md#operation-getAllStorageTechnologiesByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`StorageTechnologyListResponseDtoV2`](models/technologies.md#model-StorageTechnologyListResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technologies = await client.storage_technologies.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: technologies = client.storage_technologies.list(scenario_guid) ``` ## storage_technologies.get { #method-storage_technologies-get } ```python async def get(technology_guid: str) -> StorageTechnologyDetailResponseDtoV2 ``` Get storage technology details. REST operation: [`GET /sympheny-app/v2/scenarios/storage-technologies/{guid}`](../../api/reference/storage-technologies.md#operation-getStorageTechDetailsV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | **Returns:** [`StorageTechnologyDetailResponseDtoV2`](models/technologies.md#model-StorageTechnologyDetailResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.storage_technologies.get(technology_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.storage_technologies.get(technology_guid) ``` ## storage_technologies.update { #method-storage_technologies-update } ```python async def update( technology_guid: str, request: StorageTechnologyDetailResponseDtoV2, ) -> StorageTechnologyDetailResponseDtoV2 ``` Update a storage technology. REST operation: [`PUT /sympheny-app/v2_2/scenarios/storage-technologies/{guid}`](../../api/reference/storage-technologies.md#operation-updateStorageTechnologyV2_2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | | `request` | [`StorageTechnologyDetailResponseDtoV2`](models/technologies.md#model-StorageTechnologyDetailResponseDtoV2) | yes | Request body. | **Returns:** [`StorageTechnologyDetailResponseDtoV2`](models/technologies.md#model-StorageTechnologyDetailResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.storage_technologies.update(technology_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.storage_technologies.update(technology_guid, request) ``` ## storage_technologies.delete { #method-storage_technologies-delete } ```python async def delete(technology_guid: str) -> StorageTechnologyListResponseDto ``` Delete a storage technology; returns the remaining storage technologies. REST operation: [`DELETE /sympheny-app/scenarios/storage-technologies/{guid}`](../../api/reference/storage-technologies.md#operation-deleteStorageTechnology) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | **Returns:** [`StorageTechnologyListResponseDto`](models/technologies.md#model-StorageTechnologyListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.storage_technologies.delete(technology_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.storage_technologies.delete(technology_guid) ``` --- # Technology packages Operations on technology packages. Available on the client as `client.technology_packages`. ## technology_packages.create { #method-technology_packages-create } ```python async def create( scenario_guid: str, request: TechnologyPackageRequestDtoV2, ) -> TechnologyPackageResponseDtoV2 ``` Create a technology package in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/technology-packages`](../../api/reference/technology-packages.md#operation-specifyTechnologyPackageV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`TechnologyPackageRequestDtoV2`](models/technologies.md#model-TechnologyPackageRequestDtoV2) | yes | Request body. | **Returns:** [`TechnologyPackageResponseDtoV2`](models/technologies.md#model-TechnologyPackageResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: package = await client.technology_packages.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: package = client.technology_packages.create(scenario_guid, request) ``` ## technology_packages.list { #method-technology_packages-list } ```python async def list(scenario_guid: str) -> TechnologyPackageListResponseDtoV2 ``` List the technology packages of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/technology-packages`](../../api/reference/technology-packages.md#operation-getAllTechnologyPackagesByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`TechnologyPackageListResponseDtoV2`](models/technologies.md#model-TechnologyPackageListResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: packages = await client.technology_packages.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: packages = client.technology_packages.list(scenario_guid) ``` ## technology_packages.get { #method-technology_packages-get } ```python async def get(scenario_guid: str, package_guid: str) -> TechnologyPackageResponseDtoV2 ``` Get technology package details. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/technology-packages/{guid}`](../../api/reference/technology-packages.md#operation-getTechnologyPackageByGuidV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `package_guid` | `str` | yes | GUID of the package. | **Returns:** [`TechnologyPackageResponseDtoV2`](models/technologies.md#model-TechnologyPackageResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: package = await client.technology_packages.get(scenario_guid, package_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: package = client.technology_packages.get(scenario_guid, package_guid) ``` ## technology_packages.update { #method-technology_packages-update } ```python async def update( scenario_guid: str, package_guid: str, request: TechnologyPackageResponseDtoV2, ) -> TechnologyPackageResponseDtoV2 ``` Update a technology package. REST operation: [`PUT /sympheny-app/v2_1/scenarios/{scenarioGuid}/technology-packages/{guid}`](../../api/reference/technology-packages.md#operation-updateTechnologyPackageV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `package_guid` | `str` | yes | GUID of the package. | | `request` | [`TechnologyPackageResponseDtoV2`](models/technologies.md#model-TechnologyPackageResponseDtoV2) | yes | Request body. | **Returns:** [`TechnologyPackageResponseDtoV2`](models/technologies.md#model-TechnologyPackageResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: package = await client.technology_packages.update(scenario_guid, package_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: package = client.technology_packages.update(scenario_guid, package_guid, request) ``` ## technology_packages.delete { #method-technology_packages-delete } ```python async def delete( scenario_guid: str, package_guid: str, *, delete_techs: bool | None = None, ) -> TechnologyPackageListResponseDto ``` Delete a technology package. REST operation: [`DELETE /sympheny-app/scenarios/{scenarioGuid}/technology-packages/{guid}`](../../api/reference/technology-packages.md#operation-deleteTechnologyPackage) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `package_guid` | `str` | yes | GUID of the package. | | `delete_techs` | `bool`, optional | no | Also delete the technologies contained in the package. | **Returns:** [`TechnologyPackageListResponseDto`](models/technologies.md#model-TechnologyPackageListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: status = await client.technology_packages.delete(scenario_guid, package_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: status = client.technology_packages.delete(scenario_guid, package_guid) ``` --- # Network technologies Operations on network technologies. Available on the client as `client.network_technologies`. ## network_technologies.create { #method-network_technologies-create } ```python async def create( scenario_guid: str, request: NetworkTechnologyRequestDtoV2, ) -> NetworkTechnologyResponseDtoV2 ``` Create a network technology in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/network-technologies`](../../api/reference/network-technologies.md#operation-specifyNetworkTechnologyV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`NetworkTechnologyRequestDtoV2`](models/technologies.md#model-NetworkTechnologyRequestDtoV2) | yes | Request body. | **Returns:** [`NetworkTechnologyResponseDtoV2`](models/technologies.md#model-NetworkTechnologyResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.network_technologies.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.network_technologies.create(scenario_guid, request) ``` ## network_technologies.list { #method-network_technologies-list } ```python async def list(scenario_guid: str) -> NetworkTechnologyListResponseDtoV2 ``` List the network technologies of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/network-technologies`](../../api/reference/network-technologies.md#operation-getAllNetworkTechnologiesByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`NetworkTechnologyListResponseDtoV2`](models/technologies.md#model-NetworkTechnologyListResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technologies = await client.network_technologies.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: technologies = client.network_technologies.list(scenario_guid) ``` ## network_technologies.get { #method-network_technologies-get } ```python async def get(technology_guid: str) -> NetworkTechnologyResponseDtoV2 ``` Get network technology details. REST operation: [`GET /sympheny-app/v2/scenarios/network-technologies/{guid}`](../../api/reference/network-technologies.md#operation-getNetworkTechDetailsV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | **Returns:** [`NetworkTechnologyResponseDtoV2`](models/technologies.md#model-NetworkTechnologyResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.network_technologies.get(technology_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.network_technologies.get(technology_guid) ``` ## network_technologies.update { #method-network_technologies-update } ```python async def update( technology_guid: str, request: NetworkTechnologyResponseDtoV2, ) -> NetworkTechnologyResponseDtoV2 ``` Update a network technology. REST operation: [`PUT /sympheny-app/v2_1/scenarios/network-technologies/{guid}`](../../api/reference/network-technologies.md#operation-updateNetworkTechnologyV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | | `request` | [`NetworkTechnologyResponseDtoV2`](models/technologies.md#model-NetworkTechnologyResponseDtoV2) | yes | Request body. | **Returns:** [`NetworkTechnologyResponseDtoV2`](models/technologies.md#model-NetworkTechnologyResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: technology = await client.network_technologies.update(technology_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: technology = client.network_technologies.update(technology_guid, request) ``` ## network_technologies.delete { #method-network_technologies-delete } ```python async def delete(technology_guid: str) -> NetworkTechnologyListResponseDto ``` Delete a network technology; returns the remaining network technologies. REST operation: [`DELETE /sympheny-app/scenarios/network-technologies/{guid}`](../../api/reference/network-technologies.md#operation-deleteNetworkTechnology) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `technology_guid` | `str` | yes | GUID of the technology. | **Returns:** [`NetworkTechnologyListResponseDto`](models/technologies.md#model-NetworkTechnologyListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.network_technologies.delete(technology_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.network_technologies.delete(technology_guid) ``` --- # Network links Operations on network links. Available on the client as `client.network_links`. ## network_links.create { #method-network_links-create } ```python async def create(scenario_guid: str, request: NetworkLinkRequestDtoV2) -> NetworkLinkResponseDtoV2 ``` Create a network link in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenarios/{scenarioGuid}/network-links`](../../api/reference/network-links.md#operation-specifyNetworkLinkV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`NetworkLinkRequestDtoV2`](models/technologies.md#model-NetworkLinkRequestDtoV2) | yes | Request body. | **Returns:** [`NetworkLinkResponseDtoV2`](models/technologies.md#model-NetworkLinkResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: link = await client.network_links.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: link = client.network_links.create(scenario_guid, request) ``` ## network_links.list { #method-network_links-list } ```python async def list(scenario_guid: str) -> list[NetworkLinkResponseDtoV2] ``` List the network links of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/network-links`](../../api/reference/network-links.md#operation-getAllNetworkLinksByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`NetworkLinkResponseDtoV2`](models/technologies.md#model-NetworkLinkResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: links = await client.network_links.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: links = client.network_links.list(scenario_guid) ``` ## network_links.get { #method-network_links-get } ```python async def get(link_guid: str) -> NetworkLinkResponseDtoV2 ``` Get network link details. REST operation: [`GET /sympheny-app/v2/network-links/{network-link-guid}`](../../api/reference/network-links.md#operation-getNetworkLinkDetailsV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `link_guid` | `str` | yes | GUID of the link. | **Returns:** [`NetworkLinkResponseDtoV2`](models/technologies.md#model-NetworkLinkResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: link = await client.network_links.get(link_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: link = client.network_links.get(link_guid) ``` ## network_links.update { #method-network_links-update } ```python async def update( scenario_guid: str, link_guid: str, request: NetworkLinkResponseDtoV2, ) -> NetworkLinkResponseDtoV2 ``` Update a network link. REST operation: [`PUT /sympheny-app/v2_2/scenarios/{scenarioGuid}/network-links/{network-link-guid}`](../../api/reference/network-links.md#operation-updateNetworkLinkV2_2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `link_guid` | `str` | yes | GUID of the link. | | `request` | [`NetworkLinkResponseDtoV2`](models/technologies.md#model-NetworkLinkResponseDtoV2) | yes | Request body. | **Returns:** [`NetworkLinkResponseDtoV2`](models/technologies.md#model-NetworkLinkResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: link = await client.network_links.update(scenario_guid, link_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: link = client.network_links.update(scenario_guid, link_guid, request) ``` ## network_links.delete { #method-network_links-delete } ```python async def delete(scenario_guid: str, link_guid: str) -> NetworkLinkListResponseDto ``` Delete a network link; returns the remaining links. REST operation: [`DELETE /sympheny-app/scenarios/{scenarioGuid}/network-links/{network-link-guid}`](../../api/reference/network-links.md#operation-deleteNetworkLink) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `link_guid` | `str` | yes | GUID of the link. | **Returns:** [`NetworkLinkListResponseDto`](models/technologies.md#model-NetworkLinkListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.network_links.delete(scenario_guid, link_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.network_links.delete(scenario_guid, link_guid) ``` --- # Intra-hub network links Operations on intra-hub network links. Available on the client as `client.intra_hub_network_links`. ## intra_hub_network_links.create { #method-intra_hub_network_links-create } ```python async def create( scenario_guid: str, request: IntraHubNetworkLinkRequestDto, ) -> IntraHubNetworkLinkResponseDto ``` Create an intra-hub network link in a scenario. REST operation: [`POST /sympheny-app/v2/scenarios/{scenarioGuid}/intra-hub-network-links`](../../api/reference/intra-hub-network-links.md#operation-specifyIntraHubNetworkLinkV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`IntraHubNetworkLinkRequestDto`](models/technologies.md#model-IntraHubNetworkLinkRequestDto) | yes | Request body. | **Returns:** [`IntraHubNetworkLinkResponseDto`](models/technologies.md#model-IntraHubNetworkLinkResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: link = await client.intra_hub_network_links.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: link = client.intra_hub_network_links.create(scenario_guid, request) ``` ## intra_hub_network_links.list { #method-intra_hub_network_links-list } ```python async def list(scenario_guid: str) -> IntraHubNetworkLinkListResponseDto ``` List the intra-hub network links of a scenario. REST operation: [`GET /sympheny-app/scenarios/{scenarioGuid}/intra-hub-network-links`](../../api/reference/intra-hub-network-links.md#operation-getAllIntraHubNetworkLinks) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** [`IntraHubNetworkLinkListResponseDto`](models/technologies.md#model-IntraHubNetworkLinkListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: links = await client.intra_hub_network_links.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: links = client.intra_hub_network_links.list(scenario_guid) ``` ## intra_hub_network_links.get { #method-intra_hub_network_links-get } ```python async def get(link_guid: str) -> IntraHubNetworkLinkResponseDto ``` Get intra-hub network link details. REST operation: [`GET /sympheny-app/scenarios/intra-hub-network-links/{guid}`](../../api/reference/intra-hub-network-links.md#operation-getIntraHubNetworkLinkDetails) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `link_guid` | `str` | yes | GUID of the link. | **Returns:** [`IntraHubNetworkLinkResponseDto`](models/technologies.md#model-IntraHubNetworkLinkResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: link = await client.intra_hub_network_links.get(link_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: link = client.intra_hub_network_links.get(link_guid) ``` ## intra_hub_network_links.update { #method-intra_hub_network_links-update } ```python async def update( link_guid: str, request: IntraHubNetworkLinkResponseDto, ) -> IntraHubNetworkLinkResponseDto ``` Update an intra-hub network link. REST operation: [`PUT /sympheny-app/v2/scenarios/intra-hub-network-links/{guid}`](../../api/reference/intra-hub-network-links.md#operation-updateIntraHubNetworkLinkV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `link_guid` | `str` | yes | GUID of the link. | | `request` | [`IntraHubNetworkLinkResponseDto`](models/technologies.md#model-IntraHubNetworkLinkResponseDto) | yes | Request body. | **Returns:** [`IntraHubNetworkLinkResponseDto`](models/technologies.md#model-IntraHubNetworkLinkResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: link = await client.intra_hub_network_links.update(link_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: link = client.intra_hub_network_links.update(link_guid, request) ``` ## intra_hub_network_links.delete { #method-intra_hub_network_links-delete } ```python async def delete(link_guid: str) -> IntraHubNetworkLinkListResponseDto ``` Delete an intra-hub network link; returns the remaining links. REST operation: [`DELETE /sympheny-app/scenarios/intra-hub-network-links/{guid}`](../../api/reference/intra-hub-network-links.md#operation-deleteIntraHubNetworkLink) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `link_guid` | `str` | yes | GUID of the link. | **Returns:** [`IntraHubNetworkLinkListResponseDto`](models/technologies.md#model-IntraHubNetworkLinkListResponseDto) === "Async" ```python async with AsyncSympheny(username, password) as client: remaining = await client.intra_hub_network_links.delete(link_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: remaining = client.intra_hub_network_links.delete(link_guid) ``` --- # Imports and exports (impex) Operations on energy imports and exports. Available on the client as `client.impex`. ## impex.create { #method-impex-create } ```python async def create(scenario_guid: str, request: ImportExportRequestDtoV2) -> ImportExportResponseDtoV2 ``` Create a new import/export in a scenario. REST operation: [`POST /sympheny-app/v2_1/scenario/{scenarioGuid}/impex`](../../api/reference/impex.md#operation-createNewImpexV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `request` | [`ImportExportRequestDtoV2`](models/energy.md#model-ImportExportRequestDtoV2) | yes | Request body. | **Returns:** [`ImportExportResponseDtoV2`](models/energy.md#model-ImportExportResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: impex = await client.impex.create(scenario_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: impex = client.impex.create(scenario_guid, request) ``` ## impex.list { #method-impex-list } ```python async def list(scenario_guid: str) -> list[ImportExportResponseDtoV2] ``` List the imports/exports of a scenario. REST operation: [`GET /sympheny-app/v2/scenarios/{scenarioGuid}/impexes`](../../api/reference/impex.md#operation-findAllByScenarioV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** list of [`ImportExportResponseDtoV2`](models/energy.md#model-ImportExportResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: impexes = await client.impex.list(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: impexes = client.impex.list(scenario_guid) ``` ## impex.get { #method-impex-get } ```python async def get( impex_type: Type1, impex_guid: str, *, scenario_variant_guid: str | None = None, ) -> ImportExportResponseDtoV2 ``` Get import/export details. REST operation: [`GET /sympheny-app/v2/impex/{type}/{guid}`](../../api/reference/impex.md#operation-getImpexByGuidV2) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `impex_type` | [`Type1`](models/energy.md#model-Type1) | yes | Whether the record is an import or an export. | | `impex_guid` | `str` | yes | GUID of the impex. | | `scenario_variant_guid` | `str`, optional | no | GUID of the scenario variant to read from. | **Returns:** [`ImportExportResponseDtoV2`](models/energy.md#model-ImportExportResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: impex = await client.impex.get(impex_type, impex_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: impex = client.impex.get(impex_type, impex_guid) ``` ## impex.update { #method-impex-update } ```python async def update(impex_guid: str, request: ImportExportResponseDtoV2) -> ImportExportResponseDtoV2 ``` Update an import/export. REST operation: [`PUT /sympheny-app/v2_1/scenarios/impex/{guid}`](../../api/reference/impex.md#operation-editImpexV2_1) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `impex_guid` | `str` | yes | GUID of the impex. | | `request` | [`ImportExportResponseDtoV2`](models/energy.md#model-ImportExportResponseDtoV2) | yes | Request body. | **Returns:** [`ImportExportResponseDtoV2`](models/energy.md#model-ImportExportResponseDtoV2) === "Async" ```python async with AsyncSympheny(username, password) as client: impex = await client.impex.update(impex_guid, request) ``` === "Sync" ```python with Sympheny(username, password) as client: impex = client.impex.update(impex_guid, request) ``` ## impex.delete { #method-impex-delete } ```python async def delete(impex_type: Type1, impex_guid: str) -> Status ``` Delete an import/export. REST operation: [`DELETE /sympheny-app/impex/{type}/{guid}`](../../api/reference/impex.md#operation-deleteImpex) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `impex_type` | [`Type1`](models/energy.md#model-Type1) | yes | Whether the record is an import or an export. | | `impex_guid` | `str` | yes | GUID of the impex. | **Returns:** [`Status`](models/common.md#model-Status) === "Async" ```python async with AsyncSympheny(username, password) as client: status = await client.impex.delete(impex_type, impex_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: status = client.impex.delete(impex_type, impex_guid) ``` --- # Solver jobs Operations on solver jobs. Available on the client as `client.solver_jobs`. ## solver_jobs.submit { #method-solver_jobs-submit } ```python async def submit(jobs: list[PostSolverJobExt]) -> list[SolverJob] ``` Submit one or more solver jobs for execution. REST operation: [`POST /sense-api/ext/solver/jobs`](../../api/reference/solver-jobs.md#operation-post_solver_jobs_sense_api_ext_solver_jobs_post) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `jobs` | list of [`PostSolverJobExt`](models/solver.md#model-PostSolverJobExt) | yes | Jobs to submit. | **Returns:** list of [`SolverJob`](models/solver.md#model-SolverJob) === "Async" ```python async with AsyncSympheny(username, password) as client: submitted = await client.solver_jobs.submit(jobs) ``` === "Sync" ```python with Sympheny(username, password) as client: submitted = client.solver_jobs.submit(jobs) ``` ## solver_jobs.list_for_scenarios { #method-solver_jobs-list_for_scenarios } ```python async def list_for_scenarios( scenario_guids: list[str], *, limit: int = 200, status: JobStatus | None = None, ) -> list[SolverJob] ``` List solver jobs for the given scenarios, optionally filtered by status. REST operation: [`POST /sense-api/ext/solver/jobs/get-scenarios`](../../api/reference/solver-jobs.md#operation-post_get_scenario_jobs_sense_api_ext_solver_jobs_get_scenarios_post) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guids` | list of `str` | yes | GUIDs of the scenarios to list jobs for. | | `limit` | `int` | no | Maximum number of jobs to return. Defaults to `200`. | | `status` | [`JobStatus`](models/solver.md#model-JobStatus), optional | no | Return only jobs with this status (filtered client-side). | **Returns:** list of [`SolverJob`](models/solver.md#model-SolverJob) === "Async" ```python async with AsyncSympheny(username, password) as client: jobs = await client.solver_jobs.list_for_scenarios(scenario_guids) ``` === "Sync" ```python with Sympheny(username, password) as client: jobs = client.solver_jobs.list_for_scenarios(scenario_guids) ``` ## solver_jobs.usage { #method-solver_jobs-usage } ```python async def usage() -> GetUsageExt ``` Get solver usage of the current subscription and user. REST operation: [`GET /sense-api/ext/solver/jobs/usage`](../../api/reference/solver-jobs.md#operation-get_solver_jobs_usage_sense_api_ext_solver_jobs_usage_get) **Returns:** [`GetUsageExt`](models/solver.md#model-GetUsageExt) === "Async" ```python async with AsyncSympheny(username, password) as client: usage = await client.solver_jobs.usage() ``` === "Sync" ```python with Sympheny(username, password) as client: usage = client.solver_jobs.usage() ``` ## solver_jobs.get { #method-solver_jobs-get } ```python async def get(job_id: str | UUID) -> GetSolverJobExt ``` Get a solver job by id. REST operation: [`GET /sense-api/ext/solver/jobs/{id}`](../../api/reference/solver-jobs.md#operation-get_solver_job_sense_api_ext_solver_jobs__id__get) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `job_id` | `str` or `UUID` | yes | Solver job id. | **Returns:** [`GetSolverJobExt`](models/solver.md#model-GetSolverJobExt) === "Async" ```python async with AsyncSympheny(username, password) as client: job = await client.solver_jobs.get(job_id) ``` === "Sync" ```python with Sympheny(username, password) as client: job = client.solver_jobs.get(job_id) ``` ## solver_jobs.delete { #method-solver_jobs-delete } ```python async def delete(job_id: str | UUID) -> str ``` Delete a solver job. REST operation: [`DELETE /sense-api/ext/solver/jobs/{id}`](../../api/reference/solver-jobs.md#operation-delete_solver_job_sense_api_ext_solver_jobs__id__delete) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `job_id` | `str` or `UUID` | yes | Solver job id. | **Returns:** `str` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.solver_jobs.delete(job_id) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.solver_jobs.delete(job_id) ``` ## solver_jobs.stop { #method-solver_jobs-stop } ```python async def stop(job_id: str | UUID) -> str ``` Stop a running solver job. REST operation: [`PUT /sense-api/ext/solver/jobs/{id}/stop`](../../api/reference/solver-jobs.md#operation-stop_job_sense_api_ext_solver_jobs__id__stop_put) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `job_id` | `str` or `UUID` | yes | Solver job id. | **Returns:** `str` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.solver_jobs.stop(job_id) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.solver_jobs.stop(job_id) ``` --- # Users User account endpoints. Available on the client as `client.users`. ## users.profile { #method-users-profile } ```python async def profile() -> GetUserProfileExt ``` Get the profile of the authenticated user. REST operation: [`GET /backoffice/ext/users/profile`](../../api/reference/users.md#operation-get_user_profile_backoffice_ext_users_profile_get) **Returns:** [`GetUserProfileExt`](models/solver.md#model-GetUserProfileExt) === "Async" ```python async with AsyncSympheny(username, password) as client: profile = await client.users.profile() ``` === "Sync" ```python with Sympheny(username, password) as client: profile = client.users.profile() ``` --- # Unofficial endpoints Endpoints outside the official documented Sympheny API. May change without notice. Available on the client as `client.unofficial`. !!! warning Every method on this page calls an endpoint that is **not part of the official documented Sympheny API**. These endpoints may change or disappear without notice, and they return raw JSON payloads (`dict`/`list`) instead of typed models. Prefer an official, typed equivalent whenever one exists. ## unofficial.get_analysis { #method-unofficial-get_analysis } ```python async def get_analysis(analysis_guid: str) -> dict[str, Any] ``` UNOFFICIAL — Get analysis details incl. scenarios and results. REST operation: `GET /sympheny-app/analysis/{guid}` (not part of the official spec) Prefer `client.analyses.get` unless you need the `results` payload (scenarios / input-file paths), which the official endpoint does not return. **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str` | yes | GUID of the analysis. | **Returns:** `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: analysis = await client.unofficial.get_analysis(analysis_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: analysis = client.unofficial.get_analysis(analysis_guid) ``` ## unofficial.create_master_scenario { #method-unofficial-create_master_scenario } ```python async def create_master_scenario(payload: dict[str, Any]) -> dict[str, Any] ``` UNOFFICIAL — Create a master scenario. REST operation: `POST /sympheny-app/master-scenario/` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `payload` | `dict[str, Any]` | yes | Raw JSON payload. | **Returns:** `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.unofficial.create_master_scenario(payload) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.unofficial.create_master_scenario(payload) ``` ## unofficial.list_variants { #method-unofficial-list_variants } ```python async def list_variants(master_scenario_guid: str) -> list[dict[str, Any]] ``` UNOFFICIAL — List scenario variants of a master scenario. REST operation: `GET /sympheny-app/master-scenario/{guid}/scenario-variants` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `master_scenario_guid` | `str` | yes | GUID of the master scenario. | **Returns:** list of `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: variants = await client.unofficial.list_variants(master_scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: variants = client.unofficial.list_variants(master_scenario_guid) ``` ## unofficial.delete_all_variants { #method-unofficial-delete_all_variants } ```python async def delete_all_variants(master_scenario_guid: str) -> None ``` UNOFFICIAL — Delete all scenario variants of a master scenario. REST operation: `DELETE /sympheny-app/master-scenario/{guid}/scenario-variants` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `master_scenario_guid` | `str` | yes | GUID of the master scenario. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.unofficial.delete_all_variants(master_scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: client.unofficial.delete_all_variants(master_scenario_guid) ``` ## unofficial.get_variants_excel_url { #method-unofficial-get_variants_excel_url } ```python async def get_variants_excel_url(master_scenario_guid: str) -> str ``` UNOFFICIAL — Get a presigned URL to the variants Excel export. REST operation: `GET /sympheny-app/master-scenario/{guid}/scenario-variants-excel` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `master_scenario_guid` | `str` | yes | GUID of the master scenario. | **Returns:** `str` === "Async" ```python async with AsyncSympheny(username, password) as client: url = await client.unofficial.get_variants_excel_url(master_scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: url = client.unofficial.get_variants_excel_url(master_scenario_guid) ``` ## unofficial.create_variants_from_excel_url { #method-unofficial-create_variants_from_excel_url } ```python async def create_variants_from_excel_url( presigned_url: str, master_scenario_guid: str, *, delete_existing: bool = True, ) -> Any ``` UNOFFICIAL — Create scenario variants from an uploaded Excel file. REST operation: `PUT /sympheny-app/scenario-variants-excel` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `presigned_url` | `str` | yes | Presigned S3 URL the Excel file was uploaded to. | | `master_scenario_guid` | `str` | yes | GUID of the master scenario. | | `delete_existing` | `bool` | no | Delete the existing scenario variants first. Defaults to `True`. | **Returns:** `Any` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.unofficial.create_variants_from_excel_url(presigned_url, master_scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.unofficial.create_variants_from_excel_url(presigned_url, master_scenario_guid) ``` ## unofficial.get_upload_url { #method-unofficial-get_upload_url } ```python async def get_upload_url() -> str ``` UNOFFICIAL — Get a presigned S3 URL for file uploads. REST operation: `GET /sympheny-app/db-update/s3-presigned-url` (not part of the official spec) **Returns:** `str` === "Async" ```python async with AsyncSympheny(username, password) as client: url = await client.unofficial.get_upload_url() ``` === "Sync" ```python with Sympheny(username, password) as client: url = client.unofficial.get_upload_url() ``` ## unofficial.upload_to_presigned_url { #method-unofficial-upload_to_presigned_url } ```python async def upload_to_presigned_url(presigned_url: str, content: bytes) -> None ``` UNOFFICIAL — Upload raw bytes to a presigned S3 URL (no Sympheny auth). **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `presigned_url` | `str` | yes | Presigned S3 URL from `get_upload_url`. | | `content` | `bytes` | yes | Raw file bytes to upload. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.unofficial.upload_to_presigned_url(presigned_url, content) ``` === "Sync" ```python with Sympheny(username, password) as client: client.unofficial.upload_to_presigned_url(presigned_url, content) ``` ## unofficial.create_scenario_from_excel_url { #method-unofficial-create_scenario_from_excel_url } ```python async def create_scenario_from_excel_url( presigned_url: str, scenario_name: str, analysis_guid: str, ) -> str ``` UNOFFICIAL — Create a scenario from an uploaded Excel file; returns the scenario GUID. REST operation: `POST /sympheny-app/v2/analysis/{guid}/scenario/excel` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `presigned_url` | `str` | yes | Presigned S3 URL the Excel file was uploaded to. | | `scenario_name` | `str` | yes | Name for the new scenario. | | `analysis_guid` | `str` | yes | GUID of the analysis. | **Returns:** `str` === "Async" ```python async with AsyncSympheny(username, password) as client: scenario_guid = await client.unofficial.create_scenario_from_excel_url(presigned_url, scenario_name, analysis_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: scenario_guid = client.unofficial.create_scenario_from_excel_url(presigned_url, scenario_name, analysis_guid) ``` ## unofficial.close_diagram { #method-unofficial-close_diagram } ```python async def close_diagram(scenario_guid: str) -> None ``` UNOFFICIAL — Close the hub diagram of a scenario. REST operation: `PUT /sympheny-app/scenarios/{guid}/close-diagram` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.unofficial.close_diagram(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: client.unofficial.close_diagram(scenario_guid) ``` ## unofficial.generate_specs { #method-unofficial-generate_specs } ```python async def generate_specs(scenario_guids: list[str]) -> None ``` UNOFFICIAL — Trigger input-file (specs) generation for scenarios. REST operation: `PUT /sympheny-app/v2/specs` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guids` | list of `str` | yes | GUIDs of the scenarios to generate input files for. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.unofficial.generate_specs(scenario_guids) ``` === "Sync" ```python with Sympheny(username, password) as client: client.unofficial.generate_specs(scenario_guids) ``` ## unofficial.generate_scenario_specs { #method-unofficial-generate_scenario_specs } ```python async def generate_scenario_specs(scenario_guid: str) -> None ``` UNOFFICIAL — Trigger specs generation for a single scenario. REST operation: `PUT /sympheny-app/v2/scenarios/{guid}/specs` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** `None` === "Async" ```python async with AsyncSympheny(username, password) as client: await client.unofficial.generate_scenario_specs(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: client.unofficial.generate_scenario_specs(scenario_guid) ``` ## unofficial.create_scenario_enymap { #method-unofficial-create_scenario_enymap } ```python async def create_scenario_enymap(analysis_guid: str, payload: dict[str, Any]) -> dict[str, Any] ``` UNOFFICIAL — Create an enymap scenario. REST operation: `POST /sympheny-app/analysis/{guid}/scenario-enymap` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str` | yes | GUID of the analysis. | | `payload` | `dict[str, Any]` | yes | Raw JSON payload. | **Returns:** `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.unofficial.create_scenario_enymap(analysis_guid, payload) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.unofficial.create_scenario_enymap(analysis_guid, payload) ``` ## unofficial.create_gis_hub { #method-unofficial-create_gis_hub } ```python async def create_gis_hub(scenario_guid: str, polygon: list[Any]) -> Any ``` UNOFFICIAL — Create a GIS hub for an enymap scenario. REST operation: `POST /sympheny-app/scenario-enymap/{guid}/create-gis-hub` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | | `polygon` | list of `Any` | yes | Polygon coordinates. | **Returns:** `Any` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.unofficial.create_gis_hub(scenario_guid, polygon) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.unofficial.create_gis_hub(scenario_guid, polygon) ``` ## unofficial.create_demand_solar { #method-unofficial-create_demand_solar } ```python async def create_demand_solar(scenario_guid: str) -> Any ``` UNOFFICIAL — Create demands and solar resources for an enymap scenario. REST operation: `POST /sympheny-app/scenario-enymap/{guid}/create-demand-solar` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str` | yes | GUID of the scenario. | **Returns:** `Any` === "Async" ```python async with AsyncSympheny(username, password) as client: result = await client.unofficial.create_demand_solar(scenario_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: result = client.unofficial.create_demand_solar(scenario_guid) ``` ## unofficial.gis_background_jobs { #method-unofficial-gis_background_jobs } ```python async def gis_background_jobs() -> list[dict[str, Any]] ``` UNOFFICIAL — List GIS background jobs (`api-services` backend). REST operation: `GET /api-services/gis/background` (not part of the official spec) **Returns:** list of `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: jobs = await client.unofficial.gis_background_jobs() ``` === "Sync" ```python with Sympheny(username, password) as client: jobs = client.unofficial.gis_background_jobs() ``` ## unofficial.hub_demand { #method-unofficial-hub_demand } ```python async def hub_demand( demand_type: str, building_type: str, buildings: list[dict[str, Any]], ) -> list[dict[str, Any]] ``` UNOFFICIAL — Estimate building energy demand (`api-services` backend). REST operation: `POST /api-services/demand/hub_demand` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `demand_type` | `str` | yes | | | `building_type` | `str` | yes | | | `buildings` | list of `dict[str, Any]` | yes | | **Returns:** list of `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: demands = await client.unofficial.hub_demand(demand_type, building_type, buildings) ``` === "Sync" ```python with Sympheny(username, password) as client: demands = client.unofficial.hub_demand(demand_type, building_type, buildings) ``` ## unofficial.get_database_demand_profile { #method-unofficial-get_database_demand_profile } ```python async def get_database_demand_profile(demand_guid: str) -> list[dict[str, Any]] ``` UNOFFICIAL — Get the normalized profile of a database energy demand. REST operation: `GET /sympheny-app/database-energy-demands/{guid}/profile` (not part of the official spec) **Parameters** | Name | Type | Required | Description | | --- | --- | --- | --- | | `demand_guid` | `str` | yes | GUID of the demand. | **Returns:** list of `dict[str, Any]` === "Async" ```python async with AsyncSympheny(username, password) as client: profile = await client.unofficial.get_database_demand_profile(demand_guid) ``` === "Sync" ```python with Sympheny(username, password) as client: profile = client.unofficial.get_database_demand_profile(demand_guid) ``` --- # Shared models Models used across several resource groups. ## CustomSeasonalityResponseDto { #model-CustomSeasonalityResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `month` | [`Month`](#model-Month), optional | no | | | `value` | `float`, optional | no | | ## Demand { #model-Demand } | Member | Value | | --- | --- | | `Demand.hot_water` | `'HOT_WATER'` | | `Demand.space_heating` | `'SPACE_HEATING'` | | `Demand.electricity` | `'ELECTRICITY'` | | `Demand.cooling` | `'COOLING'` | ## EnergyCarrierResponseDto { #model-EnergyCarrierResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_carrier_guid` | `str` | yes | | | `type_key` | `str` | yes | | | `type_display_name` | `str` | yes | | | `subtype_key` | `str` | yes | | | `subtype_display_name` | `str` | yes | | | `energy_carrier_name` | `str` | yes | | | `color_hex_code` | `str` | yes | | | `fixed_input_share` | `float`, optional | no | | | `output_efficiency` | `float`, optional | no | | | `custom_output_efficiency_activated` | `bool` | yes | | | `custom_input_efficiency_activated` | `bool` | yes | | | `custom_seasonality_values` | list of [`CustomSeasonalityResponseDto`](#model-CustomSeasonalityResponseDto), optional | no | | | `output_efficiency_profile_id` | `int`, optional | no | | | `created` | `AwareDatetime` | yes | | | `primary` | `bool`, optional | no | | ## Export { #model-Export } | Member | Value | | --- | --- | | `Export.heat_ambient` | `'HEAT_AMBIENT'` | | `Export.cooling` | `'COOLING'` | ## HubResponseDto { #model-HubResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | | | `hub_name` | `str` | yes | | | `updated` | `AwareDatetime` | yes | | | `created` | `AwareDatetime` | yes | | ## Import { #model-Import } | Member | Value | | --- | --- | | `Import.electricity` | `'ELECTRICITY'` | ## Month { #model-Month } | Member | Value | | --- | --- | | `Month.january` | `'JANUARY'` | | `Month.february` | `'FEBRUARY'` | | `Month.march` | `'MARCH'` | | `Month.april` | `'APRIL'` | | `Month.may` | `'MAY'` | | `Month.june` | `'JUNE'` | | `Month.july` | `'JULY'` | | `Month.august` | `'AUGUST'` | | `Month.september` | `'SEPTEMBER'` | | `Month.october` | `'OCTOBER'` | | `Month.november` | `'NOVEMBER'` | | `Month.december` | `'DECEMBER'` | | `Month.none_type_none` | `None` | ## ScenarioEnymapResponseDto { #model-ScenarioEnymapResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `length` | `int`, optional | no | | | `interest_rate` | `float`, optional | no | | | `exchange_currency` | `str`, optional | no | | | `exchange_rate` | `float`, optional | no | | | `scope` | [`Scope`](#model-Scope), optional | no | | | `technologies` | list of [`Technology`](#model-Technology), optional | no | | | `demands` | list of [`Demand`](#model-Demand), optional | no | | | `imports` | list of [`Import`](#model-Import), optional | no | | | `exports` | list of [`Export`](#model-Export), optional | no | | | `multi_hubs` | `bool`, optional | no | | ## ScenarioResponseDto { #model-ScenarioResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `scenario_guid` | `str`, optional | no | | | `scenario_name` | `str`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `ready_for_execution` | `bool`, optional | no | | | `preparing_execution_v2` | `bool`, optional | no | | | `master_scenario_guid` | `str`, optional | no | | | `project_guid` | `str`, optional | no | | | `project_name` | `str`, optional | no | | | `analysis_guid` | `str`, optional | no | | | `analysis_name` | `str`, optional | no | | | `enymap` | [`ScenarioEnymapResponseDto`](#model-ScenarioEnymapResponseDto), optional | no | | | `variant` | `bool`, optional | no | | ## Scope { #model-Scope } | Member | Value | | --- | --- | | `Scope.building_developments` | `'BUILDING_DEVELOPMENTS'` | | `Scope.regional_national` | `'REGIONAL_NATIONAL'` | | `Scope.industrial_parks` | `'INDUSTRIAL_PARKS'` | | `Scope.none_type_none` | `None` | ## Status { #model-Status } | Field | Type | Required | Description | | --- | --- | --- | --- | | `code` | `str`, optional | no | | | `desc` | `str`, optional | no | | | `message` | `str`, optional | no | | ## Technology { #model-Technology } | Member | Value | | --- | --- | | `Technology.pv` | `'PV'` | | `Technology.heat_pump` | `'HEAT_PUMP'` | | `Technology.gas_boiler` | `'GAS_BOILER'` | | `Technology.hot_water_storage` | `'HOT_WATER_STORAGE'` | | `Technology.chiller` | `'CHILLER'` | | `Technology.battery` | `'BATTERY'` | --- # Project and analysis models ## AnalysisDetailsResponseDto { #model-AnalysisDetailsResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str`, optional | no | | | `analysis_name` | `str`, optional | no | | | `execution_status` | [`ExecutionStatus`](#model-ExecutionStatus), optional | no | | | `execution_in_progress` | `bool`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `cover_image` | `str`, optional | no | | | `project_name` | `str`, optional | no | | | `scenarios` | list of [`ScenarioResponseDto`](common.md#model-ScenarioResponseDto), optional | no | | | `execution_options` | [`ExecutionOptionsResponseDto`](#model-ExecutionOptionsResponseDto), optional | no | | | `results` | [`ResultsResponseDto`](#model-ResultsResponseDto), optional | no | | | `project_guid` | `str`, optional | no | | ## AnalysisRequestDto { #model-AnalysisRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `analysis_name` | `str` | yes | (max length 100, min length 0) | ## AnalysisResponseDto { #model-AnalysisResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `analysis_guid` | `str`, optional | no | | | `analysis_name` | `str`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `scenarios` | list of [`ScenarioResponseDto`](common.md#model-ScenarioResponseDto), optional | no | | ## ExecutionOptionsResponseDto { #model-ExecutionOptionsResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `objective1` | `str`, optional | no | | | `objective2` | `str`, optional | no | | | `number_of_pareto_points` | `int`, optional | no | | | `scenarios` | list of `str`, optional | no | | ## ExecutionStatus { #model-ExecutionStatus } | Member | Value | | --- | --- | | `ExecutionStatus.in_specification` | `'IN_SPECIFICATION'` | | `ExecutionStatus.ready_to_submit` | `'READY_TO_SUBMIT'` | | `ExecutionStatus.picked` | `'PICKED'` | | `ExecutionStatus.failed` | `'FAILED'` | | `ExecutionStatus.aborted` | `'ABORTED'` | | `ExecutionStatus.running` | `'RUNNING'` | | `ExecutionStatus.done` | `'DONE'` | | `ExecutionStatus.none_type_none` | `None` | ## ImageResponseDto { #model-ImageResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `url` | `str`, optional | no | | | `guid` | `str`, optional | no | | | `cover` | `bool`, optional | no | | ## ProjectDetailResponseDto { #model-ProjectDetailResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `images` | list of [`ImageResponseDto`](#model-ImageResponseDto), optional | no | | | `project_name` | `str`, optional | no | | | `project_guid` | `str`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `project_owner` | `str`, optional | no | | | `project_owner_email` | `str`, optional | no | | | `secondary_owners` | list of [`SecondaryOwnerDto`](#model-SecondaryOwnerDto), optional | no | | | `lock_user_email` | `str`, optional | no | | | `lock` | `bool`, optional | no | | | `lock_time` | `AwareDatetime`, optional | no | | | `owned_by_current_user` | `bool`, optional | no | | | `editable_by_current_user` | `bool`, optional | no | | | `owner_history` | list of [`ProjectOwnerHistoryResponseDto`](#model-ProjectOwnerHistoryResponseDto), optional | no | | | `analyses` | list of [`AnalysisResponseDto`](#model-AnalysisResponseDto), optional | no | | | `cover_image` | `str`, optional | no | | | `original_default_project_guid` | `str`, optional | no | | | `version` | [`Version1`](#model-Version1), optional | no | | | `webhook_url` | `str`, optional | no | | | `favorite` | `bool`, optional | no | | | `gis_centroid_x` | `float`, optional | no | | | `gis_centroid_y` | `float`, optional | no | | | `zoom_extent_xmin` | `float`, optional | no | | | `zoom_extent_ymin` | `float`, optional | no | | | `zoom_extent_xmax` | `float`, optional | no | | | `zoom_extent_ymax` | `float`, optional | no | | ## ProjectOwnerHistoryResponseDto { #model-ProjectOwnerHistoryResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `owned_at` | `AwareDatetime`, optional | no | | | `owner_email` | `str`, optional | no | | ## ProjectRequestDto { #model-ProjectRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `project_name` | `str` | yes | (max length 100, min length 0) | | `version` | [`Version`](#model-Version) | yes | | | `webhook_url` | `str`, optional | no | | | `favorite` | `bool`, optional | no | | | `gis_centroid_x` | `float`, optional | no | | | `gis_centroid_y` | `float`, optional | no | | | `zoom_extent_xmin` | `float`, optional | no | | | `zoom_extent_ymin` | `float`, optional | no | | | `zoom_extent_xmax` | `float`, optional | no | | | `zoom_extent_ymax` | `float`, optional | no | | ## ProjectResponseDto { #model-ProjectResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `project_name` | `str`, optional | no | | | `project_guid` | `str`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `cover_image` | `str`, optional | no | | | `project_owner_email` | `str`, optional | no | | | `secondary_owners` | list of [`SecondaryOwnerDto`](#model-SecondaryOwnerDto), optional | no | | | `lock_user_email` | `str`, optional | no | | | `lock` | `bool`, optional | no | | | `lock_time` | `AwareDatetime`, optional | no | | | `owned_by_current_user` | `bool`, optional | no | | | `editable_by_current_user` | `bool`, optional | no | | | `original_default_project_guid` | `str`, optional | no | | | `version` | [`Version1`](#model-Version1), optional | no | | | `favorite` | `bool`, optional | no | | | `gis_centroid_x` | `float`, optional | no | | | `gis_centroid_y` | `float`, optional | no | | | `zoom_extent_xmin` | `float`, optional | no | | | `zoom_extent_ymin` | `float`, optional | no | | | `zoom_extent_xmax` | `float`, optional | no | | | `zoom_extent_ymax` | `float`, optional | no | | | `processing` | `bool`, optional | no | | ## ProjectSummaryResponseDto { #model-ProjectSummaryResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `projects` | list of [`ProjectResponseDto`](#model-ProjectResponseDto), optional | no | | ## ResultsResponseDto { #model-ResultsResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `execution_submitted` | `AwareDatetime`, optional | no | | | `scenarios` | list of [`ResultsScenarioResponseDto`](#model-ResultsScenarioResponseDto), optional | no | | | `dashboard_url` | `str`, optional | no | | ## ResultsScenarioResponseDto { #model-ResultsScenarioResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `scenario_name` | `str`, optional | no | | | `status` | [`Status1`](#model-Status1), optional | no | | | `status_message` | `str`, optional | no | | | `pareto_points_completed` | `str`, optional | no | | | `input_filepath` | `str`, optional | no | | | `output_filepath` | `str`, optional | no | | ## SecondaryOwnerDto { #model-SecondaryOwnerDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | `str` | yes | | | `can_edit` | `bool`, optional | no | | | `favorite` | `bool`, optional | no | | ## Status1 { #model-Status1 } | Member | Value | | --- | --- | | `Status1.in_specification` | `'IN_SPECIFICATION'` | | `Status1.submitted` | `'SUBMITTED'` | | `Status1.aborted` | `'ABORTED'` | | `Status1.validating` | `'VALIDATING'` | | `Status1.valid` | `'VALID'` | | `Status1.invalid` | `'INVALID'` | | `Status1.pending` | `'PENDING'` | | `Status1.running` | `'RUNNING'` | | `Status1.done_optimization` | `'DONE_OPTIMIZATION'` | | `Status1.generating_results` | `'GENERATING_RESULTS'` | | `Status1.done` | `'DONE'` | | `Status1.failed` | `'FAILED'` | | `Status1.stopped` | `'STOPPED'` | | `Status1.none_type_none` | `None` | ## Version { #model-Version } | Member | Value | | --- | --- | | `Version.v1` | `'V1'` | | `Version.v2` | `'V2'` | ## Version1 { #model-Version1 } | Member | Value | | --- | --- | | `Version1.v1` | `'V1'` | | `Version1.v2` | `'V2'` | | `Version1.none_type_none` | `None` | --- # Scenario, stage, and hub models ## HubRequestDto { #model-HubRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_name` | `str` | yes | (max length 100, min length 0) | ## ScenarioRequestDto { #model-ScenarioRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `scenario_name` | `str` | yes | (max length 100, min length 0) | ## StageRequestDto { #model-StageRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `length` | `int` | yes | | | `interest_rate` | `float`, optional | no | | | `inflation_rate` | `float`, optional | no | | | `index` | `int` | yes | | ## StageResponseDto { #model-StageResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `length` | `int` | yes | | | `interest_rate` | `float`, optional | no | | | `inflation_rate` | `float`, optional | no | | | `index` | `int` | yes | | | `guid` | `UUID`, optional | no | | --- # Energy models ## AdvancedPriceComponentRequestDtoV2 { #model-AdvancedPriceComponentRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `value` | `float`, optional | no | | | `price_category` | [`PriceCategory`](#model-PriceCategory) | yes | | | `price_dimension` | [`PriceDimension`](#model-PriceDimension) | yes | | | `type` | [`Type2`](#model-Type2), optional | no | | | `time_of_uses` | list of `str`, optional | no | | | `price_category_id` | [`PriceCategoryId`](#model-PriceCategoryId), optional | no | | | `price_dimension_id` | [`PriceDimensionId`](#model-PriceDimensionId), optional | no | | ## AdvancedPriceComponentResponseDtoV2 { #model-AdvancedPriceComponentResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str`, optional | no | | | `guid` | `str`, optional | no | | | `value` | `float`, optional | no | | | `price_category` | `str`, optional | no | | | `price_category_id` | [`PriceCategoryId`](#model-PriceCategoryId), optional | no | | | `price_dimension` | `str`, optional | no | | | `price_dimension_id` | [`PriceDimensionId`](#model-PriceDimensionId), optional | no | | | `type` | [`Type2`](#model-Type2), optional | no | | | `time_of_uses` | list of `str`, optional | no | | ## AvailableResourceType { #model-AvailableResourceType } | Member | Value | | --- | --- | | `AvailableResourceType.area` | `'Area'` | | `AvailableResourceType.generic` | `'Generic'` | | `AvailableResourceType.power` | `'Power'` | ## EnergyCarrierRequestDtoV2 { #model-EnergyCarrierRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `sub_type` | [`SubType`](#model-SubType) | yes | | | `energy_carrier_name` | `str` | yes | (max length 100, min length 0) | | `color_hex_code` | `str`, optional | no | | | `allow_virtual_load` | `bool`, optional | no | | ## EnergyCarriersListResponseDto { #model-EnergyCarriersListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_carriers` | list of [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto), optional | no | | ## EnergyDemandDetailResponseDtoV2 { #model-EnergyDemandDetailResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_demand_guid` | `str`, optional | no | | | `energy_demand_name` | `str`, optional | no | | | `energy_carrier_guid` | `str`, optional | no | | | `energy_carrier_name` | `str`, optional | no | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto), optional | no | | | `demand_sale_price` | `float`, optional | no | | | `stages` | list of `UUID`, optional | no | | | `demand_profile_id` | `int`, optional | no | | | `demand_scaling_factor` | `float`, optional | no | | | `demand_sale_price_profile_id` | `int`, optional | no | | | `demand_sale_price_scaling_factor` | `float`, optional | no | | | `energy_demand_user_saved_metadata_guid` | `str`, optional | no | | | `energy_demand_user_saved_metadata_name` | `str`, optional | no | | | `energy_demand_user_saved_metadata_reference_area` | `float`, optional | no | | | `scaling_factor` | `float`, optional | no | | | `energy_demand_metadata_guid` | `str`, optional | no | | | `energy_demand_metadata_name` | `str`, optional | no | | | `energy_demand_metadata_db_organization` | `str`, optional | no | | | `energy_demand_metadata_type` | [`EnergyDemandMetadataType`](#model-EnergyDemandMetadataType), optional | no | | | `energy_demand_metadata_building_type` | [`EnergyDemandMetadataBuildingType`](#model-EnergyDemandMetadataBuildingType), optional | no | | | `energy_demand_metadata_building_age` | [`EnergyDemandMetadataBuildingAge`](#model-EnergyDemandMetadataBuildingAge), optional | no | | | `energy_demand_metadata_option` | [`EnergyDemandMetadataOption`](#model-EnergyDemandMetadataOption), optional | no | | | `energy_demand_metadata_referenced_area_m2` | `float`, optional | no | | | `energy_demand_metadata_specific_energy_demand_value_k_wh_m2` | `float`, optional | no | | | `energy_demand_metadata_total_annual_demand` | `float`, optional | no | | | `multiplication_factor_preview` | `int`, optional | no | | | `multiplication_factor` | `int`, optional | no | | | `reverse` | `bool`, optional | no | | ## EnergyDemandListResponseDto { #model-EnergyDemandListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_demands` | list of [`EnergyDemandResponseDto`](#model-EnergyDemandResponseDto), optional | no | | ## EnergyDemandMetadataBuildingAge { #model-EnergyDemandMetadataBuildingAge } | Member | Value | | --- | --- | | `EnergyDemandMetadataBuildingAge.age_under_1970` | `'AGE_UNDER_1970'` | | `EnergyDemandMetadataBuildingAge.age_1970_1980` | `'AGE_1970_1980'` | | `EnergyDemandMetadataBuildingAge.age_1980_1995` | `'AGE_1980_1995'` | | `EnergyDemandMetadataBuildingAge.age_1995_2005` | `'AGE_1995_2005'` | | `EnergyDemandMetadataBuildingAge.age_2005_2015` | `'AGE_2005_2015'` | | `EnergyDemandMetadataBuildingAge.age_over_2015` | `'AGE_OVER_2015'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_mfh` | `'SIA_2024_EXISTING_MFH'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_sfh` | `'SIA_2024_EXISTING_SFH'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_hotel_room` | `'SIA_2024_EXISTING_HOTEL_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_lobby` | `'SIA_2024_EXISTING_LOBBY'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_single_group_office` | `'SIA_2024_EXISTING_SINGLE_GROUP_OFFICE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_open_plan_office` | `'SIA_2024_EXISTING_OPEN_PLAN_OFFICE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_meeting_room` | `'SIA_2024_EXISTING_MEETING_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_counter_hall` | `'SIA_2024_EXISTING_COUNTER_HALL'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_class_room` | `'SIA_2024_EXISTING_CLASS_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_teachers_lounge` | `'SIA_2024_EXISTING_TEACHERS_LOUNGE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_library` | `'SIA_2024_EXISTING_LIBRARY'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_auditorium` | `'SIA_2024_EXISTING_AUDITORIUM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_school_subject_room` | `'SIA_2024_EXISTING_SCHOOL_SUBJECT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_food_sale_store` | `'SIA_2024_EXISTING_FOOD_SALE_STORE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_specialty_store` | `'SIA_2024_EXISTING_SPECIALTY_STORE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_sales_furniture_diy_garden` | `'SIA_2024_EXISTING_SALES_FURNITURE_DIY_GARDEN'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_patient_room` | `'SIA_2024_EXISTING_PATIENT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_ward_room` | `'SIA_2024_EXISTING_WARD_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_treatment_room` | `'SIA_2024_EXISTING_TREATMENT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_warehouse` | `'SIA_2024_EXISTING_WAREHOUSE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_gymnasium` | `'SIA_2024_EXISTING_GYMNASIUM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_fitness_room` | `'SIA_2024_EXISTING_FITNESS_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_existing_indoor_swimming_pool` | `'SIA_2024_EXISTING_INDOOR_SWIMMING_POOL'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_mfh` | `'SIA_2024_STANDARD_MFH'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_sfh` | `'SIA_2024_STANDARD_SFH'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_hotel_room` | `'SIA_2024_STANDARD_HOTEL_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_lobby` | `'SIA_2024_STANDARD_LOBBY'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_single_group_office` | `'SIA_2024_STANDARD_SINGLE_GROUP_OFFICE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_open_plan_office` | `'SIA_2024_STANDARD_OPEN_PLAN_OFFICE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_meeting_room` | `'SIA_2024_STANDARD_MEETING_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_counter_hall` | `'SIA_2024_STANDARD_COUNTER_HALL'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_class_room` | `'SIA_2024_STANDARD_CLASS_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_teachers_lounge` | `'SIA_2024_STANDARD_TEACHERS_LOUNGE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_library` | `'SIA_2024_STANDARD_LIBRARY'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_auditorium` | `'SIA_2024_STANDARD_AUDITORIUM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_school_subject_room` | `'SIA_2024_STANDARD_SCHOOL_SUBJECT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_food_sale_store` | `'SIA_2024_STANDARD_FOOD_SALE_STORE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_specialty_store` | `'SIA_2024_STANDARD_SPECIALTY_STORE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_sales_furniture_diy_garden` | `'SIA_2024_STANDARD_SALES_FURNITURE_DIY_GARDEN'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_patient_room` | `'SIA_2024_STANDARD_PATIENT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_ward_room` | `'SIA_2024_STANDARD_WARD_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_treatment_room` | `'SIA_2024_STANDARD_TREATMENT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_warehouse` | `'SIA_2024_STANDARD_WAREHOUSE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_gymnasium` | `'SIA_2024_STANDARD_GYMNASIUM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_fitness_room` | `'SIA_2024_STANDARD_FITNESS_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_standard_indoor_swimming_pool` | `'SIA_2024_STANDARD_INDOOR_SWIMMING_POOL'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_mfh` | `'SIA_2024_TARGET_MFH'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_sfh` | `'SIA_2024_TARGET_SFH'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_hotel_room` | `'SIA_2024_TARGET_HOTEL_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_lobby` | `'SIA_2024_TARGET_LOBBY'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_single_group_office` | `'SIA_2024_TARGET_SINGLE_GROUP_OFFICE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_open_plan_office` | `'SIA_2024_TARGET_OPEN_PLAN_OFFICE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_meeting_room` | `'SIA_2024_TARGET_MEETING_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_counter_hall` | `'SIA_2024_TARGET_COUNTER_HALL'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_class_room` | `'SIA_2024_TARGET_CLASS_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_teachers_lounge` | `'SIA_2024_TARGET_TEACHERS_LOUNGE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_library` | `'SIA_2024_TARGET_LIBRARY'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_auditorium` | `'SIA_2024_TARGET_AUDITORIUM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_school_subject_room` | `'SIA_2024_TARGET_SCHOOL_SUBJECT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_food_sale_store` | `'SIA_2024_TARGET_FOOD_SALE_STORE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_specialty_store` | `'SIA_2024_TARGET_SPECIALTY_STORE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_sales_furniture_diy_garden` | `'SIA_2024_TARGET_SALES_FURNITURE_DIY_GARDEN'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_patient_room` | `'SIA_2024_TARGET_PATIENT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_ward_room` | `'SIA_2024_TARGET_WARD_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_treatment_room` | `'SIA_2024_TARGET_TREATMENT_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_warehouse` | `'SIA_2024_TARGET_WAREHOUSE'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_gymnasium` | `'SIA_2024_TARGET_GYMNASIUM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_fitness_room` | `'SIA_2024_TARGET_FITNESS_ROOM'` | | `EnergyDemandMetadataBuildingAge.sia_2024_target_indoor_swimming_pool` | `'SIA_2024_TARGET_INDOOR_SWIMMING_POOL'` | | `EnergyDemandMetadataBuildingAge.minergie_new_construction` | `'MINERGIE_NEW_CONSTRUCTION'` | | `EnergyDemandMetadataBuildingAge.minergie_renovation` | `'MINERGIE_RENOVATION'` | | `EnergyDemandMetadataBuildingAge.minergie_a` | `'MINERGIE_A'` | | `EnergyDemandMetadataBuildingAge.minergie_p_new_construction` | `'MINERGIE_P_NEW_CONSTRUCTION'` | | `EnergyDemandMetadataBuildingAge.minergie_p_renovation` | `'MINERGIE_P_RENOVATION'` | | `EnergyDemandMetadataBuildingAge.others` | `'OTHERS'` | | `EnergyDemandMetadataBuildingAge.none_type_none` | `None` | ## EnergyDemandMetadataBuildingType { #model-EnergyDemandMetadataBuildingType } | Member | Value | | --- | --- | | `EnergyDemandMetadataBuildingType.residence_mfh` | `'RESIDENCE_MFH'` | | `EnergyDemandMetadataBuildingType.residence_sfh` | `'RESIDENCE_SFH'` | | `EnergyDemandMetadataBuildingType.administration` | `'ADMINISTRATION'` | | `EnergyDemandMetadataBuildingType.offices` | `'OFFICES'` | | `EnergyDemandMetadataBuildingType.schools` | `'SCHOOLS'` | | `EnergyDemandMetadataBuildingType.retail` | `'RETAIL'` | | `EnergyDemandMetadataBuildingType.restaurant` | `'RESTAURANT'` | | `EnergyDemandMetadataBuildingType.assembly` | `'ASSEMBLY'` | | `EnergyDemandMetadataBuildingType.hospitals` | `'HOSPITALS'` | | `EnergyDemandMetadataBuildingType.industry` | `'INDUSTRY'` | | `EnergyDemandMetadataBuildingType.warehouse` | `'WAREHOUSE'` | | `EnergyDemandMetadataBuildingType.sports_center` | `'SPORTS_CENTER'` | | `EnergyDemandMetadataBuildingType.indoor_pool` | `'INDOOR_POOL'` | | `EnergyDemandMetadataBuildingType.hotel` | `'HOTEL'` | | `EnergyDemandMetadataBuildingType.industry_1_shift_fabricated_metals` | `'INDUSTRY_1_SHIFT_FABRICATED_METALS'` | | `EnergyDemandMetadataBuildingType.industry_2_shift_fabricated_metals` | `'INDUSTRY_2_SHIFT_FABRICATED_METALS'` | | `EnergyDemandMetadataBuildingType.industry_food_processing` | `'INDUSTRY_FOOD_PROCESSING'` | | `EnergyDemandMetadataBuildingType.industry_general_manufacturer` | `'INDUSTRY_GENERAL_MANUFACTURER'` | | `EnergyDemandMetadataBuildingType.industry_pharmaceutical` | `'INDUSTRY_PHARMACEUTICAL'` | | `EnergyDemandMetadataBuildingType.industry_plastic_manufacturer` | `'INDUSTRY_PLASTIC_MANUFACTURER'` | | `EnergyDemandMetadataBuildingType.industry_services` | `'INDUSTRY_SERVICES'` | | `EnergyDemandMetadataBuildingType.industry_warehouse` | `'INDUSTRY_WAREHOUSE'` | | `EnergyDemandMetadataBuildingType.none_type_none` | `None` | ## EnergyDemandMetadataOption { #model-EnergyDemandMetadataOption } | Member | Value | | --- | --- | | `EnergyDemandMetadataOption.option_1` | `'OPTION_1'` | | `EnergyDemandMetadataOption.option_2` | `'OPTION_2'` | | `EnergyDemandMetadataOption.option_3` | `'OPTION_3'` | | `EnergyDemandMetadataOption.none_type_none` | `None` | ## EnergyDemandMetadataType { #model-EnergyDemandMetadataType } | Member | Value | | --- | --- | | `EnergyDemandMetadataType.electricity` | `'ELECTRICITY'` | | `EnergyDemandMetadataType.space_heating` | `'SPACE_HEATING'` | | `EnergyDemandMetadataType.hot_water` | `'HOT_WATER'` | | `EnergyDemandMetadataType.cooling` | `'COOLING'` | | `EnergyDemandMetadataType.none_type_none` | `None` | ## EnergyDemandRequestDtoV2 { #model-EnergyDemandRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_guids` | list of `str` | yes | | | `energy_carrier_guid` | `str` | yes | | | `demand_profile_id` | `int` | yes | | | `demand_scaling_factor` | `float`, optional | no | | | `name` | `str` | yes | (max length 100, min length 0) | | `demand_sale_price` | `float`, optional | no | | | `demand_sale_price_profile_id` | `int`, optional | no | | | `demand_sale_price_scaling_factor` | `float`, optional | no | | | `stages` | list of `UUID` | yes | | | `multiplication_factor` | `int`, optional | no | | | `reverse` | `bool`, optional | no | | ## EnergyDemandResponseDto { #model-EnergyDemandResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_demand_guid` | `str`, optional | no | | | `energy_carrier_name` | `str`, optional | no | | | `hub_name` | `str`, optional | no | | | `energy_demand_name` | `str`, optional | no | | | `energy_carrier_guid` | `str`, optional | no | | | `hub_guid` | `str`, optional | no | | | `demand_sale_price` | `float`, optional | no | | | `energy_demand_user_saved_metadata_guid` | `str`, optional | no | | | `energy_demand_user_saved_metadata_name` | `str`, optional | no | | | `energy_demand_user_saved_metadata_reference_area` | `float`, optional | no | | | `scaling_factor` | `float`, optional | no | | | `energy_demand_metadata_guid` | `str`, optional | no | | | `energy_demand_metadata_name` | `str`, optional | no | | | `energy_demand_metadata_db_organization` | `str`, optional | no | | | `energy_demand_metadata_type` | [`EnergyDemandMetadataType`](#model-EnergyDemandMetadataType), optional | no | | | `energy_demand_metadata_building_type` | [`EnergyDemandMetadataBuildingType`](#model-EnergyDemandMetadataBuildingType), optional | no | | | `energy_demand_metadata_building_age` | [`EnergyDemandMetadataBuildingAge`](#model-EnergyDemandMetadataBuildingAge), optional | no | | | `energy_demand_metadata_option` | [`EnergyDemandMetadataOption`](#model-EnergyDemandMetadataOption), optional | no | | | `energy_demand_metadata_referenced_area_m2` | `float`, optional | no | | | `energy_demand_metadata_specific_energy_demand_value_k_wh_m2` | `float`, optional | no | | | `energy_demand_metadata_total_annual_demand` | `float`, optional | no | | | `multiplication_factor_preview` | `int`, optional | no | | | `multiplication_factor` | `int`, optional | no | | ## EnergyDemandResponseDtoV2 { #model-EnergyDemandResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_demand_guid` | `str`, optional | no | | | `energy_carrier_name` | `str` | yes | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto) | yes | | | `energy_demand_name` | `str` | yes | | | `energy_carrier_guid` | `str` | yes | | | `demand_sale_price` | `float`, optional | no | | | `stages` | list of `UUID` | yes | | | `demand_profile_id` | `int` | yes | | | `demand_scaling_factor` | `float`, optional | no | | | `demand_sale_price_profile_id` | `int`, optional | no | | | `demand_sale_price_scaling_factor` | `float`, optional | no | | | `energy_demand_user_saved_metadata_guid` | `str`, optional | no | | | `energy_demand_user_saved_metadata_name` | `str`, optional | no | | | `energy_demand_user_saved_metadata_reference_area` | `float`, optional | no | | | `scaling_factor` | `float`, optional | no | | | `energy_demand_metadata_guid` | `str`, optional | no | | | `energy_demand_metadata_name` | `str`, optional | no | | | `energy_demand_metadata_db_organization` | `str`, optional | no | | | `energy_demand_metadata_type` | [`EnergyDemandMetadataType`](#model-EnergyDemandMetadataType), optional | no | | | `energy_demand_metadata_building_type` | [`EnergyDemandMetadataBuildingType`](#model-EnergyDemandMetadataBuildingType), optional | no | | | `energy_demand_metadata_building_age` | [`EnergyDemandMetadataBuildingAge`](#model-EnergyDemandMetadataBuildingAge), optional | no | | | `energy_demand_metadata_option` | [`EnergyDemandMetadataOption`](#model-EnergyDemandMetadataOption), optional | no | | | `energy_demand_metadata_referenced_area_m2` | `float`, optional | no | | | `energy_demand_metadata_specific_energy_demand_value_k_wh_m2` | `float`, optional | no | | | `energy_demand_metadata_total_annual_demand` | `float`, optional | no | | | `multiplication_factor_preview` | `int`, optional | no | | | `multiplication_factor` | `int`, optional | no | | | `reverse` | `bool` | yes | | ## HubSolarOnSiteResourceResponseDto { #model-HubSolarOnSiteResourceResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_name` | `str`, optional | no | | | `hub_guid` | `str`, optional | no | | | `available_solar_collector_area` | `float`, optional | no | | | `available_resource_type` | `str`, optional | no | | | `technology_dimensioning_std_value` | `float`, optional | no | | ## HubSolarOnSiteResourceResponseDtoV2 { #model-HubSolarOnSiteResourceResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_name` | `str` | yes | | | `hub_guid` | `str` | yes | | | `available_solar_collector_area` | `float` | yes | | | `available_resource_type` | [`AvailableResourceType`](#model-AvailableResourceType) | yes | | ## ImpexHubRequestDto { #model-ImpexHubRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | | ## ImpexHubResponseDto { #model-ImpexHubResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | | | `hub_name` | `str` | yes | | | `hub_updated` | `AwareDatetime` | yes | | | `hub_created` | `AwareDatetime` | yes | | | `impex_guid` | `str`, optional | no | | ## ImportExportRequestDtoV2 { #model-ImportExportRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_price_ch_fk_wh` | `float`, optional | no | | | `max_capacity_kw` | `float`, optional | no | | | `total_annual_energy_available_k_wh_a` | `float`, optional | no | | | `capacity_price_ch_fk_w_year` | `float`, optional | no | | | `name` | `str` | yes | | | `hourly_energy_price_profile_id` | `int`, optional | no | | | `capacity_price_ch_fk_w_month` | `float`, optional | no | | | `fixed_om_price_chf_year` | `float`, optional | no | | | `co2_intensity_kg_co2k_wh_co2_compensation_kg_co2k_wh` | `float`, optional | no | | | `dynamic_co2_profile_id` | `int`, optional | no | | | `maximum_hourly_energy_available_profile_id` | `int`, optional | no | | | `energy_carrier_guid` | `str` | yes | | | `type` | [`Type1`](#model-Type1) | yes | | | `hubs` | list of [`ImpexHubRequestDto`](#model-ImpexHubRequestDto) | yes | | | `product` | `str`, optional | no | | | `year` | `int`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `suggested` | `bool`, optional | no | | | `price_components` | list of [`AdvancedPriceComponentRequestDtoV2`](#model-AdvancedPriceComponentRequestDtoV2), optional | no | | | `time_of_uses` | list of [`TimeOfUseRequestDto`](#model-TimeOfUseRequestDto), optional | no | | | `stages` | list of `UUID` | yes | | ## ImportExportResponseDtoV2 { #model-ImportExportResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_price_ch_fk_wh` | `float`, optional | no | | | `max_capacity_kw` | `float`, optional | no | | | `total_annual_energy_available_k_wh_a` | `float`, optional | no | | | `capacity_price_ch_fk_w_year` | `float`, optional | no | | | `name` | `str` | yes | | | `hourly_energy_price_profile_id` | `int`, optional | no | | | `capacity_price_ch_fk_w_month` | `float`, optional | no | | | `fixed_om_price_chf_year` | `float`, optional | no | | | `co2_intensity_kg_co2k_wh_co2_compensation_kg_co2k_wh` | `float`, optional | no | | | `dynamic_co2_profile_id` | `int`, optional | no | | | `maximum_hourly_energy_available_profile_id` | `int`, optional | no | | | `energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto) | yes | | | `type` | `str` | yes | | | `hubs` | list of [`ImpexHubResponseDto`](#model-ImpexHubResponseDto) | yes | | | `guid` | `str`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `price_components` | list of [`AdvancedPriceComponentResponseDtoV2`](#model-AdvancedPriceComponentResponseDtoV2) | yes | | | `time_of_uses` | list of [`TimeOfUseResponseDto`](#model-TimeOfUseResponseDto) | yes | | | `product` | `str`, optional | no | | | `year` | `int`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `suggested` | `bool`, optional | no | | | `stages` | list of `UUID` | yes | | ## IrradianceProfileType { #model-IrradianceProfileType } | Member | Value | | --- | --- | | `IrradianceProfileType.generated` | `'GENERATED'` | | `IrradianceProfileType.uploaded` | `'UPLOADED'` | | `IrradianceProfileType.saved` | `'SAVED'` | ## IrradianceProfileType1 { #model-IrradianceProfileType1 } | Member | Value | | --- | --- | | `IrradianceProfileType1.generated` | `'GENERATED'` | | `IrradianceProfileType1.uploaded` | `'UPLOADED'` | | `IrradianceProfileType1.saved` | `'SAVED'` | | `IrradianceProfileType1.none_type_none` | `None` | ## PriceCategory { #model-PriceCategory } | Member | Value | | --- | --- | | `PriceCategory.energy_delivery` | `'ENERGY_DELIVERY'` | | `PriceCategory.network_use` | `'NETWORK_USE'` | | `PriceCategory.taxes` | `'TAXES'` | | `PriceCategory.refunds_and_rebates` | `'REFUNDS_AND_REBATES'` | | `PriceCategory.total` | `'TOTAL'` | ## PriceCategoryId { #model-PriceCategoryId } | Member | Value | | --- | --- | | `PriceCategoryId.energy_delivery` | `'ENERGY_DELIVERY'` | | `PriceCategoryId.network_use` | `'NETWORK_USE'` | | `PriceCategoryId.taxes` | `'TAXES'` | | `PriceCategoryId.refunds_and_rebates` | `'REFUNDS_AND_REBATES'` | | `PriceCategoryId.total` | `'TOTAL'` | | `PriceCategoryId.none_type_none` | `None` | ## PriceDimension { #model-PriceDimension } | Member | Value | | --- | --- | | `PriceDimension.energy_price_chf_kwh` | `'ENERGY_PRICE_CHF_KWH'` | | `PriceDimension.capacity_price_chf_kw_month` | `'CAPACITY_PRICE_CHF_KW_MONTH'` | | `PriceDimension.capacity_price_chf_kw_year` | `'CAPACITY_PRICE_CHF_KW_YEAR'` | | `PriceDimension.fixed_om_price_chf_year` | `'FIXED_OM_PRICE_CHF_YEAR'` | ## PriceDimensionId { #model-PriceDimensionId } | Member | Value | | --- | --- | | `PriceDimensionId.energy_price_chf_kwh` | `'ENERGY_PRICE_CHF_KWH'` | | `PriceDimensionId.capacity_price_chf_kw_month` | `'CAPACITY_PRICE_CHF_KW_MONTH'` | | `PriceDimensionId.capacity_price_chf_kw_year` | `'CAPACITY_PRICE_CHF_KW_YEAR'` | | `PriceDimensionId.fixed_om_price_chf_year` | `'FIXED_OM_PRICE_CHF_YEAR'` | | `PriceDimensionId.none_type_none` | `None` | ## ProfileDetailsResponseDto { #model-ProfileDetailsResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | `int`, optional | no | | | `name` | `str` | yes | | | `values` | list of [`ProfilePeriodValueDto`](#model-ProfilePeriodValueDto) | yes | | ## ProfileJsonRequestDto { #model-ProfileJsonRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `values` | list of [`ProfilePeriodValueDto`](#model-ProfilePeriodValueDto) | yes | | ## ProfilePeriodValueDto { #model-ProfilePeriodValueDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `period` | `int` | yes | | | `demand_value` | `float` | yes | | ## ProfileResponseDto { #model-ProfileResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | `int`, optional | no | | | `name` | `str`, optional | no | | ## SolarOnSiteResourceListResponseDto { #model-SolarOnSiteResourceListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `solar_resources` | list of [`SolarOnSiteResourceResponseDto`](#model-SolarOnSiteResourceResponseDto), optional | no | | ## SolarOnSiteResourceRequestDtoV2 { #model-SolarOnSiteResourceRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `energy_carrier_guid` | `str` | yes | | | `hubs` | list of [`SolarOnSiteResourcesHubRequestDtoV2`](#model-SolarOnSiteResourcesHubRequestDtoV2) | yes | | | `profile_id` | `int` | yes | | | `stages` | list of `UUID` | yes | | ## SolarOnSiteResourceResponseDto { #model-SolarOnSiteResourceResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `solar_resource_guid` | `str`, optional | no | | | `energy_carrier_guid` | `str`, optional | no | | | `energy_carrier_name` | `str`, optional | no | | | `hubs` | list of [`HubSolarOnSiteResourceResponseDto`](#model-HubSolarOnSiteResourceResponseDto), optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `irradiance_profile_type` | [`IrradianceProfileType1`](#model-IrradianceProfileType1), optional | no | | | `solar_resource_metadata_name` | `str`, optional | no | | | `solar_resource_metadata_db_organization` | `str`, optional | no | | | `solar_resource_metadata_guid` | `str`, optional | no | | | `solar_resource_metadata_location` | `str`, optional | no | | | `solar_resource_metadata_type` | `str`, optional | no | | | `solar_resource_metadata_slope` | `float`, optional | no | | | `solar_resource_metadata_orientation` | `str`, optional | no | | ## SolarOnSiteResourceResponseDtoV2 { #model-SolarOnSiteResourceResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `solar_resource_guid` | `str`, optional | no | | | `energy_carrier_guid` | `str` | yes | | | `energy_carrier_name` | `str` | yes | | | `hubs` | list of [`HubSolarOnSiteResourceResponseDtoV2`](#model-HubSolarOnSiteResourceResponseDtoV2) | yes | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `irradiance_profile_type` | [`IrradianceProfileType`](#model-IrradianceProfileType) | yes | | | `solar_resource_metadata_name` | `str`, optional | no | | | `solar_resource_metadata_db_organization` | `str`, optional | no | | | `solar_resource_metadata_guid` | `str`, optional | no | | | `solar_resource_metadata_location` | `str`, optional | no | | | `solar_resource_metadata_type` | `str`, optional | no | | | `solar_resource_metadata_slope` | `float`, optional | no | | | `solar_resource_metadata_orientation` | `str`, optional | no | | | `stages` | list of `UUID` | yes | | | `profile_id` | `int` | yes | | ## SolarOnSiteResourcesHubRequestDtoV2 { #model-SolarOnSiteResourcesHubRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hub_guid` | `str` | yes | | | `available_solar_collector_area` | `float` | yes | (> 0.0) | | `available_resource_type` | [`AvailableResourceType`](#model-AvailableResourceType) | yes | | ## SubType { #model-SubType } | Member | Value | | --- | --- | | `SubType.electricity` | `'ELECTRICITY'` | | `SubType.electricity_renewable` | `'ELECTRICITY_RENEWABLE'` | | `SubType.wood_chips` | `'WOOD_CHIPS'` | | `SubType.wood_pellets` | `'WOOD_PELLETS'` | | `SubType.coal` | `'COAL'` | | `SubType.oil` | `'OIL'` | | `SubType.gas` | `'GAS'` | | `SubType.biogas` | `'BIOGAS'` | | `SubType.hydrogen` | `'HYDROGEN'` | | `SubType.hydrogen_pressurized` | `'HYDROGEN_PRESSURIZED'` | | `SubType.cooling_1` | `'COOLING_1'` | | `SubType.cooling_2` | `'COOLING_2'` | | `SubType.cooling_3` | `'COOLING_3'` | | `SubType.cooling_4` | `'COOLING_4'` | | `SubType.ice` | `'ICE'` | | `SubType.heat_1` | `'HEAT_1'` | | `SubType.heat_2` | `'HEAT_2'` | | `SubType.heat_3` | `'HEAT_3'` | | `SubType.heat_4` | `'HEAT_4'` | | `SubType.heat_5` | `'HEAT_5'` | | `SubType.heat_6` | `'HEAT_6'` | | `SubType.heat_7` | `'HEAT_7'` | | `SubType.heat_8` | `'HEAT_8'` | | `SubType.heat_9` | `'HEAT_9'` | | `SubType.heat_ambient` | `'HEAT_AMBIENT'` | | `SubType.steam_low_pressure` | `'STEAM_LOW_PRESSURE'` | | `SubType.solar_roof` | `'SOLAR_ROOF'` | | `SubType.solar_facade` | `'SOLAR_FACADE'` | | `SubType.solar_parapet` | `'SOLAR_PARAPET'` | | `SubType.wind` | `'WIND'` | | `SubType.hydro` | `'HYDRO'` | | `SubType.biomass` | `'BIOMASS'` | | `SubType.geothermal` | `'GEOTHERMAL'` | | `SubType.tidal` | `'TIDAL'` | | `SubType.process_waste_heat` | `'PROCESS_WASTE_HEAT'` | | `SubType.custom` | `'CUSTOM'` | ## TimeOfUseRequestDto { #model-TimeOfUseRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str`, optional | no | | | `months` | list of `str`, optional | no | | | `days` | list of `str`, optional | no | | | `start_time` | `str`, optional | no | | | `end_time` | `str`, optional | no | | ## TimeOfUseResponseDto { #model-TimeOfUseResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str`, optional | no | | | `months` | list of `str`, optional | no | | | `days` | list of `str`, optional | no | | | `start_time` | `str`, optional | no | | | `end_time` | `str`, optional | no | | ## Type1 { #model-Type1 } | Member | Value | | --- | --- | | `Type1.import_` | `'IMPORT'` | | `Type1.export` | `'EXPORT'` | ## Type2 { #model-Type2 } | Member | Value | | --- | --- | | `Type2.time_of_use` | `'TIME_OF_USE'` | | `Type2.fixed` | `'FIXED'` | | `Type2.none_type_none` | `None` | --- # Technology and network models ## AdvancedCostComponentRequestDto { #model-AdvancedCostComponentRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `value` | `float`, optional | no | | | `category` | `str`, optional | no | | | `lifetime` | `float`, optional | no | (≥ 0.0) | | `interest_rate` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `length` | `float`, optional | no | | | `complexity_factor` | `float`, optional | no | | | `data_points` | `float`, optional | no | | | `number_of_pumps` | `float`, optional | no | | ## AdvancedCostComponentResponseDto { #model-AdvancedCostComponentResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `value` | `float`, optional | no | | | `category` | `str`, optional | no | | | `lifetime` | `float`, optional | no | (≥ 0.0) | | `interest_rate` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `length` | `float`, optional | no | | | `complexity_factor` | `float`, optional | no | | | `data_points` | `float`, optional | no | | | `number_of_pumps` | `float`, optional | no | | | `guid` | `str`, optional | no | | | `category_id` | `str`, optional | no | | ## ConversionCarrierRequestDtoV2 { #model-ConversionCarrierRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_carrier_guid` | `str` | yes | | | `fixed_input_share` | `float` | yes | (≥ 0.0) | | `output_efficiency` | `float` | yes | (≥ 0.0) | | `custom_input_share_activated` | `bool`, optional | no | | | `custom_output_efficiency_activated` | `bool`, optional | no | | | `input_share_profile_id` | `int`, optional | no | | | `output_efficiency_profile_id` | `int`, optional | no | | | `custom_seasonality_values` | list of [`CustomSeasonalityRequestDto`](#model-CustomSeasonalityRequestDto), optional | no | | | `type` | [`Type`](#model-Type) | yes | | | `primary` | `bool` | yes | | ## ConversionTechnologyDetailResponseDtoV2 { #model-ConversionTechnologyDetailResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixed_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_om_cost_chf` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost_percent` | `float`, optional | no | | | `variable_om_cost_year` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_emitted_co2` | `float`, optional | no | (≥ 0.0) | | `variable_captured_co2` | `float`, optional | no | (≥ 0.0) | | `fixed_replacement_cost` | `float`, optional | no | (≥ 0.0) | | `variable_replacement_cost_percent` | `float`, optional | no | (≥ 0.0) | | `variable_replacement_cost_chf` | `float`, optional | no | (≥ 0.0) | | `fixed_salvage_value` | `float`, optional | no | (≥ 0.0) | | `variable_salvage_value_percent` | `float`, optional | no | (≥ 0.0) | | `variable_salvage_value_chf` | `float`, optional | no | (≥ 0.0) | | `must_be_installed_in_hubs` | [`MustBeInstalledInHubs2`](#model-MustBeInstalledInHubs2) | yes | | | `conversion_technology_guid` | `str`, optional | no | | | `process_name` | `str` | yes | | | `exchange_currency` | `str`, optional | no | | | `exchange_rate` | `float`, optional | no | | | `variable_investment_cost` | `float`, optional | no | | | `lifetime` | `float` | yes | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto) | yes | | | `technology_modes` | list of [`TechnologyModeResponseDtoV2`](#model-TechnologyModeResponseDtoV2), optional | no | | | `category` | `str`, optional | no | | | `technology_category` | `str`, optional | no | | | `mutually_exclusive_group` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `virtual` | `bool` | yes | | | `technology_optional` | `bool`, optional | no | | | `part_of_technology_package` | `bool`, optional | no | | | `technology_capacity` | `str`, optional | no | | | `cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto), optional | no | | | `comes_from_db` | `str`, optional | no | | | `stages` | list of `UUID` | yes | | ## ConversionTechnologyListResponseDtoV2 { #model-ConversionTechnologyListResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `conversion_technologies` | list of [`ConversionTechnologyResponseDtoV2`](#model-ConversionTechnologyResponseDtoV2), optional | no | | ## ConversionTechnologyRequestDtoV2 { #model-ConversionTechnologyRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixed_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_om_cost_chf` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost_percent` | `float`, optional | no | | | `variable_om_cost_year` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_emitted_co2` | `float`, optional | no | (≥ 0.0) | | `variable_captured_co2` | `float`, optional | no | (≥ 0.0) | | `fixed_replacement_cost` | `float`, optional | no | (≥ 0.0) | | `variable_replacement_cost_percent` | `float`, optional | no | (≥ 0.0) | | `variable_replacement_cost_chf` | `float`, optional | no | (≥ 0.0) | | `fixed_salvage_value` | `float`, optional | no | (≥ 0.0) | | `variable_salvage_value_percent` | `float`, optional | no | (≥ 0.0) | | `variable_salvage_value_chf` | `float`, optional | no | (≥ 0.0) | | `must_be_installed_in_hubs` | [`MustBeInstalledInHubs`](#model-MustBeInstalledInHubs) | yes | | | `process_name` | `str` | yes | (max length 100, min length 0) | | `variable_investment_cost` | `float`, optional | no | (≥ 0.0) | | `lifetime` | `int` | yes | | | `hub_guids` | list of `str` | yes | | | `conversion_technology_modes` | list of [`TechnologyModeRequestDtoV2`](#model-TechnologyModeRequestDtoV2) | yes | (max length 3, min length 1) | | `virtual` | `bool` | yes | | | `cost_components` | list of [`AdvancedCostComponentRequestDto`](#model-AdvancedCostComponentRequestDto), optional | no | | | `suggested` | `bool`, optional | no | | | `technology_category` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `comes_from_db` | `str`, optional | no | | | `exchange_currency` | `str` | yes | (max length 3, min length 0) | | `exchange_rate` | `float` | yes | (≥ 0.0) | | `stages` | list of `UUID` | yes | | ## ConversionTechnologyResponseDtoV2 { #model-ConversionTechnologyResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `conversion_technology_guid` | `str`, optional | no | | | `process_name` | `str`, optional | no | | | `lifetime` | `int`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `conversion_technology_modes` | list of [`TechnologyModeResponseDtoV2`](#model-TechnologyModeResponseDtoV2), optional | no | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto), optional | no | | | `virtual` | `bool`, optional | no | | | `must_be_installed_in_hubs` | [`MustBeInstalledInHubs1`](#model-MustBeInstalledInHubs1), optional | no | | | `stages` | list of `UUID`, optional | no | | ## CustomSeasonalityRequestDto { #model-CustomSeasonalityRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `month` | [`Month`](common.md#model-Month), optional | no | | | `value` | `float`, optional | no | | ## EnergyCarrierResponseDtoV2 { #model-EnergyCarrierResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `energy_carrier_guid` | `str`, optional | no | | | `type_key` | `str`, optional | no | | | `type_display_name` | `str`, optional | no | | | `subtype_key` | `str`, optional | no | | | `subtype_display_name` | `str`, optional | no | | | `energy_carrier_name` | `str`, optional | no | | | `color_hex_code` | `str`, optional | no | | | `output_efficiency` | `float`, optional | no | | | `fixed_input_share` | `float`, optional | no | | | `custom_output_efficiency_activated` | `bool`, optional | no | | | `custom_input_share_activated` | `bool`, optional | no | | | `custom_seasonality_values` | list of [`CustomSeasonalityResponseDto`](common.md#model-CustomSeasonalityResponseDto), optional | no | | | `input_share_profile_id` | `int`, optional | no | | | `output_efficiency_profile_id` | `int`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `primary` | `bool`, optional | no | | ## GuidNameDto { #model-GuidNameDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `guid` | `str` | yes | | | `name` | `str` | yes | | ## IntraHubNetworkLinkListResponseDto { #model-IntraHubNetworkLinkListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `intra_hub_network_links` | list of [`IntraHubNetworkLinkResponseDto`](#model-IntraHubNetworkLinkResponseDto), optional | no | | ## IntraHubNetworkLinkRequestDto { #model-IntraHubNetworkLinkRequestDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `network_loss` | `float`, optional | no | | | `fixed_embodied_co2` | `float`, optional | no | | | `input_energy_carrier_guid` | `str` | yes | | | `output_energy_carrier_guid` | `str` | yes | | | `hub_guids` | list of `str` | yes | | | `advanced_cost_components` | list of [`AdvancedCostComponentRequestDto`](#model-AdvancedCostComponentRequestDto), optional | no | | | `stages` | list of `UUID` | yes | | ## IntraHubNetworkLinkResponseDto { #model-IntraHubNetworkLinkResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `intra_hub_network_link_guid` | `str`, optional | no | | | `name` | `str` | yes | | | `network_loss` | `float`, optional | no | | | `fixed_embodied_co2` | `float`, optional | no | | | `input_energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto) | yes | | | `output_energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto) | yes | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto) | yes | | | `advanced_cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto) | yes | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `stages` | list of `UUID` | yes | | ## LocalTime { #model-LocalTime } | Field | Type | Required | Description | | --- | --- | --- | --- | | `hour` | `int`, optional | no | | | `minute` | `int`, optional | no | | | `second` | `int`, optional | no | | | `nano` | `int`, optional | no | | ## MustBeInstalled { #model-MustBeInstalled } | Member | Value | | --- | --- | | `MustBeInstalled.can_be_installed` | `'canBeInstalled'` | | `MustBeInstalled.must_be_installed` | `'mustBeInstalled'` | | `MustBeInstalled.must_be_installed_in_at_least_one_hub` | `'mustBeInstalledInAtLeastOneHub'` | ## MustBeInstalledInHubs { #model-MustBeInstalledInHubs } | Member | Value | | --- | --- | | `MustBeInstalledInHubs.can_be_installed` | `'canBeInstalled'` | | `MustBeInstalledInHubs.must_be_installed` | `'mustBeInstalled'` | | `MustBeInstalledInHubs.must_be_installed_in_at_least_one_hub` | `'mustBeInstalledInAtLeastOneHub'` | ## MustBeInstalledInHubs1 { #model-MustBeInstalledInHubs1 } | Member | Value | | --- | --- | | `MustBeInstalledInHubs1.can_be_installed` | `'canBeInstalled'` | | `MustBeInstalledInHubs1.must_be_installed` | `'mustBeInstalled'` | | `MustBeInstalledInHubs1.must_be_installed_in_at_least_one_hub` | `'mustBeInstalledInAtLeastOneHub'` | | `MustBeInstalledInHubs1.none_type_none` | `None` | ## MustBeInstalledInHubs2 { #model-MustBeInstalledInHubs2 } | Member | Value | | --- | --- | | `MustBeInstalledInHubs2.can_be_installed` | `'canBeInstalled'` | | `MustBeInstalledInHubs2.must_be_installed` | `'mustBeInstalled'` | | `MustBeInstalledInHubs2.must_be_installed_in_at_least_one_hub` | `'mustBeInstalledInAtLeastOneHub'` | ## NetworkLinkListResponseDto { #model-NetworkLinkListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `network_links` | list of [`NetworkLinkResponseDto`](#model-NetworkLinkResponseDto), optional | no | | ## NetworkLinkRequestDtoV2 { #model-NetworkLinkRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `installed_capacity` | `float`, optional | no | (≥ 0.0) | | `maximum_capacity` | `float`, optional | no | (≥ 0.0) | | `name` | `str` | yes | | | `length` | `float` | yes | (≥ 0.0) | | `technology_capacity` | [`TechnologyCapacity`](#model-TechnologyCapacity) | yes | | | `uni_directional_flow` | `bool` | yes | | | `must_be_installed` | `bool` | yes | | | `node1_guid` | `str` | yes | | | `node2_guid` | `str` | yes | | | `network_technology_guid` | `str` | yes | | | `cost_components` | list of [`AdvancedCostComponentRequestDto`](#model-AdvancedCostComponentRequestDto), optional | no | | | `minimum_capacity` | `float`, optional | no | (≥ 0.0) | | `network_loss` | `float` | yes | (≥ 0.0) | | `network_loss_profile_id` | `int`, optional | no | | ## NetworkLinkResponseDto { #model-NetworkLinkResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `network_link_guid` | `str`, optional | no | | | `length` | `float`, optional | no | | | `technology_capacity` | [`TechnologyCapacity2`](#model-TechnologyCapacity2), optional | no | | | `installed_capacity` | `float`, optional | no | | | `uni_directional_flow` | `bool`, optional | no | | | `must_be_installed` | `bool`, optional | no | | | `node1_guid` | `str`, optional | no | | | `node1_name` | `str`, optional | no | | | `node2_guid` | `str`, optional | no | | | `node2_name` | `str`, optional | no | | | `network_technology_name` | `str`, optional | no | | | `network_technology_guid` | `str`, optional | no | | | `cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto), optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | ## NetworkLinkResponseDtoV2 { #model-NetworkLinkResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `installed_capacity` | `float`, optional | no | (≥ 0.0) | | `maximum_capacity` | `float`, optional | no | (≥ 0.0) | | `network_link_guid` | `str`, optional | no | | | `name` | `str` | yes | | | `length` | `float` | yes | | | `technology_capacity` | [`TechnologyCapacity`](#model-TechnologyCapacity) | yes | | | `uni_directional_flow` | `bool` | yes | | | `must_be_installed` | `bool` | yes | | | `node1_guid` | `str` | yes | | | `node1_name` | `str` | yes | | | `node2_guid` | `str` | yes | | | `node2_name` | `str` | yes | | | `network_technology_name` | `str` | yes | | | `network_technology_guid` | `str` | yes | | | `cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto) | yes | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `minimum_capacity` | `float`, optional | no | | | `network_loss` | `float` | yes | | | `network_loss_profile_id` | `int`, optional | no | | ## NetworkTechnologyListResponseDto { #model-NetworkTechnologyListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `network_technologies` | list of [`NetworkTechnologyResponseDto`](#model-NetworkTechnologyResponseDto), optional | no | | ## NetworkTechnologyListResponseDtoV2 { #model-NetworkTechnologyListResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `network_technologies` | list of [`NetworkTechnologyResponseDtoV2`](#model-NetworkTechnologyResponseDtoV2), optional | no | | ## NetworkTechnologyRequestDtoV2 { #model-NetworkTechnologyRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixed_investment_cost` | `float`, optional | no | (≥ 0.0) | | `variable_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_om_cost_chf` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost_percent` | `float`, optional | no | | | `variable_om_cost_year` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost_ch_fk_wh` | `float`, optional | no | (≥ 0.0) | | `fixed_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `fixed_replacement_cost` | `float`, optional | no | | | `variable_replacement_cost_percent` | `float`, optional | no | | | `variable_replacement_cost_chf` | `float`, optional | no | | | `fixed_salvage_value` | `float`, optional | no | | | `variable_salvage_value_percent` | `float`, optional | no | | | `variable_salvage_value_chf` | `float`, optional | no | | | `network_technology_name` | `str` | yes | (max length 100, min length 0) | | `lifetime` | `int` | yes | | | `energy_carrier_guid` | `str` | yes | | | `cost_components` | list of [`AdvancedCostComponentRequestDto`](#model-AdvancedCostComponentRequestDto), optional | no | | | `suggested` | `bool`, optional | no | | | `technology_category` | `str`, optional | no | | | `network_size` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `comes_from_db` | `str`, optional | no | | | `exchange_currency` | `str`, optional | no | (max length 3, min length 0) | | `exchange_rate` | `float`, optional | no | (≥ 0.0) | | `stages` | list of `UUID` | yes | | ## NetworkTechnologyResponseDto { #model-NetworkTechnologyResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `network_technology_guid` | `str`, optional | no | | | `network_technology_name` | `str`, optional | no | | | `network_loss` | `float`, optional | no | | | `fixed_investment_cost` | `float`, optional | no | | | `variable_investment_cost` | `float`, optional | no | | | `variable_om_cost_year` | `float`, optional | no | | | `fixed_om_cost_chf` | `float`, optional | no | | | `fixed_om_cost_percent` | `float`, optional | no | | | `lifetime` | `float`, optional | no | | | `maximum_capacity` | `float`, optional | no | | | `minimum_capacity` | `float`, optional | no | | | `variable_embodied_co2` | `float`, optional | no | | | `fixed_embodied_co2` | `float`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto), optional | no | | | `category` | `str`, optional | no | | | `technology_category` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `network_size` | `str`, optional | no | | | `comes_from_db` | `str`, optional | no | | | `cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto), optional | no | | ## NetworkTechnologyResponseDtoV2 { #model-NetworkTechnologyResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `fixed_investment_cost` | `float`, optional | no | (≥ 0.0) | | `variable_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_om_cost_chf` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost_percent` | `float`, optional | no | | | `variable_om_cost_year` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost_ch_fk_wh` | `float`, optional | no | (≥ 0.0) | | `fixed_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `fixed_replacement_cost` | `float`, optional | no | | | `variable_replacement_cost_percent` | `float` | yes | | | `variable_replacement_cost_chf` | `float`, optional | no | | | `fixed_salvage_value` | `float`, optional | no | | | `variable_salvage_value_percent` | `float` | yes | | | `variable_salvage_value_chf` | `float`, optional | no | | | `network_technology_guid` | `str`, optional | no | | | `network_technology_name` | `str` | yes | | | `exchange_currency` | `str` | yes | | | `exchange_rate` | `float` | yes | | | `lifetime` | `int` | yes | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto) | yes | | | `category` | `str` | yes | | | `technology_category` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `network_size` | `str`, optional | no | | | `comes_from_db` | `str`, optional | no | | | `cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto) | yes | | | `stages` | list of `UUID` | yes | | ## SeasonalOperation { #model-SeasonalOperation } | Member | Value | | --- | --- | | `SeasonalOperation.all_seasons` | `'ALL_SEASONS'` | | `SeasonalOperation.winter` | `'WINTER'` | | `SeasonalOperation.non_winter` | `'NON_WINTER'` | | `SeasonalOperation.summer` | `'SUMMER'` | | `SeasonalOperation.non_summer` | `'NON_SUMMER'` | ## StorageTechnologyDetailResponseDtoV2 { #model-StorageTechnologyDetailResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `variable_om_cost_percent` | `float`, optional | no | | | `variable_om_energy_flow_cost` | `float`, optional | no | (≥ 0.0) | | `capacity` | `float`, optional | no | (≥ 0.0) | | `maximum_capacity` | `float`, optional | no | (≥ 0.0) | | `minimum_capacity` | `float`, optional | no | (≥ 0.0) | | `fixed_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost` | `float`, optional | no | (≥ 0.0) | | `maximum_charging_rate` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `maximum_discharging_rate` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `variable_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `fixed_replacement_cost` | `float`, optional | no | | | `variable_replacement_cost_percent` | `float` | yes | | | `variable_replacement_cost_chf` | `float`, optional | no | | | `fixed_salvage_value` | `float`, optional | no | | | `variable_salvage_value_percent` | `float` | yes | | | `variable_salvage_value_chf` | `float`, optional | no | | | `must_be_installed` | `str` | yes | | | `storage_technology_guid` | `str`, optional | no | | | `storage_name` | `str` | yes | | | `exchange_currency` | `str` | yes | | | `exchange_rate` | `float` | yes | | | `variable_investment_cost` | `float`, optional | no | | | `fixed_om_cost_chf` | `float`, optional | no | | | `lifetime` | `int` | yes | | | `standby_loss` | `float`, optional | no | | | `stand_by_loss_profile_id` | `int`, optional | no | | | `minimum_soc` | `float`, optional | no | | | `storage_charging_efficiency` | `float` | yes | | | `storage_discharging_efficiency` | `float` | yes | | | `technology_capacity` | `str` | yes | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `storage_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto) | yes | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto) | yes | | | `category` | `str` | yes | | | `technology_category` | `str`, optional | no | | | `mutually_exclusive_group` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `technology_optional` | `bool`, optional | no | | | `cost_components` | list of [`AdvancedCostComponentResponseDto`](#model-AdvancedCostComponentResponseDto) | yes | | | `comes_from_db` | `str`, optional | no | | | `stages` | list of `UUID` | yes | | | `ev_plug_in_time` | [`LocalTime`](#model-LocalTime), optional | no | | | `ev_plug_out_time` | [`LocalTime`](#model-LocalTime), optional | no | | | `ev_plug_in_duration_hours` | `float`, optional | no | | | `driving_distance_kms` | `float`, optional | no | | | `ev_soc_start_percent` | `float`, optional | no | | | `ev_battery_size_k_wh` | `float`, optional | no | | | `maximum_soc_percent` | `float`, optional | no | | | `ev_average_k_wh_per_km` | `float`, optional | no | | | `ev_plug_in_power_kw` | `float`, optional | no | | | `is_ev_battery` | `bool`, optional | no | | | `type_of_charging` | [`TypeOfCharging`](#model-TypeOfCharging), optional | no | | ## StorageTechnologyListResponseDto { #model-StorageTechnologyListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `storage_technologies` | list of [`StorageTechnologyResponseDto`](#model-StorageTechnologyResponseDto), optional | no | | ## StorageTechnologyListResponseDtoV2 { #model-StorageTechnologyListResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `storage_technologies` | list of [`StorageTechnologyResponseDtoV2`](#model-StorageTechnologyResponseDtoV2), optional | no | | ## StorageTechnologyRequestDtoV2 { #model-StorageTechnologyRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `variable_om_cost_percent` | `float`, optional | no | | | `variable_om_energy_flow_cost` | `float`, optional | no | (≥ 0.0) | | `capacity` | `float`, optional | no | (≥ 0.0) | | `maximum_capacity` | `float`, optional | no | (≥ 0.0) | | `minimum_capacity` | `float`, optional | no | (≥ 0.0) | | `fixed_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `variable_om_cost` | `float`, optional | no | (≥ 0.0) | | `maximum_charging_rate` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `maximum_discharging_rate` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `variable_embodied_co2` | `float`, optional | no | (≥ 0.0) | | `fixed_replacement_cost` | `float`, optional | no | | | `variable_replacement_cost_percent` | `float`, optional | no | | | `variable_replacement_cost_chf` | `float`, optional | no | | | `fixed_salvage_value` | `float`, optional | no | | | `variable_salvage_value_percent` | `float`, optional | no | | | `variable_salvage_value_chf` | `float`, optional | no | | | `must_be_installed` | `str` | yes | | | `storage_name` | `str` | yes | (max length 100, min length 0) | | `variable_investment_cost` | `float`, optional | no | (≥ 0.0) | | `fixed_om_cost_chf` | `float`, optional | no | (≥ 0.0) | | `lifetime` | `int` | yes | | | `standby_loss` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `stand_by_loss_profile_id` | `int`, optional | no | | | `minimum_soc` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `hub_guids` | list of `str` | yes | | | `energy_carrier_guid` | `str` | yes | | | `storage_charging_efficiency` | `float` | yes | (≥ 0.0, ≤ 100.0) | | `storage_discharging_efficiency` | `float` | yes | (≥ 0.0, ≤ 100.0) | | `technology_capacity` | `str` | yes | | | `cost_components` | list of [`AdvancedCostComponentRequestDto`](#model-AdvancedCostComponentRequestDto), optional | no | | | `suggested` | `bool`, optional | no | | | `technology_category` | `str`, optional | no | | | `notes` | `str`, optional | no | | | `source` | `str`, optional | no | | | `comes_from_db` | `str`, optional | no | | | `exchange_currency` | `str`, optional | no | (max length 3, min length 0) | | `exchange_rate` | `float`, optional | no | (≥ 0.0) | | `stages` | list of `UUID` | yes | | | `ev_plug_in_time` | [`LocalTime`](#model-LocalTime), optional | no | | | `ev_plug_out_time` | [`LocalTime`](#model-LocalTime), optional | no | | | `ev_plug_in_duration_hours` | `float`, optional | no | | | `driving_distance_kms` | `float`, optional | no | | | `ev_soc_start_percent` | `float`, optional | no | | | `ev_battery_size_k_wh` | `float`, optional | no | | | `maximum_soc_percent` | `float`, optional | no | | | `ev_average_k_wh_per_km` | `float`, optional | no | | | `ev_plug_in_power_kw` | `float`, optional | no | | | `is_ev_battery` | `bool`, optional | no | | | `type_of_charging` | [`TypeOfCharging`](#model-TypeOfCharging), optional | no | | ## StorageTechnologyResponseDto { #model-StorageTechnologyResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `storage_technology_guid` | `str`, optional | no | | | `storage_name` | `str`, optional | no | | | `lifetime` | `float`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto), optional | no | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto), optional | no | | ## StorageTechnologyResponseDtoV2 { #model-StorageTechnologyResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `storage_technology_guid` | `str`, optional | no | | | `storage_name` | `str`, optional | no | | | `lifetime` | `int`, optional | no | | | `created` | `AwareDatetime`, optional | no | | | `updated` | `AwareDatetime`, optional | no | | | `energy_carrier` | [`EnergyCarrierResponseDto`](common.md#model-EnergyCarrierResponseDto), optional | no | | | `hubs` | list of [`HubResponseDto`](common.md#model-HubResponseDto), optional | no | | | `stages` | list of `UUID`, optional | no | | | `stand_by_loss_profile_id` | `int`, optional | no | | ## TechnologyCapacity { #model-TechnologyCapacity } | Member | Value | | --- | --- | | `TechnologyCapacity.optimize` | `'optimize'` | | `TechnologyCapacity.specify` | `'specify'` | ## TechnologyCapacity2 { #model-TechnologyCapacity2 } | Member | Value | | --- | --- | | `TechnologyCapacity2.optimize` | `'optimize'` | | `TechnologyCapacity2.specify` | `'specify'` | | `TechnologyCapacity2.none_type_none` | `None` | ## TechnologyModeRequestDtoV2 { #model-TechnologyModeRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `capacity` | `float`, optional | no | (≥ 0.0) | | `minimum_annual_output` | `float`, optional | no | (≥ 0.0) | | `maximum_annual_output` | `float`, optional | no | (≥ 0.0) | | `curtailment_limitation` | `float`, optional | no | (≥ 0.0) | | `peak_power` | `float`, optional | no | | | `min_part_load` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `minimum_up_time` | `int`, optional | no | (≥ 1, ≤ 8760) | | `minimum_down_time` | `int`, optional | no | (≥ 1, ≤ 8760) | | `primary` | `bool`, optional | no | | | `seasonal_operation` | [`SeasonalOperation`](#model-SeasonalOperation) | yes | | | `allowed_operation_profile_id` | `int`, optional | no | | | `energy_carriers` | list of [`ConversionCarrierRequestDtoV2`](#model-ConversionCarrierRequestDtoV2) | yes | | | `maximum_capacity` | `float`, optional | no | (≥ 0.0) | | `minimum_capacity` | `float`, optional | no | (≥ 0.0) | | `simultaneous_operation` | `bool`, optional | no | | ## TechnologyModeResponseDtoV2 { #model-TechnologyModeResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `capacity` | `float`, optional | no | (≥ 0.0) | | `minimum_annual_output` | `float`, optional | no | (≥ 0.0) | | `maximum_annual_output` | `float`, optional | no | (≥ 0.0) | | `curtailment_limitation` | `float`, optional | no | (≥ 0.0) | | `peak_power` | `float`, optional | no | | | `min_part_load` | `float`, optional | no | (≥ 0.0, ≤ 100.0) | | `minimum_up_time` | `int`, optional | no | (≥ 1, ≤ 8760) | | `minimum_down_time` | `int`, optional | no | (≥ 1, ≤ 8760) | | `technology_mode_guid` | `str`, optional | no | | | `input_energy_carriers` | list of [`EnergyCarrierResponseDtoV2`](#model-EnergyCarrierResponseDtoV2), optional | no | | | `output_energy_carriers` | list of [`EnergyCarrierResponseDtoV2`](#model-EnergyCarrierResponseDtoV2), optional | no | | | `seasonal_operation_name` | `str`, optional | no | | | `seasonal_operation_value` | `str`, optional | no | | | `allowed_operation_profile_id` | `int`, optional | no | | | `primary` | `bool`, optional | no | | | `maximum_capacity` | `float`, optional | no | | | `minimum_capacity` | `float`, optional | no | | | `simultaneous_operation` | `bool`, optional | no | | ## TechnologyPackageListResponseDto { #model-TechnologyPackageListResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `technology_packages` | list of [`TechnologyPackageResponseDto`](#model-TechnologyPackageResponseDto), optional | no | | ## TechnologyPackageListResponseDtoV2 { #model-TechnologyPackageListResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `technology_packages` | list of [`TechnologyPackageResponseDtoV2`](#model-TechnologyPackageResponseDtoV2), optional | no | | ## TechnologyPackageRequestDtoV2 { #model-TechnologyPackageRequestDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `maximum_conversions` | `int`, optional | no | (≥ 1) | | `maximum_storages` | `int`, optional | no | (≥ 1) | | `must_be_installed` | [`MustBeInstalled`](#model-MustBeInstalled) | yes | | | `mutually_exclusive_group` | `str`, optional | no | | | `name` | `str` | yes | | | `conversion_technologies` | list of `str` | yes | | | `storage_technologies` | list of `str` | yes | | ## TechnologyPackageResponseDto { #model-TechnologyPackageResponseDto } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str`, optional | no | | | `guid` | `str`, optional | no | | | `conversion_technologies` | list of `str`, optional | no | | | `storage_technologies` | list of `str`, optional | no | | | `db_organization` | `str`, optional | no | | ## TechnologyPackageResponseDtoV2 { #model-TechnologyPackageResponseDtoV2 } | Field | Type | Required | Description | | --- | --- | --- | --- | | `maximum_conversions` | `int`, optional | no | (≥ 1) | | `maximum_storages` | `int`, optional | no | (≥ 1) | | `must_be_installed` | [`MustBeInstalled`](#model-MustBeInstalled) | yes | | | `mutually_exclusive_group` | `str`, optional | no | | | `name` | `str` | yes | | | `guid` | `str`, optional | no | | | `conversion_technologies` | list of [`GuidNameDto`](#model-GuidNameDto) | yes | | | `storage_technologies` | list of [`GuidNameDto`](#model-GuidNameDto) | yes | | ## Type { #model-Type } | Member | Value | | --- | --- | | `Type.input` | `'INPUT'` | | `Type.output` | `'OUTPUT'` | ## TypeOfCharging { #model-TypeOfCharging } | Member | Value | | --- | --- | | `TypeOfCharging.smart` | `'Smart'` | | `TypeOfCharging.dump` | `'Dump'` | | `TypeOfCharging.v2_g` | `'V2G'` | | `TypeOfCharging.none` | `'None'` | | `TypeOfCharging.none_type_none` | `None` | --- # Solver job and user models ## AwsRegion { #model-AwsRegion } | Member | Value | | --- | --- | | `AwsRegion.eu_north_1` | `'eu-north-1'` | | `AwsRegion.eu_central_2` | `'eu-central-2'` | ## BillingCycle { #model-BillingCycle } | Member | Value | | --- | --- | | `BillingCycle.monthly` | `'MONTHLY'` | | `BillingCycle.quarterly` | `'QUARTERLY'` | | `BillingCycle.annually` | `'ANNUALLY'` | ## GetOrganizationExt { #model-GetOrganizationExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `gis_on` | `bool`, optional | no | | | `sep_on` | `bool`, optional | no | | | `sep_buildings_limit` | `int`, optional | no | | | `execution_slots` | `int`, optional | no | | | `variable_billing` | `bool`, optional | no | | | `max_executions` | `int`, optional | no | | | `max_simultaneous_executions` | `int`, optional | no | | | `max_execution_time` | `int`, optional | no | | | `max_execution_time_week` | `int`, optional | no | | | `number_of_executions_left` | `int`, optional | no | | | `execution_time_week_left` | `int`, optional | no | | | `id` | `UUID4` | yes | | | `created` | `AwareDatetime` | yes | | | `updated` | `AwareDatetime` | yes | | | `sep_buildings_consumed` | `int`, optional | no | | ## GetPlanExt { #model-GetPlanExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `intra_hub_network` | `bool`, optional | no | | | `advanced_cost_components` | `bool`, optional | no | | | `unit_commitment` | `bool`, optional | no | | | `max_energy_carriers_per_hub` | `int`, optional | no | | | `max_energy_demands` | `int`, optional | no | | | `max_hubs` | `int`, optional | no | | | `max_stages` | `int`, optional | no | (≤ 8) | | `max_solar_resources` | `int`, optional | no | | | `max_other_resources` | `int`, optional | no | | | `max_imports` | `int`, optional | no | | | `max_exports` | `int`, optional | no | | | `max_conversion_techs` | `int`, optional | no | | | `max_conversion_modes` | `int`, optional | no | | | `max_storage_techs` | `int`, optional | no | | | `max_network_techs` | `int`, optional | no | | | `max_network_links` | `int`, optional | no | | | `max_executions` | `int`, optional | no | | | `max_simultaneous_executions` | `int`, optional | no | | | `max_execution_time` | `int`, optional | no | | | `max_execution_time_week` | `int`, optional | no | | | `max_execution_history` | `int`, optional | no | (≤ 500) | | `max_pareto_points` | `int`, optional | no | (≤ 9) | | `full_temporal_resolution` | `bool`, optional | no | | | `max_projects` | `int`, optional | no | | | `max_analyses` | `int`, optional | no | | | `max_scenarios` | `int`, optional | no | | | `share_project` | `bool`, optional | no | | | `organization_db` | `bool`, optional | no | | | `scenario_variants` | `bool`, optional | no | | | `max_scenario_variants` | `int`, optional | no | | | `name` | `str` | yes | | | `id` | `UUID4` | yes | | | `created` | `AwareDatetime` | yes | | | `updated` | `AwareDatetime`, optional | yes | | | `sagemaker_on` | `bool` | yes | | | `sagemaker_regions` | list of [`AwsRegion`](#model-AwsRegion) | yes | | ## GetSolverJobExt { #model-GetSolverJobExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `status` | [`JobStatus`](#model-JobStatus), optional | no | | | `status_msg` | `str`, optional | no | | | `batch_id` | `str`, optional | no | | | `points_completed` | `int`, optional | no | | | `started` | `AwareDatetime`, optional | no | | | `terminated` | `AwareDatetime`, optional | no | | | `infeasibility_info` | `str`, optional | no | | | `name` | `str` | yes | | | `objective1` | [`ObjectiveFunction`](#model-ObjectiveFunction) | yes | | | `objective2` | [`ObjectiveFunction`](#model-ObjectiveFunction), optional | no | | | `scenario_guid` | `str`, optional | no | | | `scenario_name` | `str`, optional | no | | | `temporal_resolution` | [`TemporalResolution`](#model-TemporalResolution) | yes | | | `points` | `int` | yes | (≥ 1, ≤ 10) | | `time_limit` | `int` | yes | (≥ 1, ≤ 18720) | | `mip_gap` | `float` | yes | (≥ 0.1, < 100.0) | | `account_guid` | `str` | yes | | | `organization_id` | `UUID4` | yes | | | `subscription_id` | `UUID4` | yes | | | `id` | `UUID4` | yes | | | `created` | `AwareDatetime` | yes | | | `input_file` | [`InputFile`](#model-InputFile), optional | no | | | `output_file` | [`OutputFile`](#model-OutputFile), optional | no | | ## GetSubscriptionExt { #model-GetSubscriptionExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `organization_id` | `UUID4` | yes | | | `start_date` | `date` | yes | | | `end_date` | `date`, optional | no | | | `billing_cycle` | [`BillingCycle`](#model-BillingCycle), optional | no | | | `next_billing_date` | `date`, optional | no | | | `variable_billing` | `bool`, optional | no | | | `execution_priority` | `int`, optional | no | | | `max_simultaneous_executions` | `int`, optional | no | | | `max_executions_per_cycle` | `int`, optional | no | | | `max_execution_time_per_cycle` | `int`, optional | no | | | `max_executions_per_week` | `int`, optional | no | | | `max_execution_time_per_week` | `int`, optional | no | | | `user_max_executions_per_cycle` | `int`, optional | no | | | `user_max_execution_time_per_cycle` | `int`, optional | no | | | `user_max_executions_per_week` | `int`, optional | no | | | `user_max_execution_time_per_week` | `int`, optional | no | | | `id` | `UUID4` | yes | | | `created` | `AwareDatetime` | yes | | | `updated` | `AwareDatetime` | yes | | ## GetUsageExt { #model-GetUsageExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `subscription` | [`SubscriptionUsage`](#model-SubscriptionUsage) | yes | | | `user` | [`UserUsage`](#model-UserUsage) | yes | | ## GetUserProfileExt { #model-GetUserProfileExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `account` | [`User`](#model-User) | yes | | | `preferences` | [`Preferences`](#model-Preferences) | yes | | | `plan_limitation` | [`GetPlanExt`](#model-GetPlanExt) | yes | | | `organization` | [`GetOrganizationExt`](#model-GetOrganizationExt) | yes | | | `subscription` | [`GetSubscriptionExt`](#model-GetSubscriptionExt) | yes | | | `profile_picture` | `str`, optional | no | | | `organization_picture` | `str`, optional | no | | ## InputFile { #model-InputFile } Root model wrapping `AnyUrl`. ## JobStatus { #model-JobStatus } | Member | Value | | --- | --- | | `JobStatus.validating` | `'VALIDATING'` | | `JobStatus.valid` | `'VALID'` | | `JobStatus.pending` | `'PENDING'` | | `JobStatus.queued` | `'QUEUED'` | | `JobStatus.running` | `'RUNNING'` | | `JobStatus.done` | `'DONE'` | | `JobStatus.stopped` | `'STOPPED'` | | `JobStatus.failed` | `'FAILED'` | | `JobStatus.invalid` | `'INVALID'` | ## Language { #model-Language } | Member | Value | | --- | --- | | `Language.english` | `'English'` | | `Language.german` | `'German'` | ## ObjectiveFunction { #model-ObjectiveFunction } | Member | Value | | --- | --- | | `ObjectiveFunction.min_life_cycle_cost` | `'MIN_LIFE_CYCLE_COST'` | | `ObjectiveFunction.min_annualized_cost` | `'MIN_ANNUALIZED_COST'` | | `ObjectiveFunction.min_co2_emissions` | `'MIN_CO2_EMISSIONS'` | | `ObjectiveFunction.min_investment` | `'MIN_INVESTMENT'` | | `ObjectiveFunction.min_om` | `'MIN_OM'` | | `ObjectiveFunction.min_fuel_imports` | `'MIN_FUEL_IMPORTS'` | | `ObjectiveFunction.min_replacement` | `'MIN_REPLACEMENT'` | | `ObjectiveFunction.max_exports` | `'MAX_EXPORTS'` | | `ObjectiveFunction.max_salvage` | `'MAX_SALVAGE'` | ## OutputFile { #model-OutputFile } Root model wrapping `AnyUrl`. ## PostSolverJobExt { #model-PostSolverJobExt } | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | `str` | yes | | | `objective1` | [`ObjectiveFunction`](#model-ObjectiveFunction) | yes | | | `objective2` | [`ObjectiveFunction`](#model-ObjectiveFunction), optional | no | | | `scenario_guid` | `str`, optional | no | | | `scenario_name` | `str`, optional | no | | | `temporal_resolution` | [`TemporalResolution`](#model-TemporalResolution) | yes | | | `points` | `int` | yes | (≥ 1, ≤ 10) | | `time_limit` | `int` | yes | (≥ 1, ≤ 18720) | | `mip_gap` | `float` | yes | (≥ 0.1, < 100.0) | | `input_file_id` | `UUID4`, optional | no | | ## Preferences { #model-Preferences } | Field | Type | Required | Description | | --- | --- | --- | --- | | `exchange_currency_default` | `str` | yes | | | `unit_system_default` | `str` | yes | | | `language_default` | [`Language`](#model-Language) | yes | | | `interest_rate_default` | `float`, optional | no | | | `first_name` | `str`, optional | no | | | `last_name` | `str`, optional | no | | | `created` | `AwareDatetime` | yes | | | `updated` | `AwareDatetime` | yes | | ## SolverJob { #model-SolverJob } | Field | Type | Required | Description | | --- | --- | --- | --- | | `status` | [`JobStatus`](#model-JobStatus), optional | no | | | `status_msg` | `str`, optional | no | | | `batch_id` | `str`, optional | no | | | `points_completed` | `int`, optional | no | | | `started` | `AwareDatetime`, optional | no | | | `terminated` | `AwareDatetime`, optional | no | | | `infeasibility_info` | `str`, optional | no | | | `name` | `str` | yes | | | `objective1` | [`ObjectiveFunction`](#model-ObjectiveFunction) | yes | | | `objective2` | [`ObjectiveFunction`](#model-ObjectiveFunction), optional | no | | | `scenario_guid` | `str`, optional | no | | | `scenario_name` | `str`, optional | no | | | `temporal_resolution` | [`TemporalResolution`](#model-TemporalResolution) | yes | | | `points` | `int` | yes | (≥ 1, ≤ 10) | | `time_limit` | `int` | yes | (≥ 1, ≤ 18720) | | `mip_gap` | `float` | yes | (≥ 0.1, < 100.0) | | `account_guid` | `str` | yes | | | `organization_id` | `UUID4` | yes | | | `subscription_id` | `UUID4` | yes | | | `id` | `UUID4` | yes | | | `created` | `AwareDatetime` | yes | | ## SubscriptionUsage { #model-SubscriptionUsage } | Field | Type | Required | Description | | --- | --- | --- | --- | | `total_count_overage` | `int` | yes | | | `total_minutes_overage` | `int` | yes | | | `weekly_count_overage` | `int` | yes | | | `weekly_minutes_overage` | `int` | yes | | | `total_count` | `int` | yes | | | `total_minutes` | `int` | yes | | | `current_week_count` | `int` | yes | | | `current_week_minutes` | `int` | yes | | ## TemporalResolution { #model-TemporalResolution } | Member | Value | | --- | --- | | `TemporalResolution.low` | `'LOW'` | | `TemporalResolution.medium` | `'MEDIUM'` | | `TemporalResolution.high` | `'HIGH'` | | `TemporalResolution.full` | `'FULL'` | ## User { #model-User } | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | `str` | yes | | | `plan_limitation_id` | `UUID4` | yes | | | `organization_id` | `UUID4` | yes | | | `subscription_id` | `UUID4` | yes | | | `plan_expiry` | `date`, optional | no | | | `number_of_executions_left` | `int`, optional | no | | | `execution_time_week_left` | `int`, optional | no | | | `mfa` | `bool`, optional | no | | | `deactivated` | `bool`, optional | no | | | `superuser` | `bool`, optional | no | | | `admin` | `bool`, optional | no | | | `show_maintenance_info` | `bool`, optional | no | | | `show_gtc` | `bool`, optional | no | | | `show_user_guide` | `bool`, optional | no | | | `account_guid` | `str` | yes | | | `created` | `AwareDatetime` | yes | | | `updated` | `AwareDatetime` | yes | | ## UserUsage { #model-UserUsage } | Field | Type | Required | Description | | --- | --- | --- | --- | | `total_count` | `int` | yes | | | `total_minutes` | `int` | yes | | | `current_week_count` | `int` | yes | | | `current_week_minutes` | `int` | yes | | | `history_count` | `int`, optional | no | | --- # Use with AI Sympheny is built to be driven by AI assistants and coding agents. This section covers the ways to connect Sympheny to an AI tool. ## MCP server The Sympheny MCP server lets an AI assistant call the Sympheny API directly — creating scenarios, running solver jobs, and reading results — over a standard [Model Context Protocol](https://modelcontextprotocol.io/) connection. !!! info "Coming soon" The MCP server has not been released yet. See [MCP server setup](mcp.md) for the configuration you will use once it ships. Until then, drive Sympheny programmatically with the [REST API](../api/index.md) or the [Python SDK](../sdk/index.md) — both are agent-friendly and fully documented on this site. ## Machine-readable docs This site publishes two machine-readable indexes, served from the site root and regenerated on every build: - [`llms.txt`](https://docs.sympheny.com/llms.txt) — a compact, nav-ordered index of every page with a one-line description. - [`llms-full.txt`](https://docs.sympheny.com/llms-full.txt) — the full documentation concatenated in reading order, for tools that want the whole corpus in a single fetch. Both follow the [llms.txt](https://llmstxt.org/) convention. --- # MCP server setup The Sympheny MCP server exposes the Sympheny API to AI assistants over the [Model Context Protocol](https://modelcontextprotocol.io/), so a model can create scenarios, run solver jobs, and read results without you wiring up HTTP calls yourself. It is a remote server, reachable over streamable HTTP. !!! warning "Not yet available" The MCP server has not been released. The configuration below is the shape you will use once it ships — the server URL is a **placeholder** and will not connect today. Authentication settings will be added here when the server is published; the exact scheme is not final yet. Throughout this page the placeholder endpoint is: ```text https://mcp.sympheny.com/mcp # placeholder — not live yet ``` ## Claude Code Add the server from the CLI (the `--transport http` flag is required for a remote server): ```bash claude mcp add --transport http sympheny https://mcp.sympheny.com/mcp ``` To share the configuration with a team, use `--scope project`, which writes a checked-in `.mcp.json`: ```json { "mcpServers": { "sympheny": { "type": "http", "url": "https://mcp.sympheny.com/mcp" } } } ``` Verify the connection with `claude mcp get sympheny` or the `/mcp` command. ## Claude Desktop Open **Settings → Connectors → Add custom connector**, enter the server URL, and click **Add**. This is the recommended path for remote servers — no config file to edit. ## ChatGPT Enable **Developer mode**, then open **Settings → Connectors → Create** and enter the server URL. When calling a model through the API instead, add the server as an MCP tool: ```json { "type": "mcp", "server_label": "sympheny", "server_url": "https://mcp.sympheny.com/mcp" } ``` ## Gemini CLI Add the server to `~/.gemini/settings.json` under `mcpServers`, using `httpUrl` for the streamable-HTTP transport: ```json { "mcpServers": { "sympheny": { "httpUrl": "https://mcp.sympheny.com/mcp" } } } ``` --- Not using an MCP client yet? Drive Sympheny with the [REST API](../api/index.md) or the [Python SDK](../sdk/index.md) today.