📚 API Dokumentation

VÀlkommen till utvecklardokumentationen för Spotprisoptimering. HÀr hittar du allt du behöver för att integrera vÄra tjÀnster i dina egna applikationer, oavsett om du anvÀnder PHP, Python, JavaScript eller Shelly-skript.

Bas-URL: https://www.spotprisoptimering.se/api/ HTTPS krÀvs

đŸ”„ VĂ€rmepump

GET v2.0.0

Huvud-API för vÀrmepumpsstyrning. Returnerar signal baserad pÄ aktuellt elpris och anvÀndarens tröskelvÀrden.

/api/signal.php
API-nyckel (query parameter eller Bearer header) JSON
Signaler:
HEAT SAVE NORMAL
Parametrar:
Parameter Typ Beskrivning
api_key string Din API-nyckel
area string ElomrÄde (SE1, SE2, SE3, SE4). Default: anvÀndarens instÀllning
Exempelanrop:
curl "https://www.spotprisoptimering.se/api/signal.php?api_key=DIN_API_NYCKEL"
Exempelsvar:
{
    "success": true,
    "timestamp": "2026-03-05T22:05:05+01:00",
    "api_version": "2.0.0",
    "signal": "SAVE",
    "message": "Högt pris - sÀnk temperaturen temporÀrt",
    "price": {
        "current": 1.346,
        "area": "SE4",
        "unit": "SEK\/kWh",
        "source": "cache"
    },
    "thresholds": {
        "low": 0.5,
        "high": 1.1
    },
    "level": "HIGH",
    "recommendation": {
        "short": "Spara!",
        "action": "SÀnk 2-3°C eller aktivera nattsÀnkning",
        "duration": "nÀsta timme"
    }
}

🚗 Elbil - Full information

GET v2.0.0

Returnerar detaljerad information om optimal laddning för elbil, inklusive prisprognos, laddningsschema och varningar.

/api/car.php
API-nyckel (query parameter eller Bearer header) JSON
Parametrar:
Parameter Typ Beskrivning
api_key string Din API-nyckel
area string ElomrÄde (SE1-SE4). Default: anvÀndarens instÀllning
hours integer Antal timmar prognos (max 72). Default: 48
Exempelanrop:
curl "https://www.spotprisoptimering.se/api/car.php?api_key=DIN_API_NYCKEL&hours=24"
Exempelsvar:
{
    "success": true,
    "timestamp": "2026-03-05T22:05:05+01:00",
    "api_version": "2.0.0",
    "vehicle": {
        "name": "Min elbil",
        "brand": null,
        "model": null,
        "battery_capacity": 60,
        "current_charge": 30,
        "target_charge": 80,
        "min_charge": 50,
        "charger_power": 11,
        "departure_time": "07:30:00",
        "smart_charging": true,
        "is_active": false
    },
    "price_forecast": {
        "area": "SE4",
        "hours": 48,
        "current_price": 1.346,
        "min_price": 0.638,
        "max_price": 2.429,
        "avg_price": 1.283,
        "forecast": []
    },
    "charging": {
        "can_achieve_target": true,
        "hours_to_departure": 10,
        "hours_needed": 3,
        "current_kwh": 18,
        "needed_kwh": 30,
        "schedule": [],
        "total_energy": 33,
        "total_cost": 37.48,
        "avg_price": 1.136,
        "final_charge": 85,
        "alerts": [
            {
                "level": "critical",
                "message": "Batteriet Ă€r under 50% - ladda OMGÅENDE!"
            }
        ],
        "recommendations": []
    },
    "chargers": [],
    "recommendations": [],
    "alerts": [
        {
            "level": "critical",
            "message": "Batteriet Ă€r under 50% - ladda OMGÅENDE!"
        }
    ],
    "signal": "CHARGE"
}

🚗 Elbil - Enkel signal

GET v1.0.0

Enkelt textbaserat API för Shelly-relÀer och enkla IoT-enheter. Returnerar bara en textstrÀng.

/api/car_signal.php
API-nyckel (query parameter) Text/plain
Signaler:
CHARGE_NOW CHARGE WAIT STOP
Parametrar:
Parameter Typ Beskrivning
api_key string Din API-nyckel
Exempelanrop:
curl "https://www.spotprisoptimering.se/api/car_signal.php?api_key=DIN_API_NYCKEL"
Exempelsvar:
"CHARGE"

💧 Varmvatten

GET v2.0.0

API för varmvattenstyrning. Returnerar enkel text eller JSON beroende pÄ format-parameter.

/api/water.php
API-nyckel (query parameter) Text/plain (default) eller JSON
Signaler:
START STOPP NORMAL
Parametrar:
Parameter Typ Beskrivning
api_key string Din API-nyckel
format string VÀlj "json" för JSON-svar, annars text
Exempelanrop:
curl "https://www.spotprisoptimering.se/api/water.php?api_key=DIN_API_NYCKEL"
Exempelsvar:
null
Text-svar (format=text):
NORMAL

☀ Solceller & Batteri

GET v1.0.0

API för solcells- och batteristyrning. Returnerar status och rekommendationer.

/api/solar.php
API-nyckel (query parameter eller Bearer header) JSON
Parametrar:
Parameter Typ Beskrivning
api_key string Din API-nyckel
action string VĂ€lj "status", "optimize" eller "signal"
format string VÀlj "json" (default) eller "text" för enkel signal
Exempelanrop:
curl "https://www.spotprisoptimering.se/api/solar.php?api_key=DIN_API_NYCKEL"
Exempelsvar:
{
    "success": true,
    "timestamp": "2026-03-05T22:05:05+01:00",
    "api_version": "1.0.0",
    "user_id": 1,
    "area": "SE4",
    "settings": {
        "has_solar": false,
        "has_battery": false,
        "solar_capacity": 10,
        "solar_orientation": "south",
        "solar_tilt": 35,
        "battery_capacity": 13.5,
        "battery_power": 5,
        "strategy": "self_consumption",
        "is_active": false
    },
    "current": {
        "price": 1.346,
        "price_level": "NORMAL"
    },
    "recommendation": {
        "action": "idle",
        "message": "AnvÀnd dashboarden för att konfigurera din anlÀggning"
    }
}

📊 Priser

GET v1.0.0

Öppet API för elpriser. KrĂ€ver ingen API-nyckel. Returnerar priser för valt datum och omrĂ„de.

/api/prices.php
Ingen JSON
Parametrar:
Parameter Typ Beskrivning
area string ElomrÄde (SE1, SE2, SE3, SE4). Default: SE3
date string Datum (YYYY-MM-DD). Default: idag
days integer Antal dagar (max 7). Default: 1
Exempelanrop:
curl "https://www.spotprisoptimering.se/api/prices.php?area=SE4&days=2"
Exempelsvar:
{
    "success": true,
    "area": "SE4",
    "currency": "SEK",
    "data": [
        {
            "date": "2026-03-05",
            "prices": [
                {
                    "hour": 0,
                    "price": 1.137,
                    "level": "NORMAL"
                },
                {
                    "hour": 1,
                    "price": 1.135,
                    "level": "NORMAL"
                },
                {
                    "hour": 2,
                    "price": 1.135,
                    "level": "NORMAL"
                },
                {
                    "hour": 3,
                    "price": 1.138,
                    "level": "NORMAL"
                },
                {
                    "hour": 4,
                    "price": 1.198,
                    "level": "NORMAL"
                },
                {
                    "hour": 5,
                    "price": 1.477,
                    "level": "HIGH"
                },
                {
                    "hour": 6,
                    "price": 1.728,
                    "level": "HIGH"
                },
                {
                    "hour": 7,
                    "price": 1.554,
                    "level": "HIGH"
                },
                {
                    "hour": 8,
                    "price": 1.078,
                    "level": "NORMAL"
                },
                {
                    "hour": 9,
                    "price": 0.746,
                    "level": "NORMAL"
                },
                {
                    "hour": 10,
                    "price": 0.638,
                    "level": "LOW"
                },
                {
                    "hour": 11,
                    "price": 0.638,
                    "level": "LOW"
                },
                {
                    "hour": 12,
                    "price": 0.64,
                    "level": "LOW"
                },
                {
                    "hour": 13,
                    "price": 0.663,
                    "level": "NORMAL"
                },
                {
                    "hour": 14,
                    "price": 0.767,
                    "level": "NORMAL"
                },
                {
                    "hour": 15,
                    "price": 1.248,
                    "level": "NORMAL"
                },
                {
                    "hour": 16,
                    "price": 1.572,
                    "level": "HIGH"
                },
                {
                    "hour": 17,
                    "price": 2.429,
                    "level": "HIGH"
                },
                {
                    "hour": 18,
                    "price": 1.685,
                    "level": "HIGH"
                },
                {
                    "hour": 19,
                    "price": 1.527,
                    "level": "HIGH"
                },
                {
                    "hour": 20,
                    "price": 1.35,
                    "level": "HIGH"
                },
                {
                    "hour": 21,
                    "price": 1.196,
                    "level": "NORMAL"
                },
                {
                    "hour": 22,
                    "price": 1.346,
                    "level": "NORMAL"
                },
                {
                    "hour": 23,
                    "price": 1.178,
                    "level": "NORMAL"
                }
            ],
            "statistics": {
                "min": 0.638,
                "max": 2.429,
                "avg": 1.217
            }
        }
    ]
}

đŸ–„ïž cURL

GrundlÀggande anrop
curl "https://www.spotprisoptimering.se/api/signal.php?api_key=DIN_API_NYCKEL"
Med Bearer header
curl -H "Authorization: Bearer DIN_API_NYCKEL" https://www.spotprisoptimering.se/api/signal.php
HĂ€mta priser
curl "https://www.spotprisoptimering.se/api/prices.php?area=SE3"

🐘 PHP

GrundlÀggande
<?php
$api_key = "DIN_API_NYCKEL";
$url = "https://www.spotprisoptimering.se/api/signal.php?api_key=" . $api_key;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
echo "Signal: " . $data["signal"];
Med Bearer header
<?php
$api_key = "DIN_API_NYCKEL";
$url = "https://www.spotprisoptimering.se/api/car.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer " . $api_key
]);
$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
echo "Laddningsbehov: " . ($data["signal"] ?? "okÀnt");

🐍 Python

GrundlÀggande
import requests

api_key = "DIN_API_NYCKEL"
url = f"https://www.spotprisoptimering.se/api/signal.php?api_key={api_key}"

response = requests.get(url)
data = response.json()
print(f"Signal: {data["signal"]}")
print(f"Pris: {data["price"]["current"]} kr")
Med Bearer header
import requests

api_key = "DIN_API_NYCKEL"
url = "https://www.spotprisoptimering.se/api/car.php"
headers = {"Authorization": f"Bearer {api_key}"}

response = requests.get(url, headers=headers)
data = response.json()
print(f"Laddning: {data["signal"]}")

đŸ“± JavaScript

Fetch API
const apiKey = "DIN_API_NYCKEL";

fetch(`https://www.spotprisoptimering.se/api/signal.php?api_key=${apiKey}`)
  .then(response => response.json())
  .then(data => {
    console.log("Signal:", data.signal);
    console.log("Pris:", data.price.current, "kr");
    console.log("Rekommendation:", data.recommendation.action);
  })
  .catch(error => console.error("Fel:", error));
Med Bearer header
fetch("https://www.spotprisoptimering.se/api/car.php", {
  headers: {
    "Authorization": `Bearer ${apiKey}`
  }
})
  .then(response => response.json())
  .then(data => {
    if (data.alerts.length > 0) {
      console.log("Varning:", data.alerts[0].message);
    }
  });
Async/await
async function getPriceSignal() {
  const apiKey = "DIN_API_NYCKEL";
  
  try {
    const response = await fetch(`https://www.spotprisoptimering.se/api/signal.php?api_key=${apiKey}`);
    const data = await response.json();
    
    document.getElementById("status").innerHTML = `
      <strong>Signal:</strong> ${data.signal}<br>
      <strong>Pris:</strong> ${data.price.current} kr/kWh
    `;
  } catch (error) {
    console.error("Fel vid API-anrop:", error);
  }
}

📩 Node.js

Axios
const axios = require("axios");

const apiKey = "DIN_API_NYCKEL";

axios.get(`https://www.spotprisoptimering.se/api/signal.php?api_key=${apiKey}`)
  .then(response => {
    console.log("Signal:", response.data.signal);
    console.log("Pris:", response.data.price.current);
  })
  .catch(error => {
    console.error("API-fel:", error.message);
  });
Express-exempel
const express = require("express");
const axios = require("axios");
const app = express();

app.get("/styr-varmepump", async (req, res) => {
  try {
    const apiKey = process.env.API_KEY;
    const response = await axios.get(
      `https://www.spotprisoptimering.se/api/signal.php?api_key=${apiKey}`
    );
    
    const signal = response.data.signal;
    
    // Styr vÀrmepumpen baserat pÄ signal
    if (signal === "HEAT") {
      // SlÄ pÄ pumpen
      await styrPump(true);
    } else if (signal === "SAVE") {
      // SĂ€nk temperaturen
      await sÀnkTemperatur(2);
    }
    
    res.json({ success: true, signal });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

🏠 Home Assistant

REST Command
# configuration.yaml
rest_command:
  spotpris_signal:
    url: "https://www.spotprisoptimering.se/api/signal.php?api_key=API_NYCKEL"
    
automation:
  - alias: "Styr vÀrmepump efter pris"
    trigger:
      platform: time_pattern
      minutes: "/5"
    action:
      - service: rest_command.spotpris_signal
REST Sensor
# configuration.yaml
sensor:
  - platform: rest
    name: "Spotpris Signal"
    resource: "https://www.spotprisoptimering.se/api/signal.php?api_key=API_NYCKEL"
    value_template: "{{ value_json.signal }}"
    json_attributes:
      - price
      - level
      - recommendation
    scan_interval: 300
    
  - platform: template
    sensors:
      spotpris_action:
        value_template: "{{ state_attr('sensor.spotpris_signal', 'recommendation').action }}"
        friendly_name: "Rekommendation"
Elbilsladdning
# configuration.yaml
rest_command:
  spotpris_car:
    url: "https://www.spotprisoptimering.se/api/car_signal.php?api_key=API_NYCKEL"
    
automation:
  - alias: "Ladda bil vid lÄgt pris"
    trigger:
      platform: time_pattern
      minutes: "/10"
    condition:
      condition: template
      value_template: "{{ states('sensor.spotpris_car') == 'CHARGE' }}"
    action:
      - service: switch.turn_on
        entity_id: switch.charger

🔌 Shelly Script

Shelly 1/Pro (vÀrmepump)
// Shelly script för vÀrmepumpsstyrning
function checkPrice() {
  Shelly.call("HTTP.GET", {
    url: "https://www.spotprisoptimering.se/api/signal.php?api_key=API_NYCKEL"
  }, function(response) {
    try {
      let data = JSON.parse(response.body);
      let signal = data.signal;
      
      if (signal === "HEAT") {
        // SlÄ pÄ relÀ (starta pump)
        Shelly.call("Switch.Set", { id: 0, on: true });
        console.log("LÄgt pris - startar pump");
      } else if (signal === "SAVE") {
        // StÀng av relÀ (stoppa pump)
        Shelly.call("Switch.Set", { id: 0, on: false });
        console.log("Högt pris - stoppar pump");
      }
    } catch (e) {
      console.log("Fel vid parsning:", e);
    }
  });
}

// Kör var 15:e minut
Timer.set(900000, true, checkPrice);
Shelly 1/Pro (bil)
// Shelly script för bil-laddning
function checkCarSignal() {
  Shelly.call("HTTP.GET", {
    url: "https://www.spotprisoptimering.se/api/car_signal.php?api_key=API_NYCKEL"
  }, function(response) {
    let signal = response.body;  // Ren text
    
    if (signal === "CHARGE" || signal === "CHARGE_NOW") {
      // SlÄ pÄ relÀ (starta laddning)
      Shelly.call("Switch.Set", { id: 0, on: true });
      console.log("Laddar bil -", signal);
    } else {
      // StÀng av relÀ
      Shelly.call("Switch.Set", { id: 0, on: false });
      console.log("VĂ€ntar med laddning -", signal);
    }
  });
}

// Kör var 10:e minut
Timer.set(600000, true, checkCarSignal);
Shelly Plus/Pro med temperatur
// Shelly script för varmvatten
function checkWaterHeater() {
  Shelly.call("HTTP.GET", {
    url: "https://www.spotprisoptimering.se/api/water.php?api_key=API_NYCKEL"
  }, function(response) {
    let signal = response.body;
    
    if (signal === "START") {
      Shelly.call("Switch.Set", { id: 0, on: true });
      Shelly.call("Notify", { message: "VÀrmer vatten - lÄgt pris" });
    } else if (signal === "STOPP") {
      Shelly.call("Switch.Set", { id: 0, on: false });
    }
  });
}

// Kör var 30:e minut
Timer.set(1800000, true, checkWaterHeater);

Felkoder och felsökning

HTTP Status Felkod Beskrivning Lösning
401 MISSING_API_KEY Ingen API-nyckel skickades med LĂ€gg till ?api_key=DIN_NYCKEL i URL:en eller Authorization: Bearer header
401 INVALID_API_KEY Ogiltig eller inaktiv API-nyckel Kontrollera att nyckeln Àr rÀtt och aktiv i dashboarden
402 SUBSCRIPTION_INACTIVE Prenumerationen Àr inte aktiv Förnya din prenumeration i dashboarden
404 NOT_FOUND Endpoint hittades inte Kontrollera att URL:en Àr korrekt
405 METHOD_NOT_ALLOWED Fel HTTP-metod anvÀndes AnvÀnd GET (endast GET stöds)
429 RATE_LIMIT_EXCEEDED För mÄnga anrop Max 100 anrop per minut. VÀnta en stund.
500 SERVER_ERROR Internt serverfel Försök igen om nÄgra sekunder. Kontakta support om problemet kvarstÄr.
503 DB_ERROR TillfÀlligt databasfel Försök igen om nÄgra sekunder

💡 Tips vid felsökning

  • Testa med curl först - det ger mest information vid fel
  • Kontrollera API-nyckeln - Ă€r den rĂ€tt och aktiv i dashboarden?
  • Kolla HTTP-metod - alla vĂ„ra API:er anvĂ€nder GET
  • Vid CORS-problem - anvĂ€nd server-side-anrop eller proxy
  • Kolla prenumerationsstatus - aktiv prenumeration krĂ€vs

🔍 Vanliga problem

"Ingen API-nyckel" Du har glömt att skicka med ?api_key= i URL:en
"Ogiltig API-nyckel" Kontrollera att du kopierat rÀtt nyckel frÄn dashboarden
"Prenumeration ej aktiv" Förnya din prenumeration i dashboarden
Tomt svar eller HTML Du anropar troligen fel URL - kontrollera att du anvÀnder /api/...

PrisnivÄer och tröskelvÀrden

LOW
Pris under 0.65 kr/kWh
👉 START / HEAT / CHARGE
NORMAL
Pris mellan 0.65 - 1.35 kr/kWh
👉 NORMAL / IDLE
HIGH
Pris över 1.35 kr/kWh
👉 STOPP / SAVE / WAIT

⚙ Anpassningsbara tröskelvĂ€rden

StandardvÀrdena Àr:

  • LĂ„gpris (LOW): under 0.65 kr/kWh → START / HEAT / CHARGE
  • Normalpris (NORMAL): 0.65 - 1.35 kr/kWh → NORMAL / IDLE
  • Högpris (HIGH): över 1.35 kr/kWh → STOPP / SAVE / WAIT

Dessa vÀrden kan justeras av varje anvÀndare i dashboarden under "InstÀllningar". API:et anvÀnder alltid anvÀndarens egna tröskelvÀrden.

🔮 Högt pris (SAVE/STOPP)

NÀr priset Àr högt rekommenderar vi att du:

  • SĂ€nker temperaturen pĂ„ vĂ€rmepumpen 2-3°C
  • Aktiverar nattsĂ€nkning
  • VĂ€ntar med att ladda bilen
  • VĂ€ntar med att vĂ€rma varmvatten

🟱 LĂ„gt pris (HEAT/START/CHARGE)

NÀr priset Àr lÄgt rekommenderar vi att du:

  • VĂ€rm pĂ„ som vanligt
  • Ladda bilen
  • VĂ€rm varmvatten
  • Ladda batteri (om du har solceller)

Vanliga frÄgor

❓ Vilken API-nyckel ska jag anvĂ€nda?
✅ Du anvĂ€nder samma API-nyckel för alla endpoints (signal, car, water, solar). Hitta din nyckel i dashboarden under "API-nyckel".
❓ Hur ofta kan jag anropa API:et?
✅ Du kan göra upp till 100 anrop per minut. Detta Ă€r mer Ă€n nog för de flesta anvĂ€ndningsfall. Shelly-enheter brukar anropa var 5-15:e minut.
❓ Vad betyder signalerna?
✅ HEAT/START/CHARGE = lĂ„gt pris, SAVE/STOPP/WAIT = högt pris, NORMAL = normalpris. Exakt signal beror pĂ„ vilket API du anvĂ€nder.
❓ MĂ„ste jag ha dynamiskt elavtal?
✅ Ja, för att det ska fungera mĂ„ste du ha ett elavtal dĂ€r priset varierar per timme (dynamiskt eller timpris).
❓ Kan jag styra flera enheter med samma nyckel?
✅ Ja, en API-nyckel fungerar för alla dina enheter. Du kan ha en vĂ€rmepump, en bil och en varmvattenberedare pĂ„ samma konto.

Har du fler frÄgor? Kontakta oss pÄ support@spotprisoptimering.se

🚀 Redo att börja bygga?

FÄ din API-nyckel direkt i dashboarden och börja integrera pÄ 5 minuter. Första mÄnaden gratis!

Skapa konto gratis Logga in