Publicerad: 17 juni 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:

  1. Valets namn ”EU-val_2024”.
  2. Räkningstillfälle, ”preliminär” eller ”slutlig”.
  3. Valområdeskod. Endast koden ”00” är aktuell för val till EU-parlamentet.
  4. 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 gjordes ett antal simuleringar inför valet. De var öppna för alla. Även Valmyndighetens valresultatpresentation ingick i simuleringarna och användes för att visa upp testdata.

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.


valda.Ledamoter.valgrundId

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.


partikod

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.