{"openapi":"3.1.0","info":{"title":"PRESS0 Public API","version":"1.0.0","description":"Publikt API för PRESS0 — nyheter, ansvarsregister, datasets. Rate-limited; request IDs; cursor pagination för listor.","contact":{"name":"PRESS0","email":"simon@siax.io","url":"https://press0.xyz"}},"servers":[{"url":"https://press0.xyz"}],"paths":{"/api/health":{"get":{"summary":"Hälsokontroll (kombinerad, för dashboards)","responses":{"200":{"description":"OK"},"503":{"description":"Degraderad"}}}},"/api/livez":{"get":{"summary":"Liveness — processen lever (inga beroendekontroller)","responses":{"200":{"description":"OK"}}}},"/api/readyz":{"get":{"summary":"Readiness — kan tjäna trafik (DB m.fl. kontrollerade)","responses":{"200":{"description":"Redo"},"503":{"description":"Ej redo"}}}},"/api/exports/{dataset}":{"get":{"summary":"Dataset-export (CSV/JSON) med provenance-manifest","parameters":[{"name":"dataset","in":"path","required":true,"schema":{"type":"string","enum":["val2022","kommunalskatt-2025","partistod-2025","konsultutgifter","opinionsmatningar","valnatt","valprognos-bayes","valprognos-backtest","valkretsar","valkompassaudit"]}},{"name":"format","in":"query","schema":{"type":"string","enum":["csv","json"],"default":"json"}}],"responses":{"200":{"description":"Dataset med provenance"},"404":{"description":"Okänt dataset"}}}},"/api/version":{"get":{"summary":"Build-/commit-provenance (samma diagnoskategori som livez/readyz)","responses":{"200":{"description":"service/sha/shaShort/shaSource/builtAt/node/packageVersion — shaSource säger om SHA:n är bakad (GIT_SHA) eller runtime-injicerad (SOURCE_COMMIT)"}}}},"/api/valnatt":{"get":{"summary":"Valnatt 2026 — live prognosdata + valområden (no-store)","responses":{"200":{"description":"Live valnattsdata, ev. med kvarvarandeEstimat"}}}},"/api/bidrag":{"get":{"summary":"M03 — Kolada-bidrag till föreningar/projektstöd, kr/invånare","parameters":[{"name":"kpi","in":"query","schema":{"type":"string","pattern":"^[A-Za-z0-9]{5,10}$","default":"U09812"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":300,"default":30}},{"name":"format","in":"query","schema":{"type":"string","enum":["csv","json"],"default":"json"}}],"responses":{"200":{"description":"Bidragsöversikt + KPI-lista + topplista"},"400":{"description":"Ogiltigt KPI-id"},"404":{"description":"Ingen bidragsdata"}}}},"/api/demografi":{"get":{"summary":"M13 — SCB befolkningsdata per region","parameters":[{"name":"level","in":"query","schema":{"type":"string","enum":["kommun","lan","alla"],"default":"kommun"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":320,"default":290}},{"name":"format","in":"query","schema":{"type":"string","enum":["csv","json"],"default":"json"}}],"responses":{"200":{"description":"Befolkningsöversikt + rader per region"},"404":{"description":"Ingen befolkningsdata"}}}},"/api/data/kolada":{"get":{"summary":"Kolada KPI-värden — per kommun, per KPI (topp/botten) eller KPI-katalog","parameters":[{"name":"kommun","in":"query","schema":{"type":"string"}},{"name":"kpi","in":"query","schema":{"type":"string"}},{"name":"order","in":"query","schema":{"type":"string","enum":["top","bottom"],"default":"top"}}],"responses":{"200":{"description":"rows/kpis beroende på vilken parameter som angetts"},"500":{"description":"Kolada-data kunde inte läsas"}}}},"/api/data/riksdagen":{"get":{"summary":"Riksdagens voteringsdata — sök eller enskild votering med breakdown","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"perPage","in":"query","schema":{"type":"integer","maximum":100,"default":25}},{"name":"id","in":"query","schema":{"type":"integer"},"description":"Vote-id — ger breakdown i stället för sökträffar"}],"responses":{"200":{"description":"rows/total eller breakdown"},"500":{"description":"Voteringsdata kunde inte läsas"}}}},"/api/data/upphandling":{"get":{"summary":"Upphandlingssök (POST på samma path är en permanent 405-stub, ej ett dokumenterat kapabilitet)","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"perPage","in":"query","schema":{"type":"integer","maximum":100,"default":40}},{"name":"singleBid","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"rows/total"},"500":{"description":"Upphandlingsdata kunde inte läsas"}}}},"/api/entities":{"get":{"summary":"R5-008 — kanonisk entitetslistning, stabil sida-till-sida-paginering (Payload entities/entity-relations, samma dataägare som Entity-grafen, ej p0lytics)","parameters":[{"name":"cursor","in":"query","schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"Senast sedda entitets-id — utelämnad ger första sidan"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"schema: press0.entities-list/1.0 — items + nextCursor"},"400":{"description":"Ogiltig cursor eller limit (fail-closed)"}}}},"/api/entities/{id}/graph":{"get":{"summary":"Redaktionell kunskapsgraf för en entitet (nodes/edges/list + ärligt \"ungraphed\" för orelaterade relationstyper). Läsarsida: /entiteter/[id], samma data (R5-005)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"asOf","in":"query","schema":{"type":"string"},"description":"Historisk vy — relationer som gällde vid denna tidpunkt"}],"responses":{"200":{"description":"schema: press0.entity-graph/1.0 — entity/preview/header/nodes/edges/list/timeline/ungraphed"},"400":{"description":"Ogiltigt entity-id (fail-closed)"},"404":{"description":"Ingen entity hittad"}}}},"/api/entities/search":{"get":{"summary":"M04 — sök i entitetsregistret (2 975 poster: politiker, företag, kommuner, myndigheter, regioner)","parameters":[{"name":"q","in":"query","schema":{"type":"string","minLength":2},"description":"Krävs (minst 2 tecken) om type saknas"},{"name":"type","in":"query","schema":{"type":"string","enum":["person","politician","party","company","organization","authority","municipality","region","country","electoralDistrict","institution","place"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":25}}],"responses":{"200":{"description":"Träfflista"},"400":{"description":"q för kort och type saknas (fail-closed)"},"404":{"description":"Ingen träff"}}}},"/api/invoices/search":{"get":{"summary":"M01 — fakturasök, kräver minst ett filter (fail-closed mot 58M rader)","parameters":[{"name":"orgNr","in":"query","schema":{"type":"string"}},{"name":"vendor","in":"query","schema":{"type":"string"}},{"name":"year","in":"query","schema":{"type":"integer"}},{"name":"currency","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"format","in":"query","schema":{"type":"string","enum":["csv","json"],"default":"json"}}],"responses":{"200":{"description":"Fakturarader (belopp i kronor)"},"400":{"description":"Inget filter angivet"},"404":{"description":"Ingen träff"}}}},"/api/kronan/{actor}":{"get":{"summary":"Fas B — kedjan beslut→tilldelning→leverantör→fakturavolym för en aktör","parameters":[{"name":"actor","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9-]{1,80}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":30}},{"name":"format","in":"query","schema":{"type":"string","enum":["csv","json"],"default":"json"}}],"responses":{"200":{"description":"Kedja med provenance (link_level: vendor)"},"400":{"description":"Ogiltigt aktörs-slug"},"404":{"description":"Ingen upphandlingskedja hittad"}}}},"/api/procurement/competition":{"get":{"summary":"M02 — enbérsandel per köpare (minst 20 upphandlingar), beskrivande signal","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":15}}],"responses":{"200":{"description":"rows, eller data_available:false om anbudsdata saknas i källan"},"404":{"description":"Ingen data"}}}},"/api/persons":{"get":{"summary":"Proxy mot p0lytics persons-tjänsten (tailnet)","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":80}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":200,"default":50}}],"responses":{"200":{"description":"data: []"},"502":{"description":"Upstream ej nåbar eller icke-OK"}}}},"/api/live/stream":{"get":{"summary":"SSE-flöde för live-blogg — reconnect via Last-Event-ID, sequence-baserad dedupe (§42)","parameters":[{"name":"blog","in":"query","schema":{"type":"string"},"description":"live-blogs.slug — filtrerar till en specifik live-blogg (annars den med status \"live\")"},{"name":"Last-Event-ID","in":"header","schema":{"type":"integer","default":0},"description":"Reconnect: skicka bara entries med sequence > detta värde"}],"responses":{"200":{"description":"text/event-stream — initial snapshot av entries, avslutas med ett \"done\"-event"}}}},"/rss.xml":{"get":{"summary":"Global RSS","responses":{"200":{"description":"RSS 2.0"}}}},"/atom.xml":{"get":{"summary":"Global Atom-feed","responses":{"200":{"description":"Atom 1.0"}}}},"/feed.json":{"get":{"summary":"Global JSON Feed","responses":{"200":{"description":"JSON Feed 1.1"}}}},"/news-sitemap.xml":{"get":{"summary":"Google News sitemap","responses":{"200":{"description":"XML"}}}},"/sitemap.xml":{"get":{"summary":"Full sitemap","responses":{"200":{"description":"XML"}}}},"/sitemap-index.xml":{"get":{"summary":"Sitemap-index (refererar sitemap.xml/news-sitemap.xml/entities-sitemap.xml)","responses":{"200":{"description":"XML"}}}},"/entities-sitemap.xml":{"get":{"summary":"Sitemap för politiker-entiteter (person-sidor)","responses":{"200":{"description":"XML"}}}}},"x-event-catalog":{"description":"AsyncAPI-katalog: press.article.published, press.vote.imported, press.dataset.version_created m.fl. (§85). Outbox i Payload."}}