Integrera natomrade med EnergiCRM

Berika kundregistret med korrekt nätägare och elområde via API.

Uppdaterad 2026-05-19

Use case

Du har en CRM (t.ex. EnergiCRM eller annan) där varje kund har en adress eller ett postnummer. Du vill berika varje kund med:

  • Vilket elområde de tillhör (SE1-SE4)
  • Vilken nätägare (Ellevio, Vattenfall, E.ON, lokala bolag)
  • Energiskattenivå (normal/reducerad)
  • EDIEL-ID på nätägaren (för EDIFACT-routing senare)

Lösning: en batch-uppdatering

import requests, psycopg2

API = "https://natomrade.airpipe.ai/api/v1/lookup/postal"
HEADERS = {"X-API-Key": "zk_din_nyckel"}

conn = psycopg2.connect("postgresql://crm:pwd@localhost/energicrm")
with conn.cursor() as cur:
    cur.execute("SELECT id, postnr FROM kunder WHERE elomrade IS NULL")
    kunder = cur.fetchall()

for kid, postnr in kunder:
    r = requests.get(API, params={"code": postnr}, headers=HEADERS, timeout=10)
    if r.status_code != 200:
        continue
    d = r.json()
    with conn.cursor() as cur:
        cur.execute('''
            UPDATE kunder SET
                elomrade = %s,
                natagare_namn = %s,
                natagare_ediel_id = %s,
                energiskatt_typ = %s,
                berikad_at = NOW()
            WHERE id = %s
        ''', (
            d.get("elomrade", {}).get("code"),
            (d.get("grid_owner") or {}).get("name"),
            (d.get("grid_owner") or {}).get("ediel_id"),
            (d.get("energy_tax") or {}).get("rate_type"),
            kid,
        ))
    conn.commit()

Throttling

För 10 000 kunder med en free-tier-nyckel (5 000/dygn): det tar 2 dygn. Med starter-tier (20 000/dygn) klart på ~2 timmar.

För att undvika 429:

import time
last = 0
def throttle():
    global last
    elapsed = time.time() - last
    if elapsed < 0.05:
        time.sleep(0.05 - elapsed)
    last = time.time()

Cache invalidation

Datat ändras sällan — efter sortering ovan kan du köra om hela jobbet 1×/månad. Vid:

  • Postnr-byte hos kund → kör om för den kunden
  • Nytt postnr-område införs (sällan) → behov av re-run

Konsekvens-check

Innan du sätter datat i produktion: kontrollera fördelningen.

SELECT elomrade, COUNT(*) FROM kunder
WHERE elomrade IS NOT NULL
GROUP BY elomrade ORDER BY elomrade;

Förväntad fördelning för Sverige som helhet är ungefär:

Område Andel hushåll
SE1 ~5%
SE2 ~10%
SE3 ~60%
SE4 ~25%

Avviker det kraftigt — kanske finns en bug i din mappning eller datakällan.