{"swagger":"2.0","info":{"title":"Storm Pris API Actions","description":"Copilot Studio-vennlig Swagger 2.0-spesifikasjon for prosjektering, pris, eksport og produktsøk.","version":"1.0"},"host":"api.ekbpro.com","basePath":"/","schemes":["https"],"consumes":["application/json"],"produces":["application/json"],"paths":{"/action-probe":{"get":{"summary":"Test actionflyt","description":"Enkel probe som bekrefter at API-et svarer.","operationId":"action_probe","parameters":[],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ActionProbe"}}}}},"/action-probe-project":{"post":{"summary":"Test actionflyt med prosjektpayload","description":"Minimalt prosjektkall som bruker samme prosjektmodell som beregning, men bare returnerer en liten JSON-respons.","operationId":"action_probe_project","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ProjectActionProbe"}}}}},"/calculate/summary":{"post":{"summary":"Beregn prosjekt – kompakt sammendrag","description":"Kjører prosjekterings- og prismotoren og returnerer kun nøkkeldata: tilbudspris, stikk/lys per rom, antall kurser, last og eventuelle mangler. Bruk denne i stedet for /calculate for å unngå ResponseTooLarge på store prosjekter. Returnerer ready_for_export=true når prosjektet er klart for eksport.","operationId":"calculate_summary","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Kompakt beregningsresultat","schema":{"$ref":"#/definitions/GenericObject"}}}}},"/project/drafts":{"post":{"summary":"Lagre prosjektutkast","description":"Lagrer et prosjektutkast med prosjekt-ID slik at GUI og Copilot kan hente samme prosjekt videre.","operationId":"save_project_draft","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectDraftSaveRequest"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ProjectDraftMeta"}}}},"get":{"summary":"List prosjektutkast","description":"Returnerer liste over lagrede prosjektutkast.","operationId":"list_project_drafts","parameters":[],"responses":{"200":{"description":"Successful Response","schema":{"type":"array","items":{"$ref":"#/definitions/ProjectDraftMeta"}}}}}},"/project/drafts/{draft_id}":{"get":{"summary":"Hent prosjektutkast","description":"Henter lagret prosjektutkast for videre arbeid i GUI eller Copilot.","operationId":"load_project_draft","parameters":[{"name":"draft_id","in":"path","required":true,"type":"string"}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ProjectDraftDocument"}}}},"delete":{"summary":"Slett prosjektutkast","operationId":"delete_project_draft","parameters":[{"name":"draft_id","in":"path","required":true,"type":"string"}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/GenericObject"}}}}},"/design/house-from-text":{"post":{"summary":"Generer prosjektutkast fra tekst","description":"Tar en fritekstbeskrivelse og genererer et prosjektutkast med rom, punkter og priser.","operationId":"design_house_from_text","consumes":["application/x-www-form-urlencoded"],"parameters":[{"name":"description","in":"formData","required":true,"type":"string"}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ProjectCalculationResponse"}}}}},"/catalog/search":{"post":{"summary":"Søk produkt og pris","description":"Katalogsøk for elnummer, varenummer og navnesøk. Returnerer ett felles responsformat med priser og trefftype.","operationId":"supplier_catalog_search","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SupplierCatalogSearchRequest"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/SupplierCatalogSearchResponse"}}}}},"/export/service-pdf-link":{"post":{"summary":"Eksporter serviceoppdrag som PDF","description":"Genererer et PDF-tilbud for et serviceoppdrag og returnerer en midlertidig nedlastingslenke.","operationId":"export_service_pdf_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ServiceEstimateRequest"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/pdf-link":{"post":{"summary":"Eksporter tilbud som nedlastingslenke","description":"Returnerer metadata og en midlertidig nedlastingslenke for PDF-filen.","operationId":"export_pdf_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/material-list-link":{"post":{"summary":"Eksporter materialliste som nedlastingslenke","description":"Returnerer metadata og en midlertidig nedlastingslenke for Excel-materiallisten.","operationId":"export_material_list_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/tavleplan":{"post":{"summary":"Returner tavleplan som JSON","description":"Genererer tavleplan for prosjektet og returnerer JSON-respons.","operationId":"export_tavleplan","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/GenericObject"}}}}},"/export/plejd-bom":{"post":{"summary":"Returner Plejd-enhetsliste som JSON","description":"Genererer Plejd BOM og returnerer JSON-respons.","operationId":"export_plejd_bom","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/GenericObject"}}}}},"/estimate/service/variants":{"get":{"summary":"List materialvarianter for service","description":"Returnerer tilgjengelige materialvarianter for serviceoppdrag (standard, elko, schneider, sg, abb).","operationId":"get_service_variants","parameters":[],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/GenericObject"}}}}},"/estimate/service":{"post":{"summary":"Estimér serviceoppdrag","description":"Calculates price for a service job without room structure. Send a list of work items using field name 'items' (NOT 'tasks') with 'point_code' and 'quantity' (NOT 'qty'). Use for single installations, replacement jobs and small jobs — not for full projects.","operationId":"estimate_service","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ServiceEstimateRequest"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ServiceEstimateResponse"}}}}},"/export/word-link":{"post":{"summary":"Eksporter tilbud som Word-dokument","description":"Beregner prosjektet og returnerer en midlertidig nedlastingslenke til tilbud i .docx-format. Brukeren kan åpne og redigere dokumentet.","operationId":"export_word_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Nedlastingslenke til Word-dokument","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/course-registry-word-link":{"post":{"summary":"Eksporter kursfortegnelse som Word","description":"Beregner prosjektet og returnerer en midlertidig nedlastingslenke til kursfortegnelse i .docx-format. Presenter download_url som klikkbar lenke — ikke kall /downloads/{token}.","operationId":"export_course_registry_word_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Nedlastingslenke til kursfortegnelse Word-dokument","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/course-registry-pdf-link":{"post":{"summary":"Eksporter kursfortegnelse som PDF","description":"Beregner prosjektet og returnerer en midlertidig nedlastingslenke til kursfortegnelse i PDF-format. Presenter download_url som klikkbar lenke — ikke kall /downloads/{token}.","operationId":"export_course_registry_pdf_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Nedlastingslenke til kursfortegnelse PDF","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/course-registry-excel-link":{"post":{"summary":"Eksporter kursfortegnelse som Excel","description":"Beregner prosjektet og returnerer en midlertidig nedlastingslenke til kursfortegnelse i .xlsx-format. Presenter download_url som klikkbar lenke — ikke kall /downloads/{token}.","operationId":"export_course_registry_excel_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Nedlastingslenke til kursfortegnelse Excel","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/ga-generator/export-link":{"post":{"summary":"Generer GA/ETS CSV med nedlastingslenke","description":"Genererer GA/ETS CSV fra opplastet Excel og returnerer en midlertidig nedlastingslenke.","operationId":"ga_generator_export_link","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/GAGeneratorRequest"}}],"responses":{"200":{"description":"Successful Response","schema":{"$ref":"#/definitions/ExportFileLink"}}}}},"/export/offer-package":{"post":{"summary":"Generer komplett eksportpakke (ett kall)","description":"Beregner prosjektet og genererer alle fire eksportdokumenter i ett kall: tilbud PDF, tilbud Word, materialliste Excel og kursfortegnelse PDF. Returner alle download_url-er som klikkbare lenker. Sjekk warnings — ikke-tom liste betyr at kundeinfo mangler i tilbudsdokumentene.","operationId":"export_offer_package","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ProjectModel"}}],"responses":{"200":{"description":"Nedlastingslenker til alle fire eksportdokumenter","schema":{"$ref":"#/definitions/OfferPackageLink"}}}}}},"definitions":{"GenericObject":{"type":"object","additionalProperties":true},"ActionProbe":{"type":"object","additionalProperties":true,"required":["ok","timestamp"],"properties":{"ok":{"type":"boolean"},"timestamp":{"type":"integer","format":"int64"},"api":{"type":"string"},"description":{"type":"string"}}},"ProjectActionProbe":{"type":"object","additionalProperties":true,"required":["ok","project_name","room_count","system","sales_markup"],"properties":{"ok":{"type":"boolean"},"project_name":{"type":"string"},"room_count":{"type":"integer","format":"int32"},"system":{"type":"string"},"sales_markup":{"type":"number","format":"float"}}},"LightingModel":{"type":"object","properties":{"spots":{"type":"integer","default":0,"format":"int32"},"lamp_points":{"type":"integer","default":0,"format":"int32"},"bench_lights":{"type":"integer","default":0,"format":"int32"}}},"RoomModel":{"type":"object","required":["name","floor","room_type","area"],"properties":{"name":{"type":"string","default":"Stue"},"floor":{"type":"integer","default":1,"format":"int32"},"room_type":{"type":"string","default":"living_room","enum":["living_room","bedroom","kitchen","office","hallway","bathroom","laundry","storage_room","garage","balcony","technical_room","other"]},"area":{"type":"number","default":20,"format":"float"},"cable_run_m":{"type":"number","default":0,"format":"float"},"bench_length":{"type":"number","default":0,"format":"float"},"free_wall":{"type":"number","default":0,"format":"float"},"equipment":{"type":"integer","default":0,"format":"int32"},"heating":{"type":"boolean","default":false},"thermostat":{"type":"boolean","default":false},"heating_type":{"type":"string","default":"heating_cable","enum":["heating_cable","panel_heater","waterborne_floor","waterborne_radiator","heating_foil","heat_pump"]},"heating_power_w":{"type":"integer","default":0,"format":"int32"},"motion_sensor":{"type":"boolean","default":false},"temperature_sensor":{"type":"boolean","default":false},"co2_sensor":{"type":"boolean","default":false},"dali":{"type":"boolean","default":false},"audio":{"type":"boolean","default":false},"bathroom_exhaust_fan":{"type":"boolean","default":false,"description":"Sett true for å prise avtrekksvifte med fuktstyring (bad/vaskerom)"},"eating_area":{"type":"boolean","default":false,"description":"Kjøkken har spiseplass – gir ekstra stikkontakter"},"shutters":{"type":"integer","default":0,"description":"Antall persienner/screens i rommet (KNX/Plejd)","format":"int32"},"outlet_override":{"type":"boolean","default":false,"description":"Sett true for å overstyre automatisk stikkontaktberegning med outlet_single/double/quad"},"outlet_single":{"type":"integer","default":0,"format":"int32"},"outlet_double":{"type":"integer","default":0,"format":"int32"},"outdoor_outlets":{"type":"integer","default":0,"description":"Antall utendørs stikkontakter (IP44)","format":"int32"},"wireless_switches":{"type":"integer","default":0,"description":"Antall trådløse brytere (Plejd)","format":"int32"},"wireless_rotaries":{"type":"integer","default":0,"description":"Antall trådløse vridimmere (Plejd)","format":"int32"},"special_requirements":{"type":"string","description":"Fritekst for spesielle krav eller merknader til rommet"},"lighting":{"$ref":"#/definitions/LightingModel"}}},"ProjectModel":{"type":"object","required":["name","system"],"properties":{"name":{"type":"string","default":"Mitt prosjekt"},"floors":{"type":"integer","default":1,"format":"int32"},"system":{"type":"string","enum":["conventional","knx","plejd"],"default":"conventional"},"ruleset":{"type":"string","default":"nek400"},"project_mode":{"type":"string","default":"new_installation"},"sales_markup":{"type":"number","default":1.4,"format":"float"},"address":{"type":"string"},"notes":{"type":"string"},"air_to_air_heat_pump_units":{"type":"integer","default":0,"description":"Antall luft-til-luft varmepumper i prosjektet","format":"int32"},"ev_charger_units":{"type":"integer","default":0,"description":"Antall elbilladerinstallasjoner (Zaptec)","format":"int32"},"customer_name":{"type":"string","default":"","description":"Kundens navn (person eller firma) — vises i tilbudsdokument. Spør alltid om dette før eksport av kundetilbud."},"customer_address":{"type":"string","default":"","description":"Kundens postadresse (gateadresse) — vises i tilbudsdokument"},"customer_postal":{"type":"string","default":"","description":"Kundens postnummer og poststed, f.eks. '1184 Oslo' — vises i tilbudsdokument"},"customer_contact":{"type":"string","default":"","description":"Kontaktperson hos kunden — vises i tilbudsdokument"},"rooms":{"type":"array","items":{"$ref":"#/definitions/RoomModel"}},"material_map_overrides":{"type":"object","additionalProperties":{"type":"string"},"default":{},"description":"Overstyrer standard produktvalg: punktkode → elnummer. Sett etter /catalog/search og bekreftelse."}}},"ProjectCalculationResponse":{"type":"object","required":["name","system","offer_price","price_details"],"additionalProperties":true,"properties":{"name":{"type":"string"},"system":{"type":"string"},"offer_price":{"type":"number","format":"float"},"price_details":{"$ref":"#/definitions/GenericObject"}}},"ProjectDraftSaveRequest":{"type":"object","required":["project"],"properties":{"project":{"$ref":"#/definitions/ProjectModel"},"draft_id":{"type":"string"},"title":{"type":"string"},"source":{"type":"string","default":"gui"}}},"ProjectDraftMeta":{"type":"object","required":["draft_id","title","source","updated_at","api_url","gui_url"],"properties":{"draft_id":{"type":"string"},"title":{"type":"string"},"source":{"type":"string"},"updated_at":{"type":"string"},"api_url":{"type":"string"},"gui_url":{"type":"string"}}},"ProjectDraftDocument":{"type":"object","required":["draft_id","title","source","updated_at","api_url","gui_url","project"],"properties":{"draft_id":{"type":"string"},"title":{"type":"string"},"source":{"type":"string"},"updated_at":{"type":"string"},"api_url":{"type":"string"},"gui_url":{"type":"string"},"project":{"$ref":"#/definitions/ProjectModel"}}},"OfferPackageLink":{"type":"object","description":"Komplett eksportpakke med alle fire dokumenter for et fullprosjekt.","required":["offer_pdf","offer_word","material_list_xlsx","course_registry_pdf","warnings"],"properties":{"offer_pdf":{"$ref":"#/definitions/ExportFileLink","description":"Tilbud PDF — sendes til kunden"},"offer_word":{"$ref":"#/definitions/ExportFileLink","description":"Tilbud Word (redigerbart) — sendes til kunden"},"material_list_xlsx":{"$ref":"#/definitions/ExportFileLink","description":"Materialliste Excel — internt prosjektlederunderlag"},"course_registry_pdf":{"$ref":"#/definitions/ExportFileLink","description":"Kursfortegnelse PDF — internt prosjektlederunderlag"},"warnings":{"type":"array","items":{"type":"string"},"default":[],"description":"Advarsler om manglende kundeinfo i tilbudsdokumentene. Tom liste = OK."}}},"ExportFileLink":{"type":"object","required":["filename","content_type","size_bytes","download_url","expires_in_seconds"],"properties":{"filename":{"type":"string"},"content_type":{"type":"string"},"size_bytes":{"type":"integer","format":"int32"},"download_url":{"type":"string"},"expires_in_seconds":{"type":"integer","format":"int32"},"warnings":{"type":"array","items":{"type":"string"},"default":[],"description":"Advarsler om manglende data i eksportfilen. Tom liste = ingen advarsler."}}},"FileUploadPayload":{"type":"object","required":["filename","content_base64"],"properties":{"filename":{"type":"string","default":"test.xlsx","description":"Filnavn inkludert filtype (f.eks. test.xlsx)"},"content_type":{"type":"string"},"content_base64":{"type":"string","default":"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","description":"Excel-fil kodet som base64-streng"}}},"GAGeneratorRequest":{"type":"object","required":["file","sheet_name"],"properties":{"file":{"$ref":"#/definitions/FileUploadPayload"},"sheet_name":{"type":"string","default":"Ark1","description":"Navn på arket i Excel-filen som skal eksporteres"},"start_row":{"type":"integer","default":7,"format":"int32"},"end_row":{"type":"integer","default":100,"format":"int32"},"empty_lines":{"type":"integer","default":1,"format":"int32"},"output_filename":{"type":"string","default":"ga-export.csv"},"include_all_lights":{"type":"boolean","default":false},"include_all_heat":{"type":"boolean","default":false},"include_aerotemper":{"type":"boolean","default":false},"include_fancoil":{"type":"boolean","default":false},"include_screens":{"type":"boolean","default":false},"include_spjeld":{"type":"boolean","default":false}}},"SupplierCatalogItem":{"type":"object","required":["supplier_id","elnummer","vare_no","lookup_key_type","name","brand","purchase_price","list_price","currency","matched_on"],"properties":{"supplier_id":{"type":"string"},"elnummer":{"type":"string"},"vare_no":{"type":"string"},"lookup_key_type":{"type":"string"},"name":{"type":"string"},"brand":{"type":"string"},"purchase_price":{"type":"number","x-nullable":true,"format":"float"},"list_price":{"type":"number","x-nullable":true,"format":"float"},"currency":{"type":"string","x-nullable":true},"matched_on":{"type":"string","x-nullable":true},"product":{"$ref":"#/definitions/GenericObject"},"cost":{"$ref":"#/definitions/GenericObject"}}},"SupplierCatalogSearchRequest":{"type":"object","required":["query"],"properties":{"query":{"type":"string"},"supplier_id":{"type":"string"},"search_mode":{"type":"string","enum":["auto","elnummer","name"],"default":"auto"},"limit":{"type":"integer","default":10,"format":"int32"}}},"SupplierCatalogSearchResponse":{"type":"object","required":["query","search_mode","interpreted_mode","count","items"],"properties":{"query":{"type":"string"},"search_mode":{"type":"string"},"interpreted_mode":{"type":"string"},"count":{"type":"integer","format":"int32"},"exact_match":{"$ref":"#/definitions/SupplierCatalogItem"},"items":{"type":"array","items":{"$ref":"#/definitions/SupplierCatalogItem"}}}},"ServiceWorkItem":{"type":"object","required":["point_code","quantity"],"properties":{"point_code":{"type":"string","description":"Point code from active pricebook. Valid codes: double_outlet, single_outlet, outlet_ip44, switch_single, lamp_indoor, spot_ceiling_led, thermostat, heating_cable, panel_heater_800w, panel_heater_1000w, circuit_new_15a, bathroom_fan (standard/billig), bathroom_fan_humidity (fuktstyring), smoke_detector, hot_water_connect, ev_charger_zaptec, travel, rigging. IMPORTANT for heating_cable: quantity is always 1 regardless of floor area — it represents one complete cable job. To find the right cable product, calculate wattage from area (m² × 120–160 W/m²) and search /suppliers/products for the matching cable by wattage."},"quantity":{"type":"integer","description":"Number of units. Field name is 'quantity' (NOT 'qty', NOT 'count', NOT 'antall'). Required.","format":"int32"},"description":{"type":"string","description":"Optional free-text description for the customer"}}},"ServiceEstimateRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Name of the service job","default":"Serviceestimering"},"items":{"type":"array","items":{"$ref":"#/definitions/ServiceWorkItem"},"description":"Array of work items. Field name is 'items' (NOT 'tasks', NOT 'work_items', NOT 'punkter'). Each item requires 'point_code' (string) and 'quantity' (integer).. Leave empty in test UI; AI will provide the array.","default":[{"point_code":"double_outlet","quantity":2},{"point_code":"switch_single","quantity":1}]},"sales_markup":{"type":"number","default":1.4,"description":"Markup on material cost (default 1.4 = 40%)","format":"float"},"role":{"type":"string","default":"electrician","description":"Role to price: electrician, apprentice or engineer"}}},"ServiceEstimateResponse":{"type":"object","properties":{"name":{"type":"string"},"system":{"type":"string"},"role":{"type":"string"},"sales_markup":{"type":"number","format":"float"},"offer_price":{"type":"number","description":"Total tilbudspris i NOK","format":"float"},"total_hours":{"type":"number","description":"Sum arbeidstimar","format":"float"},"material_cost":{"type":"number","format":"float"},"labour_cost":{"type":"number","format":"float"},"items":{"type":"array","items":{"$ref":"#/definitions/GenericObject"},"description":"Pris per arbeidspost"},"material_diagnostics":{"type":"object","properties":{"unmapped_points":{"type":"array","items":{"type":"string"}},"missing_costs":{"type":"array","items":{"type":"string"}},"has_issues":{"type":"boolean"}}},"pricebook":{"$ref":"#/definitions/GenericObject"}}}}}