Publicerad: 28 maj 2024
Teknisk beskrivning av resultatfiler
Denna tekniska beskrivning riktar sig till den som vill ta del av Valmyndighetens resultatfiler i JSON-format från valet till Europaparlamentet 2024.
Beskrivningen innehåller även information om simuleringar av valresultatet som Valmyndigheten gör inför valet, som allmänheten får ta del av.
Gränssnittet utgörs av en enkel access direkt till allmänt tillgängliga resultatfiler på Valmyndighetens webbplats. Tanken med dokumentationen är att beskriva hur man kommer åt filerna och vad de innehåller.
Resultatfilerna
Filformat
Resultatet levereras i två zip-filer. Den ena zip-filen innehåller data från den preliminära rösträkningen, som sker redan på valkvällen och fortsätter under onsdagen efter valdagen (uppsamlingsräkning av sent inkomna förtidsröster och brevröster), medan den andra filen innehåller data från den slutliga rösträkningen som pågår under hela veckan efter valdagen.
Zip-filerna innehåller resultatet uppdelat i tre olika filtyper: röstfördelning, mandatfördelning och summering – alla i json-format. Storleken på zip-filerna rör sig runt några enstaka MB. Respektive json-fil kan däremot uppackad gå mot 150 MB. Json-filerna kommer även att kompletteras med sha256-filer för validering.
Räkningstillfällen
Zipfil för preliminärt räkningstillfälle
Uppdateras kontinuerligt med valresultat som räknas under valkvällen och in på natten mot måndagen. Efter valnattsräkningen pausas uppdateringarna men återupptas under uppsamlingsräkningen följande onsdag, då de sena förtidsrösterna räknas.
Observera att det första preliminära valresultatet kommer att levereras när samtliga vallokaler i EU har stängt kl. 23.00.
Endast så kallade rapportpartier (partier som förväntas kunna ta mandat) ingår i det här räkningstillfället. Personröster redovisas inte.
EU-val_2024_preliminar_00_E.zip innehåller:
- EU-val_2024_preliminar_mandatfordelning_00_E.json
- EU-val_2024_preliminar_mandatfordelning_00_E_sign.sha256
- EU-val_2024_preliminar_rostfordelning_00_E.json
- EU-val_2024_preliminar_rostfordelning_00_E_sign.sha256
- EU-val_2024_preliminar_summering_00_E.json
- EU-val_2024_preliminar_summering_00_E_sign.sha256
Zipfil för slutligt räkningstillfälle
Uppdateras kontinuerligt med det slutliga valresultatet med start på måndagen efter valet tills räkningen är klar och resultatet fastställt. Uppdateringarna av det slutliga resultatet kommer alltså att överlappa med uppdateringarna av det preliminära resultatet. Innan resultatet är fastställt bör även dessa siffror behandlas som ett preliminärt resultat.
Samtliga partier ingår i det här räkningstillfället och personröster redovisas.
- EU-val_2024_slutlig_00_E.zip innehåller:
- EU-val_2024_slutlig_mandatfordelning_00_E.json
- EU-val_2024_slutlig_mandatfordelning_00_E_sign.sha256
- EU-val_2024_slutlig_rostfordelning_00_E.json
- EU-val_2024_slutlig_rostfordelning_00_E_sign.sha256
- EU-val_2024_slutlig_summering_00_E.json
EU-val_2024_slutlig_summering_00_E_sign.sha256
Filtyper
Röstfördelningsfil
Innehåller röster per valdistrikt och alla metadata om rapporteringen på valdistriktsnivå. Filerna för det slutliga räkningstillfället kommer även att innehålla personröster.
Mandatfördelning
Innehåller röster aggregerade på riksnivå för att kunna genomföra mandatfördelningen. Filerna för det slutliga räkningstillfället kommer även att innehålla namn på valda och ersättare, samt de data som behövs för att utse dessa.
Summering (under utveckling)
Innehåller summering på nivåer (exempelvis kommun och län) som inte krävs för att räkna ut valresultat och mandatfördelning, men som kan vara av intresse för allmänheten.
Namnsättning
Såväl zip- som json-filer är döpta enligt följande mönster:
- Valets namn ”EU-val_2024”.
- Räkningstillfälle, ”preliminär” eller ”slutlig”.
- Valområdeskod. Endast koden ”00” är aktuell för val till EU-parlamentet.
- Valtillfälleskoden E.
Exempel på hur du kan ladda ner filerna
Här nedan följer ett exempel på hur du kan ladda ner filerna. Det finns andra sätt, men det här sättet följer Valmyndighetens rekommendationer.
Indexfilen ”index.md5” innehåller i normalfallet 622 rader, en rad per valområde (311st) och räkningstillfälle (preliminär/slutlig). Tanka hem den först.
# GET https://resultat.val.se/resultatfiler/index.md5
$ cat ./resultatfiler/index.md5
ea00fd822b3a4109753e0a5334fdd5d9 *./p/kf/Val_20220911_preliminar_2584_KF.zip
721fbd8bea159b87dc4857d737e34f14 *./p/rd/Val_20220911_preliminar_00_RD.zip
4a4480fdf74ad86c1283be721b62e49f *./p/rf/Val_20220911_preliminar_01_RF.zip
7e569741347101a7d8f860ac074a39b5 *./s/kf/Val_20220911_slutlig_2584_KF.zip
7167df1b70dc7a015e8d9621f8150e76 *./s/rd/Val_20220911_slutlig_00_RD.zip
91360737c479099dc5560862f9b4c860 *./s/rf/Val_20220911_slutlig_01_RF.zip
Genom att jämföra index-filer går det sedan att identifiera och genomföra nedladdning av de filer som har ändrats, till exempel så här:
$ diff index.md5 tmp/index.md5 | grep "^>" | cut -d* -f2
./p/rd/Val_20220911_preliminar_00_RD.zip
./p/rf/Val_20220911_preliminar_01_RF.zip
./s/kf/Val_20220911_slutlig_2584_KF.zip
Nedladdning
Inför valet 2022 tillhandahöll vi en indexfil (index.md5) för att se vilka resultatfiler som uppdaterats. Då behövde man inte ladda ner 622 zip-filer varje gång och kunde spara bandbredd. Inför valet till EU-parlamentet har vi bara två filer och förfarandet med indexfilen är valfritt. Vill man utveckla eller återanvända indexfilsfunktionaliteten så beskrivs det här. Om inte kan man åtminstone använda filen för att bekräfta var resultatfilerna är belägna.
Indexfilen ger dig information om vilka resultatfiler som finns att ladda ner, dess relativa sökväg samt en checksumma. Jämför checksumman inför varje nedladdning och avgör på så sätt vilka filer som behöver uppdateras.
Exempel
Indexfilen ”index.md5” innehåller i normalfallet två rader, en rad per valområde (ett valområde för EU-valet) och räkningstillfälle (preliminär eller slutlig). Tanka hem den först.
# GET https://resultat.val.se/resultatfiler/euval2024/index.md5
$ cat ./resultatfiler/euval2024/index.md5
721fbd8bea159b87dc4857d737e34f14 ./p/e/EU-val_2024_preliminar_00_E.zip
7167df1b70dc7a015e8d9621f8150e76 ./s/e/EU-val_2024_slutlig_00_E.zip
Genom att jämföra index-filer går det sedan att identifiera de filer som har ändrats, till exempel så här:
$ diff index.md5 tmp/index.md5 | grep "^>" | cut -d* -f2
./p/e/EU-val_2024_preliminar_00_E.zip
./s/e/EU-val_2024_slutlig_00_E.zip
Validering av valresultatsfiler
Genom att följa dessa instruktioner kan man säkerställa valresultatfilernas autenticitet och att filerna inte har modifierats av någon utomstående.
Varje valresultatsfil i en zip-fil ska ha en motsvarande signaturfil med identiska namn förutom att ändelsen slutar på "_sign.sha256" istället för ".json". Till exempel: En fil med namnet "EU-val_2024_slutlig_mandatfordelning_00_E.json" ska ha en motsvarande signaturfil som heter "EU-val_2024_slutlig_mandatfordelning_00_E_sign.sha256".
Dessa signaturfiler kan i kombination med en publik nyckel användas för att validera äktheten med hjälp av exempelvis OpenSSL. Den publika nyckeln tas fram genom att först ladda ner ett certifikat från Valmyndighetens webbplats:
https://resultat.val.se/keys/val-sign-crt.pem Länk till annan webbplats.
Skriv sedan följande kommando i din terminal (notera att OpenSSL måste vara installerat på din dator):
openssl x509 -pubkey -noout -in val-sign-crt.pem > publik_nyckel.pem
Därefter kan valresultatfilernas autenticitet valideras genom att skriva följande kommando:
openssl dgst –sha256 -verify <publiknyckel> -signature <signaturfil> <resultatsfil>
Exempelvis så här:
openssl dgst –sha256 -verify publik_nyckel.pem –signature EU-val_2024_slutlig_mandatfordelning_00_E_sign.sha256 EU-val_2024_slutlig_mandatfordelning_00_E.json
Filen är autentisk om OpenSSL svarar med "Verified OK". Om OpenSSL svarar med "Verified Failure" har antingen något verifikationssteg gått fel eller så har filerna modifierats från någon utomstående part.
Instruktioner: validering av valresultatsfiler
Genom att följa dessa instruktioner kan du säkerställa valresultatfilernas autenticitet – och att filerna inte har modifierats av någon utomstående person eller grupp.
Valresultatfilerna ska ha en motsvarande signaturfil
Varje valresultatsfil i en zip-mapp ska ha en motsvarande signaturfil med identiska namn förutom att ändelsen slutar på "_sign.sha256" istället för ".json". Till exempel en fil med namnet "Val_20220912_slutlig_mandatfordelning_00_RD.json" ska ha en motsvarande signaturfil som heter "Val_20220912_slutlig_mandatfordelning_00_RD_sign.sha256".
Dessa signaturfiler kan, i kombination med en publik nyckel, användas för att validera äktheten med hjälp av till exempel OpenSSL. Det är ett verktyg med öppen källkod som bland annat används för allmän kryptografi och säker kommunikation.
Skapa publik nyckel och skriv kommando
Den publika nyckeln tas fram genom att först ladda ner ett certifikat från Valmyndigheten.
Ladda ner certifikat Länk till annan webbplats.
Certifikatet behövs för att generera nyckeln och sedan skriva följande kommando i din terminal. (notera att OpenSSL måste vara installerat på din dator):
“openssl x509 -pubkey -noout -in val-sign-crt.pem > publik_nyckel.pem”
Därefter kan valresultatsfilernas autenticitet valideras genom att skriva följande kommando:
"openssl dgst -sha256 -verify <publiknyckel> -signature <signaturfil> <resultatsfil>"
På följande sätt kan det se ut med infogade exempelfiler:
"openssl dgst -sha256 -verify publik_nyckel.pem -signature Val_20220912_slutlig_mandatfordelning_00_RD_sign.sha256 Val_20220912_slutlig_mandatfordelning_00_RD.json"
OpenSSL verifierar om filen är autentisk eller inte
Filen är autentisk om OpenSSL svarar med "Verified OK". Om OpenSSL svarar med "Verified Failure", har antingen något verifikationssteg utförts ofullständigt eller har filerna modifierats från någon utomstående part.
Bekräfta certifikatets autencitet
Certifikatet är utfärdat av ExpiTrust till Valmyndigheten och detta går att bekräfta genom att ladda ner ExpiTrust EID CA v4 certifikatet från https://eid.expisoft.se/nya-ca/expitrust-eid-ca-v4/ och skriva följande kommandon i din terminal:
“openssl x509 -inform der -in ExpiTrust-EID-CA-v4.cer -out ExpiTrust-EID-CA-v4.pem”
“openssl verify -CAfile ExpiTrust-EID-CA-v4.pem val-sign-crt.pem”
Om OpenSSL svarar med ”val-sign-crt.pem: OK” är allt som det ska och certifikatets härkomst och autenticitet har verifierats.
Simuleringar innan valet
För att testa era och Valmyndighetens egna lösningar kommer Valmyndigheten att köra publika simuleringar med start 20 maj. De är öppna för alla. Även Valmyndighetens valresultatpresentation kommer att ingå i simuleringarna och visa upp testdata.
För testomgångarna kallar vi valet för "genrep2024". Utgå från följande fil:
Indexfil som beskriver vilka filer som finns att ladda ner Länk till annan webbplats.
Var medveten om att simuleringarna kan bli försenade.
Preliminära dagar och tider
Måndag 20 maj, Valkväll och Uppsamlingsräkning
13.00: första resultaten kommer, 5000 distrikt på samma gång
13.30-14.30: resten av de preliminära resultaten kommer in
15.00-16.00: Uppsamlingsräkningen, motsvarande onsdagens resultat
Torsdag 23 maj, Slutligt resultat och protokoll
11.00-15.00: Slutliga resultat kommer in med varierande intervall
Måndag 27 maj, Valkväll och Uppsamlingsräkning
13.00-14.30: Valkvällsresultat
15.00-16.00: Uppsamlingsräkningen, motsvarande onsdagens resultat
Onsdag 29 maj, Slutligt resultat och protokoll
11.00-15.00: Slutliga resultat kommer in med varierande intervall
Måndag 3 juni, Valkväll och Uppsamlingsräkning
13.00-14.30: Valkvällsresultat
15.00-16.00: Uppsamlingsräkningen, motsvarande onsdagens resultat
Onsdag 5 juni, Slutligt resultat och protokoll
11.00-15.00: Slutliga resultat kommer in med varierande intervall
De json-filer som skickas ut under simuleringarna kommer att ha attributet ”test” satt till true. När filerna sedan uppdateras under valet kommer detta attribut inte att finnas kvar.
Beskrivning av fälten i json-filerna
Nedanstående lista är långt ifrån fullständig, men större delen av attributen bör vara självförklarande. Några av dem behöver dock förtydligas och vi hoppas att detta är tillräckligt för att göra filerna begripliga.
Fälten innehåller data som i regel förutsägbart representeras av textsträngar eller siffror. Vissa sifferfält som ”partikod” med potentiellt inledande nollor representeras dock som textsträngar. Enstaka fält av boolesk natur förekommer också som inte alltid följs av ett true eller false. Exempelvis kan fältet ”deltaMandatfordelning” vara ”ja” eller ”nej” och fältet ”test” kan vara antingen true eller icke-existerande.
Notera att fält som bara räknas vid den slutliga rösträkningen enbart redovisas i den slutliga rösträkningsfilen. Viss skillnad mellan filerna förekommer alltså, även om objektstrukturerna bör följa liknande mönster.
Mandatfördelningsfilen
valtillfalle | Vid valet till EU-parlamentet är detta "EU-val_2024". |
---|---|
valklass | Anger om valet är ordinarie, omval eller extraval. |
rakningstillfalle | "slutlig" eller "preliminar". |
valtyp | ”E” för val till Europaparlamentet. |
test | Sätts till true för testdata. Attributet tas bort helt i produktion. |
antalUppdateringar | Versionsräknare som startar på 0. Det finns inget krav på att ackumulera samtliga versioner utan den senaste gäller. |
valomrade. | |
kod | Valområdets kod. "00" för riket och det enda som anges för val till EU-parlamentet. |
rapporteringsTid | Datum och klockslag som valresultatet tagits emot och registrerats hos Valmyndigheten. Anges på formatet [ÅÅÅÅ-MM-DDTtt:mm:ss]. |
lankTillProtokoll | När resultatet är fastställt publiceras en länk till protokollet här. |
meddelandetex | Används internt om specifika meddelanden behöver publiceras på Valmyndighetens webbplats. |
valomradeskodForegaendeVal | Används intern för historisk jämförelse. |
statusJamforelse | Anger om historiska jämförelser har gjorts. Möjliga jämförelser är föruträknade i valresultatet. |
kvalificeradeForPersonvalLista | De kandidater som klarat spärren för personval. Det betyder dock inte att de har blivit valda. |
| Hur ledamoten valts enligt VALD_PERSONROSTER = 1, VALD_JAMFORELSETAL = 2, VALD_PERSONROSTER_DUBBELVALSAVVECKLING = 3, VALD_JAMFORELSETAL_DUBBELVALSAVVECKLING = 4, VALD_PERSONROSTER_EFTERTRADARE = 5, VALD_LISTTROGEN_EFTERTRADARE = 6, VALD_EJ_LISTTROGEN_EFTERTRADARE = 7, VALD_PERSONROSTER_FLYTTAT_MANDAT = 8, VALD_JAMFORELSETAL_FLYTTAT_MANDAT = 9, ERSATTARE_PERSONROSTER = 10, ERSATTARE_LISTTROGEN = 11, ERSATTARE_EJ_LISTTROGEN_JAMFORELSETAL = 12, ERSATTARE_PERSONROSTER_ANNAN_VALKRETS = 13, ERSATTARE_JAMFORELSETAL_ANNAN_VALKRETS = 14, NY_LEDAMOT_PERSONROSTER = 15, NY_LEDAMOT_LISTTROGEN = 16, NY_LEDAMOT_EJ_LISTTROGEN_JAMFORELSETAL = 17, MY_LEDAMOT_PERSONROSTER_ANNAN_VALKRETS = 18, NY_LEDAMOT_JAMFORELSETAL_ANNAN_VALKRETS = 19 |
valomrade.rostfordelning.rosterpaverkarmandat.partiroster. | |
partibeteckning | Partiets namn. |
| Officiell kod för varje registrerat parti. |
fargkod | Hexadecimal färgkod registrerad av partiet. |
ordningsnummer | Officiellt ordningsnummer för rapportpartier. |
deltaMandatfordelning | "ja": partiet har klarat spärren och deltar i beräkning av mandat. "nej": partiet har inte klarat spärren och deltar inte i beräkning av mandat. |
valomrade.rostfordelning.rosterpaverkarmandat. | |
rosterOvrigaPartier | Vid preliminär rösträkning är dessa röster icke-rapportpartier. Vid slutlig rösträkning definieras de här rösterna som röster på partier som saknar valsedlar och som man väljer att inte särredovisa. Resterande partier redovisas under Partiröster. |
valomrade.rostfordelning. | |
rosterEjPaverkaMandat | Blankröster, ogiltiga röster och röster på partier som inte anmält deltagande. |
Röstfördelningsfilen
Består i huvudsak av fält som motsvarar mandatfördelningsfilen men ett par fält kan behöva nämnas.
valdistrikt. | |
---|---|
valdistrikttyp | "valdistrikt" eller "uppsamlingsdistrikt". |
meddelandetext | Som i mandatfördelningsfilen men med skillnaden att ett tomt meddelande inte genererar något fält överhuvudtaget. |
valdeltagandeVallokal | Andel räknade röster av röstberättigade i valdistriktet. Uppsamlingsdistrik sätt till null. |