Översikt
API:et låter kommuner, regioner och andra organisationer skicka digital post direkt från sina verksamhetssystem, med Ekopost som utskickstjänst. Det följer SKR:s gemensamma API-specifikation för digital post från verksamhetssystem (Digital post REST-API, version v1).
Ekopost som utskickstjänst
Verksamhetssystemet skickar meddelandet till Ekopost. Ekopost kontrollerar innehållet, väljer kanal – digital brevlåda eller fysisk post – och levererar försändelsen.
Ekopost-specifika val
Utöver specifikationen kan du skicka REK, skyddad post och hämta adresser från folkbokföringen. Valen
anges i metaData.other, se Ekopost-specifika val.
Operationer
Bas-URL: https://api.ekopost.se/gn
| Operation | Anrop | Autentisering | Beskrivning |
| hasAvailableMailbox | POST /gn/has-available-mailbox | mTLS + JWT | Kontrollerar om mottagare kan nås digitalt. |
| sendDigitalMail | POST /gn/send-digital-mail | mTLS + JWT | Skickar ett brev. |
| sendDigitalInvoice | POST /gn/send-digital-invoice | mTLS + JWT | Skickar en faktura eller påminnelse. |
| apiInfo | GET /gn/api-info | mTLS | Information om API:et. |
Format
- Anrop och svar är JSON i UTF-8. Ange
Content-Type: application/json. - Fältnamnen skrivs i camelCase enligt specifikationen. Ekoposts övriga API använder snake_case, så modellerna kan inte delas mellan API:erna.
- Datum anges som
ÅÅÅÅ-MM-DDoch tidpunkter enligt ISO 8601 i UTC. - Fält utan värde utelämnas i svaren.
- Fel returneras som
application/problem+json, se Felhantering.
Exempel på headers
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json; charset=UTF-8
Flöde
-
Kontrollera mottagaren (valfritt)
hasAvailableMailbox visar om mottagaren kan nås digitalt. -
Skicka meddelandet
sendDigitalMail för brev och sendDigitalInvoice för fakturor, med ett uniktmessageId. -
Ekopost tar emot försändelsen
Ekopost validerar anropet, väljer kanal och registrerar försändelsen. Svaret innehållerdistributionIdochtimeStamp. -
Leverans
Leveransen till brevlåda, bank eller tryck sker efter svaret. Spara id:na i svaret för uppföljning, se Ekopost-tillägg i svaret.
Kom igång
För att ansluta behöver organisationen:
- ett Ekopost-konto,
- ett klientcertifikat (X.509) med organisationsnumret, som Ekopost registrerar på kontot, se Klientcertifikat,
- för digital leverans: Mina meddelanden eller Kivra som kontots primära kanal, se Avsändare och kanal.
Kontakta hejsan@ekopost.se för att komma igång. Du kan börja testa i sandbox innan certifikatet är på plats, se Testa i sandbox.
Testa i sandbox
I Ekoposts sandbox kan du testa operationerna utan klientcertifikat och organisations-JWT. Sandbox nås
via http://api.sandbox.ekopost.se/gn (utan https), och inget som skickas där levereras till
mottagarna.
- Skapa ett sandbox-konto och en API-nyckel, se Sandbox i Ekoposts API-dokumentation.
-
Autentisera med
Authorization: api-key <nyckel>i stället för certifikat och JWT. - I övrigt fungerar API:et som i produktion. Bland annat ska avsändar-id:t höra till en kanal som är uppsatt på sandbox-kontot, se Avsändare och kanal.
- API-nyckel godtas bara i sandbox. I produktion krävs alltid klientcertifikat och organisations-JWT, och de kan inte testas i sandbox.
Exempel på anrop i sandbox (RAW)
POST /gn/has-available-mailbox HTTP/1.1
Host: api.sandbox.ekopost.se
Authorization: api-key YiuyotGtRNDXik56lgq6
Content-Type: application/json; charset=UTF-8
{
"organizationNumber": "5555555555",
"recipientId": [
"199912312387"
]
}
Avsändare och kanal
Avsändar-id:t i anropet avgör vilken digital kanal Ekopost använder och skickas vidare som avsändare i
den kanalen. Det är messageHeader.sender.senderId i sendDigitalMail och
sendDigitalInvoice, och organizationNumber i hasAvailableMailbox.
| Avsändar-id | Känns igen på | Kanal | Krav på kontot |
| Organisationsnummer |
NNNNNN-NNNN, 10 siffror eller 12 siffror som börjar med 16. En
juridisk person (tredje siffran är 2 eller högre) med giltig kontrollsiffra.
|
Mina meddelanden | Mina meddelanden är kontots primära kanal. |
| Kivras tenant key | 32–64 hexadecimala tecken. | Kivra | Kivra är kontots primära kanal. |
Per operation
-
hasAvailableMailbox: uppslaget görs i kanalen för
organizationNumber. Använd samma avsändar-id som i utskicket, så gäller svaret den kanal brevet eller fakturan skickas i. - sendDigitalMail: ett organisationsnummer eller en tenant key. Kan avsändar-id:t inte användas digitalt, för att kanalen inte är kontots primära kanal eller för att värdet varken är ett organisationsnummer eller en tenant key, skickas brevet som fysisk post, precis som när mottagaren inte kan nås digitalt. Vid fysisk post spelar avsändar-id:t ingen roll.
- sendDigitalInvoice: samma som för sendDigitalMail. Kan avsändar-id:t inte användas digitalt skickas fakturan som fysisk post, se Kanalval för fakturor.
Bra att veta
- Avsändar-id:t jämförs inte med kontots organisationsnummer. Organisationen identifieras av klientcertifikatet och organisations-JWT:n.
-
Ett organisationsnummer skickas vidare till Mina meddelanden med 12 siffror och
16först, till exempel165555555555, oavsett om det anges med 10 eller 12 siffror. En tenant key skickas som den är. - Är kanalen inte uppsatt på kontot svarar hasAvailableMailbox 400 på fältet. Brev och fakturor skickas i stället som fysisk post.
- Ett felskrivet organisationsnummer, till exempel med fel kontrollsiffra, känns inte igen: hasAvailableMailbox svarar 400 på fältet, och brev och fakturor skickas som fysisk post. Kontrollera formatet om en försändelse oväntat skickas som fysisk post.
Säkerhet
Varje anrop autentiseras i två lager enligt specifikationen: ett klientcertifikat (mTLS) och en organisations-JWT som den avsändande organisationen signerar. apiInfo kräver bara klientcertifikat.
Ekoposts övriga autentiseringsmetoder (api-key, Basic och OAuth2) gäller inte för /gn.
Undantaget är sandbox, där en API-nyckel används för test, se Testa i sandbox.
Klientcertifikat (mTLS)
Certifikatet presenteras i TLS-handskakningen (TLS 1.2 eller senare). Ekopost godkänner anslutningen när certifikatet:
- är registrerat hos Ekopost på organisationens konto och inte är spärrat,
- är inom sin giltighetstid,
-
innehåller organisationsnumret i subject, i attributet
organizationIdentifier(OID 2.5.4.97, till exempelNTRSE-5555555555) ellerserialNumber(OID 2.5.4.5), - har samma organisationsnummer som kontot det är registrerat på.
Varje anslutning loggas med certifikatets organisationsnummer, serienummer, tidpunkt och eventuell orsak till att den nekades. Vid nekad anslutning svarar API:et 401 utan att ange orsaken. Kontakta Ekopost om ett certifikat nekas.
Organisations-JWT
POST-operationerna kräver också en JWT i Authorization-headern. Organisationen skapar och
signerar token själv med den privata nyckeln till samma klientcertifikat som används för mTLS. Ekopost
verifierar signaturen mot certifikatets publika nyckel.
Authorization: Bearer <token>
| Fält | Krav | Beskrivning |
| alg | Obligatorisk |
RS256, RS384 eller RS512 för RSA-nycklar.
ES256, ES384 eller ES512 för EC-nycklar, där kurvan ska
vara P-256, P-384 respektive P-521. none och HMAC (till exempel HS256)
godtas inte.
|
| typ | Valfri | JWT |
| Claim | Krav | Beskrivning |
| sub | Obligatorisk |
Organisationens organisationsnummer: NNNNNN-NNNN, 10 siffror eller 12 siffror som
börjar med 16, med giltig kontrollsiffra. Måste vara samma organisation som i
klientcertifikatet.
|
| exp | Obligatorisk | Utgångstid i sekunder sedan 1970-01-01 UTC. |
| nbf | Valfri | Tidpunkt då token börjar gälla, i sekunder sedan 1970-01-01 UTC. |
Övriga claims, till exempel iat och jti, tas emot men kontrolleras inte.
Ekopost tillåter en minuts tidsavvikelse. Ge token kort giltighetstid och skapa en ny när den har gått
ut. Diggs REST API-profil rekommenderar högst 5 minuter.
Exempel på innehåll i token
// Header
{
"alg": "RS256",
"typ": "JWT"
}
// Payload
{
"sub": "5555555555",
"iat": 1791187200,
"exp": 1791187500
}
Exempel: skapa token (C#)
Exemplen kräver .NET Framework 4.7.2 eller senare, eller .NET 6 eller senare.
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
public static class OrgJwt
{
// Signerar en organisations-JWT (RS256) med den privata nyckeln till klientcertifikatet
public static string Create(X509Certificate2 certificate, string organisationNumber)
{
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var header = Base64Url(Encoding.UTF8.GetBytes("{\"alg\":\"RS256\",\"typ\":\"JWT\"}"));
var payload = Base64Url(Encoding.UTF8.GetBytes(
"{\"sub\":\"" + organisationNumber + "\",\"iat\":" + now + ",\"exp\":" + (now + 300) + "}"));
using (var rsa = certificate.GetRSAPrivateKey())
{
var signature = rsa.SignData(
Encoding.ASCII.GetBytes(header + "." + payload),
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
return header + "." + payload + "." + Base64Url(signature);
}
}
private static string Base64Url(byte[] bytes)
{
return Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_');
}
}
Exempel: anropa API:et (C#)
// Certifikatet med privat nyckel används både för mTLS och för att signera token
var certificate = new X509Certificate2("organisation.pfx", "lösenord");
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate); // mTLS
var client = new HttpClient(handler); // återanvänd samma klient för alla anrop
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.ekopost.se/gn/has-available-mailbox");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", OrgJwt.Create(certificate, "5555555555"));
request.Content = new StringContent(
"{\"organizationNumber\":\"5555555555\",\"recipientId\":[\"199912312387\"]}",
Encoding.UTF8,
"application/json");
var response = await client.SendAsync(request);
hasAvailableMailbox
Kontrollerar om en eller flera mottagare kan ta emot digital post från avsändaren. Används innan ett meddelande skapas, för att veta om digital leverans är möjlig.
Anrop
| Fält | Typ | Krav | Beskrivning |
| organizationNumber | String | Obligatorisk | Avsändar-id: ett organisationsnummer (Mina meddelanden) eller Kivras tenant key. Avgör vilken kanal som slås upp, se Avsändare och kanal. |
| recipientId | Array of String | Obligatorisk | 1–500 mottagare, var och en 12 siffror utan bindestreck: personnummer (ÅÅÅÅMMDDNNNN) eller organisationsnummer med 16 först (16NNNNNNNNNN). |
Exempel på anrop (RAW)
POST /gn/has-available-mailbox HTTP/1.1
Host: api.ekopost.se
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json; charset=UTF-8
{
"organizationNumber": "5555555555",
"recipientId": [
"199912312387",
"191212121212"
]
}
Svar
| Fält | Typ | Beskrivning |
| recipientId | String | Mottagarens id, som i anropet. |
| reachable | Boolean | true om mottagaren kan nås digitalt av avsändaren. |
Exempel på svar (RAW)
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
[
{
"recipientId": "199912312387",
"reachable": true
},
{
"recipientId": "191212121212",
"reachable": false
}
]
Så avgörs reachable
-
Uppslaget görs i den kanal som
organizationNumberpekar ut: Mina meddelanden eller Kivra, se Avsändare och kanal.reachableärtrueom mottagaren kan ta emot post från avsändaren där. - Använd samma avsändar-id som i utskicket, så gäller svaret den kanal brevet eller fakturan skickas i.
- Svaret har en rad per mottagare, i samma ordning som i anropet.
-
Om uppslaget mot kanalerna inte kan genomföras svarar API:et 500. Ett tekniskt fel rapporteras
aldrig som
reachable: false.
sendDigitalMail
Skickar ett brev med PDF-dokument. Ekopost levererar till mottagarens digitala brevlåda när det går och annars som fysisk post.
Anrop
| Fält | Typ | Krav | Beskrivning |
| messageHeader | MessageHeader | Obligatorisk | Mottagare, avsändare, ärende och adress. |
| attachments | Array of Attachment | Obligatorisk | Minst en PDF. Den första filen är huvuddokumentet, övriga är bilagor. Specifikationen tillåter brev utan fil, men Ekopost kräver en PDF. |
| bodyInformation | BodyInformation | Obligatorisk | Meddelandetext som visas i den digitala brevlådan. |
Exempel på anrop (RAW)
POST /gn/send-digital-mail HTTP/1.1
Host: api.ekopost.se
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json; charset=UTF-8
{
"messageHeader": {
"messageId": "6d4d5bba-9468-4e3e-bb34-0a14c586285a",
"recipientId": "199912312387",
"importantMessage": true,
"sender": {
"senderId": "5555555555",
"name": "A kommun"
},
"headerSubject": "Beslut om bygglov",
"postAddress": {
"name": "Bosse Bula",
"addressLineOne": "Storgatan 1",
"addressLineTwo": "Lgh 1101",
"zipCode": "12345",
"city": "Borgholm",
"country": "Sverige"
},
"supportInfo": {
"supportText": "Kontakta oss via e-post eller telefon.",
"contactInformationUrl": "https://www.example.se/kontakt",
"contactInformationPhoneNumber": "+46701234567",
"contactInformationEmail": "info@example.se"
},
"metaData": {
"senderAttention": "Bygg- och miljökontoret",
"sendingSystem": "System A",
"costCenter": "BYGG-123"
}
},
"attachments": [
{
"contentType": "application/pdf",
"body": "JVBERi0xLjQKJ...",
"filename": "beslut.pdf"
}
],
"bodyInformation": {
"contentType": "text/plain",
"body": "Hej! Här kommer beslutet om ditt bygglov."
}
}
Svar
DistributionIdentity med Ekoposts id för försändelsen,
tidpunkten då den registrerades och Ekoposts id:n i metaData.other, se
Ekopost-tillägg i svaret.
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"distributionId": "3f2c8e9a-1b4d-4c7e-9a2f-6d5e8b1c0a47",
"timeStamp": "2026-10-05T08:15:42.123Z",
"metaData": {
"other": [
{ "tag": "ekopost.campaignId", "value": "9b1e4c2a-0f3d-4e8b-a6c1-2d7f5e9b8a10" },
{ "tag": "ekopost.envelopeId", "value": "3f2c8e9a-1b4d-4c7e-9a2f-6d5e8b1c0a47" }
]
}
}
Kanalval
| Situation | Leverans |
importantMessage: true och mottagaren kan nås digitalt |
Digital brevlåda via Mina meddelanden eller Kivra, beroende på sender.senderId,
med meddelandetexten och PDF-filerna.
|
importantMessage: true och mottagaren kan inte nås digitalt, eller
sender.senderId kan inte användas digitalt
|
Fysisk post. |
importantMessage: false |
Fysisk post. |
ekopost.postalType: rek |
Rekommenderat brev (REK) som fysisk post, även om mottagaren kan nås digitalt. |
ekopost.postalType: protected och mottagaren kan inte nås digitalt |
Skyddad post. |
ekopost.addressLookup: guardian |
En försändelse till varje vårdnadshavare. |
Den digitala kanalen avgörs av messageHeader.sender.senderId, se
Avsändare och kanal. Taggarna ekopost.* beskrivs under
Ekopost-specifika val. E-post används inte som kanal:
emailAddress valideras men används inte för leverans.
Fysisk post
-
Fysisk post kräver
postAddressmedname,addressLineOne,zipCodeochcity. Adressen kontrolleras när Ekopost har valt fysisk post. Saknas den svarar API:et 400 med de fält som saknas. -
Adressen kan i stället hämtas från folkbokföringen med
ekopost.addressLookup: navet, se Adress från Navet. - Adressen skrivs på ett adressblad som läggs först i brevet, eller på första sidan om kontot är inställt för det.
- Meddelandetexten i
bodyInformationskrivs inte ut. Bara PDF-filerna skickas.
PDF-filer
Gäller både attachments för brev och files för fakturor.
contentTypeska varaapplication/pdfochbodyfilen BASE64-kodad.- Den första filen är huvuddokumentet. Alla dess sidor ska ha samma format: A4 eller Letter.
- Övriga filer är bilagor. Sidorna får vara A4 eller A3 (stående eller liggande) eller Letter.
- Filerna får inte vara skadade eller lösenordsskyddade.
Följ Ekoposts dokumentspecifikation och mall för marginaler för bästa resultat vid fysisk post.
Upprepade anrop (messageId)
messageId (UUID) identifierar meddelandet. Skickar samma organisation samma
messageId igen skapas ingen ny försändelse. Svaret innehåller i stället samma
distributionId, timeStamp och metaData som första gången. Det gör det
säkert att göra om
ett anrop efter till exempel en timeout. Innehållet i det upprepade anropet jämförs inte. Kommer två
anrop med samma messageId samtidigt väntar det andra tills det första är klart och får
sedan samma svar. Är det första anropet inte klart inom en minut svarar det andra
503 Service Unavailable med headern Retry-After. Gör om anropet efter
angiven tid.
Använd ett nytt messageId för varje nytt meddelande. Det gäller både brev och fakturor.
sendDigitalInvoice
Skickar en betalningsbar faktura eller påminnelse till Kivra, eller som brev med PDF:en till Mina meddelanden. Kan fakturan inte levereras digitalt skickas den som fysisk post.
Anrop
| Fält | Typ | Krav | Beskrivning |
| messageHeader | MessageHeader | Obligatorisk | Mottagare, avsändare och ärende. |
| invoiceBody | BodyInvoice | Obligatorisk | Fakturauppgifter. |
| files | Array of Attachment | Obligatorisk | Minst en PDF. Den första filen är fakturan, övriga är bilagor, se PDF-filer. |
Exempel på anrop (RAW)
POST /gn/send-digital-invoice HTTP/1.1
Host: api.ekopost.se
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json; charset=UTF-8
{
"messageHeader": {
"messageId": "0b1c6f2e-5a77-4e0f-9d3b-2f8a4c6e1d90",
"recipientId": "199912312387",
"sender": {
"senderId": "5555555555",
"name": "A kommun"
},
"headerSubject": "Faktura från A kommun",
"postAddress": {
"name": "Bosse Bula"
},
"supportInfo": {
"supportText": "Frågor om fakturan? Kontakta oss via e-post.",
"contactInformationEmail": "faktura@example.se"
}
},
"invoiceBody": {
"amount": 1234.50,
"currencyCode": "SEK",
"dueDate": "2026-11-30",
"paymentReferenceType": "SE_OCR",
"paymentReference": "426523791",
"accountType": "BANKGIRO",
"accountNumber": "12345",
"type": "INVOICE",
"reference": "Faktura 12345",
"payable": true
},
"files": [
{
"contentType": "application/pdf",
"body": "JVBERi0xLjQKJ...",
"filename": "faktura-12345.pdf"
}
]
}
Svar
DistributionIdentity, på samma sätt som för sendDigitalMail.
Kanalval för fakturor
Fakturor följer samma regler som brev, se Kanalval: digitalt när
importantMessage är true och mottagaren kan nås i den kanal som
messageHeader.sender.senderId pekar ut, annars fysisk post. Kanalen avgörs av
avsändar-id:t, se Avsändare och kanal.
| senderId | Leverans |
| Kivras tenant key | Kivra, som betalbar faktura eller påminnelse. Kräver currencyCode: SEK. |
| Organisationsnummer | Mina meddelanden, som ett brev med PDF-filerna. Mina meddelanden har inget fakturaformat, så betalningsuppgifterna finns bara i PDF:en. |
Kan fakturan inte levereras digitalt, för att importantMessage är false,
avsändar-id:t inte kan användas digitalt eller mottagaren inte kan nås i kanalen, skickas den som
fysisk post till postAddress, eller till adressen från Navet med
ekopost.addressLookup: navet. Betalningsuppgifterna finns då bara i PDF:en. Saknas
adressen svarar API:et 400 och inget skickas. REK, skyddad post och vårdnadshavare finns bara för
brev.
Fakturauppgifter
-
paymentReferenceType:SE_OCRför OCR-nummer ochTENANT_REFför annan betalningsreferens. -
referenceär fakturanummer eller rubrik. type: REMINDERskickas som påminnelse i Kivra.-
payable: falsevisar fakturan i Kivra utan möjlighet att betala. En betalningsbar faktura måste ha ett belopp större än 0, och i Kivra en förfallodag som inte har passerat.
apiInfo
Returnerar information om API:et. Kräver bara klientcertifikat, ingen JWT.
Svar
| Fält | Typ | Beskrivning |
| apiName | String | API:ets namn. |
| apiVersion | String | API-version. |
| apiReleased | Date | Datum då versionen publicerades. Utelämnas om det inte är angivet. |
| apiDocumentation | String (URI) | Länk till dokumentationen. Utelämnas om den inte är angiven. |
| apiStatus | String | API:ets status, till exempel active. |
Exempel på svar (RAW)
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"apiName": "Digital post REST-API",
"apiVersion": "v1",
"apiStatus": "active"
}
Ekopost-specifika val
Specifikationen tillåter fria nyckel/värde-par i messageHeader.metaData.other. Ekopost
använder två taggar för val som specifikationen saknar. I sendDigitalMail gäller alla värden. I
sendDigitalInvoice gäller bara ekopost.addressLookup: navet; rek,
protected och guardian ger 400 för fakturor.
| Tagg | Värden | Beskrivning |
| ekopost.postalType | standard (förval), rek, protected |
Typ av post: vanligt brev, rekommenderat brev eller skyddad post. |
| ekopost.addressLookup | navet, guardian |
Hämtar adresser från folkbokföringen (Navet). |
Taggar och värden är skiftlägesokänsliga och varje tagg får förekomma en gång. Okända taggar ignoreras,
så other kan även innehålla annan metadata. Ett ogiltigt värde ger 400.
Exempel
"metaData": {
"costCenter": "BYGG-123",
"other": [
{ "tag": "ekopost.postalType", "value": "rek" },
{ "tag": "ekopost.addressLookup", "value": "navet" }
]
}
REK
-
ekopost.postalType: rekskickar brevet som rekommenderat brev (REK), alltid som fysisk post, även om mottagaren kan nås digitalt. -
Adressen anges i
postAddresseller hämtas medekopost.addressLookup: navet. Uppfyller den inte kraven för REK svarar API:et 400. -
supportInfo.contactInformationEmailanvänds som avsändarens kontaktadress för försändelsen. Saknas den används kontots kontaktuppgifter. - REK är inte tillgängligt för konton med produktion i Norge.
Skyddad post
-
Med
ekopost.postalType: protectedlevereras brevet digitalt som vanligt om mottagaren kan nås digitalt. - Annars skickas det som skyddad post: ingen postadress används, och mottagarens personnummer skrivs i adressfältet.
- Kontot måste vara aktiverat för skyddad post, annars svarar API:et 400.
Adress från Navet
-
Med
ekopost.addressLookup: navethämtas mottagarens folkbokföringsadress när brevet eller fakturan ska skickas som fysisk post. Den används i stället förpostAddress. - Uppslaget görs bara när fysisk post används.
- Hittas ingen fullständig adress svarar API:et 404 och inget skickas.
Vårdnadshavare
-
Med
ekopost.addressLookup: guardianhämtas mottagarens vårdnadshavare från Navet, och varje vårdnadshavare får en egen försändelse. - Varje vårdnadshavare får brevet digitalt om det går, annars som fysisk post till sin folkbokföringsadress.
- Vårdnadshavarens namn och adress skrivs på dokumentet, även när brevet levereras digitalt. Adressen hamnar på ett adressblad som läggs först, eller på första sidan om kontot är inställt för det.
- Hittas inga vårdnadshavare, eller saknar någon av dem adress, svarar API:et 404 och inget skickas.
-
distributionIdär den första försändelsen. Svaret innehåller enekopost.envelopeIdper vårdnadshavare, se Ekopost-tillägg i svaret.
Kombinationer
| ekopost.postalType | ingen adresstagg | navet | guardian |
| standard | Ja | Ja | Ja |
| rek | Ja | Ja | Nej |
| protected | Ja | Nej | Nej |
En kombination som inte är tillåten ger 400.
Ekopost-tillägg i svaret
Svaret från sendDigitalMail och sendDigitalInvoice innehåller, utöver specifikationens
distributionId och timeStamp, id:na för det som skapades i Ekopost. De anges
som taggar i metaData.other, på samma sätt som valen i anropet. Fältet finns inte i
specifikationens svar, och klienter som inte känner till det kan ignorera det.
| Tagg | Antal | Värde |
| ekopost.campaignId | En | Id för utskicket (campaign) i Ekopost. |
| ekopost.envelopeId | En per försändelse |
Id för en försändelse som anropet skapade: en normalt, en per vårdnadshavare med
ekopost.addressLookup: guardian. Taggarna kommer i den ordning försändelserna
skapades, och den första är samma som distributionId.
|
Med id:na kan du följa varje försändelse i Ekoposts ordinarie API, till exempel med
Get envelope
(GET /campaigns/{campaign_id}/envelopes/{envelope_id}). Det ordinarie API:et
autentiseras med api-key, Basic eller OAuth2.
Objekt
Objekten följer specifikationen. Kolumnen Krav anger vad Ekopost kräver.
MessageHeader
| Fält | Typ | Krav | Beskrivning |
| messageId | String (UUID) | Obligatorisk | Unikt id för meddelandet, se Upprepade anrop. |
| recipientId | String | Obligatorisk | Mottagaren, 12 siffror utan bindestreck: personnummer (ÅÅÅÅMMDDNNNN) eller organisationsnummer med 16 först (16NNNNNNNNNN). |
| importantMessage | Boolean | Valfri, förval true |
true: digital brevlåda om det går, annars fysisk post. false:
fysisk post. Gäller både brev och fakturor.
|
| sender | Sender | Obligatorisk | Avsändaren. |
| headerSubject | String | Obligatorisk | Meddelandets ärende, högst 200 tecken. Används även som namn på utskicket i Ekopost. |
| postAddress | PostAddress | Villkorad | Krävs vid fysisk post, om adressen inte hämtas från Navet. |
| emailAddress | EmailAddress | Valfri | Valideras men används inte för leverans. |
| supportInfo | SupportInfo | Obligatorisk | Var mottagaren kan vända sig med frågor. |
| metaData | MetaData | Valfri | Metadata och Ekopost-specifika val. |
Sender
| Fält | Typ | Krav | Beskrivning |
| senderId | String | Obligatorisk | Avsändar-id i kanalen: ett organisationsnummer (Mina meddelanden) eller Kivras tenant key. Avgör kanalen, se Avsändare och kanal. |
| name | String | Obligatorisk | Avsändarens namn. |
PostAddress
| Fält | Typ | Krav | Beskrivning |
| name | String | Villkorad | Mottagarens namn, högst 250 tecken. Krävs vid fysisk post. |
| addressLineOne | String | Villkorad | Adressrad 1. Krävs vid fysisk post. Adressrad 1 och 2 får vara högst 249 tecken tillsammans. |
| addressLineTwo | String | Valfri | Adressrad 2. Adressrad 1 och 2 får vara högst 249 tecken tillsammans. |
| zipCode | String | Villkorad | Postnummer, högst 250 tecken. Krävs vid fysisk post. |
| city | String | Villkorad | Ort, högst 250 tecken. Krävs vid fysisk post. |
| country | String | Valfri | Land, högst 250 tecken. |
Fält som skickas får inte vara tomma.
EmailAddress
| Fält | Typ | Krav | Beskrivning |
| String | Obligatorisk om objektet skickas | Giltig e-postadress. |
SupportInfo
| Fält | Typ | Krav | Beskrivning |
| supportText | String | Obligatorisk | Hur mottagaren kan kontakta avsändaren. |
| contactInformationUrl | String (URI) | Valfri | Absolut URL med mer information. |
| contactInformationPhoneNumber | String | Valfri | Telefonnummer. |
| contactInformationEmail | String | Valfri | Giltig e-postadress, högst 255 tecken. Används som avsändarens kontaktadress vid REK. |
MetaData
| Fält | Typ | Krav | Beskrivning |
| senderAttention | String | Valfri | Enhet hos avsändaren, till exempel en förvaltning. Används inte i dagsläget. |
| sendingSystem | String | Valfri | Avsändande system, högst 100 tecken. Sparas på försändelserna och syns i Ekoposts statistik per system. |
| costCenter | String | Valfri | Kostnadsställe, högst 100 tecken. Sätts på utskicket i Ekopost. |
| campaignId | String | Valfri | Id som binder ihop flera utskick. Används inte i dagsläget. |
| other | Array of MetaDataOther | Valfri | Fria nyckel/värde-par. I anropet anges Ekopost-specifika val här, och i svaret Ekoposts id:n, se Ekopost-tillägg i svaret. |
MetaDataOther
| Fält | Typ | Krav | Beskrivning |
| tag | String | Valfri | Nyckel. |
| value | String | Valfri | Värde. |
Attachment
| Fält | Typ | Krav | Beskrivning |
| contentType | String | Obligatorisk | application/pdf, den enda tillåtna typen. |
| body | String | Obligatorisk | Filen BASE64-kodad. Se PDF-filer. |
| filename | String | Obligatorisk | Filnamn, högst 100 tecken. |
BodyInformation
| Fält | Typ | Krav | Beskrivning |
| contentType | String | Obligatorisk | text/plain eller text/html. |
| body | String | Valfri | Meddelandetext. Visas i den digitala brevlådan men skrivs inte ut vid fysisk post. |
BodyInvoice
| Fält | Typ | Krav | Beskrivning |
| amount | Number | Obligatorisk | Belopp att betala. Får inte vara negativt, och måste vara större än 0 om payable är
true. |
| currencyCode | String | Obligatorisk | Valuta enligt ISO 4217, till exempel SEK. Kivra tar bara emot SEK.
|
| dueDate | Date | Obligatorisk | Förfallodag, ÅÅÅÅ-MM-DD. En betalningsbar faktura som skickas till Kivra måste ha
dagens datum eller senare.
|
| paymentReferenceType | String | Obligatorisk | SE_OCR eller TENANT_REF. |
| paymentReference | String | Obligatorisk | Betalningsreferens, 1–25 tecken. |
| accountType | String | Obligatorisk | BANKGIRO eller PLUSGIRO. |
| accountNumber | String | Obligatorisk | Bankgiro- eller plusgironummer som betalningen ska gå till, högst 250 tecken. |
| type | String | Valfri, förval INVOICE |
INVOICE eller REMINDER. |
| reference | String | Valfri | Fakturanummer eller rubrik, högst 150 tecken. |
| payable | Boolean | Valfri, förval true |
Om fakturan kan betalas. |
Se Fakturauppgifter för hur fälten används.
DistributionIdentity
| Fält | Typ | Beskrivning |
| distributionId | String | Ekoposts id för försändelsen. Vid flera försändelser (vårdnadshavare) den första. |
| timeStamp | DateTime | Tidpunkt då Ekopost registrerade försändelsen, i UTC (ISO 8601). |
| metaData | MetaData |
Ekopost-tillägg: other innehåller taggarna ekopost.campaignId och
ekopost.envelopeId, se Ekopost-tillägg i svaret.
|
Problem
| Fält | Typ | Beskrivning |
| instance | String | Sökvägen som anropades. |
| type | String | Alltid about:blank. |
| status | Object | statusCode (HTTP-status) och reasonPhrase. |
| title | String | HTTP-statusens text, till exempel Bad Request. |
| detail | String | Beskrivning av felet. |
| violations | Array of Object |
Bara vid 400: ett objekt per fel, med field (sökväg i JSON, till exempel
attachments[0].body) och message.
|
Felhantering
Fel returneras med Content-Type: application/problem+json och objektet
Problem. Texterna i detail och violations är på
engelska.
| Status | Betydelse |
| 400 Bad Request |
Anropet bryter mot specifikationen eller Ekoposts regler. Exempel: saknade eller ogiltiga fält,
felaktig JSON, ett avsändar-id vars kanal inte är uppsatt för kontot (vid uppslag och fakturor),
ogiltiga Ekopost-taggar,
en PDF som inte kan läsas eller saknad adress vid fysisk post. violations listar
varje fel.
|
| 401 Unauthorized |
Klientcertifikatet saknas eller godkänns inte, eller organisations-JWT saknas eller är ogiltig.
Vid fel i JWT anger detail orsaken. I sandbox: API-nyckeln saknas eller är
ogiltig.
|
| 404 Not Found | Adress eller vårdnadshavare saknas i Navet. |
| 500 Internal Server Error |
Oväntat fel, till exempel att uppslaget mot brevlådorna inte gick att genomföra. Anropet kan
göras om med samma messageId.
|
| 503 Service Unavailable |
Ett tidigare anrop med samma messageId håller fortfarande på. Gör om anropet
efter tiden i Retry-After (sekunder) så får du samma svar som det första anropet.
|
Exempel: 400 Bad Request
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json; charset=utf-8
{
"instance": "/gn/send-digital-mail",
"type": "about:blank",
"status": {
"reasonPhrase": "Bad Request",
"statusCode": 400
},
"title": "Bad Request",
"detail": "The request is invalid. See violations for details.",
"violations": [
{
"field": "attachments[0].contentType",
"message": "Only application/pdf is allowed."
}
]
}
Exempel: 401 Unauthorized (JWT)
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
Content-Type: application/problem+json; charset=utf-8
{
"instance": "/gn/send-digital-invoice",
"type": "about:blank",
"status": {
"reasonPhrase": "Unauthorized",
"statusCode": 401
},
"title": "Unauthorized",
"detail": "The organisation JWT has expired."
}