Ik ben een Zivver-beheerder
Zivver instellen en beheren
Gegevens exporteren via API
Introductie
Exporteer alle Zivver-berichten die door je organisatie zijn verzonden en ontvangen voor archiveringsdoeleinden. Met deze methode kun je berichten exporteren via de Zivver API.
Deze exportmethode wordt aanbevolen voor:
- Organisaties met een groot aantal berichten
- Het exporteren van gegevens voor een subset van gebruikers
- Situaties waarin de ZIP-export niet geschikt is
Voor kleinere organisaties met een beperkt aantal berichten raden we aan om de Zivver WebApp-methode te gebruiken om alle berichten in een ZIP-bestand te exporteren via een Zivver-bericht.
API-overzicht
De onderstaande secties geven een overzicht van de API-endpoints die worden gebruikt voor het exporteren van gegevens. Nadat de API voor je organisatie is ingeschakeld, kun je deze endpoints gebruiken om je exports te beheren via een script of een API-client (bijvoorbeeld Postman). Alle endpoints vereisen authenticatie via een API-token, die je genereert in het Zivver-adminportaal.
De basis-URL voor alle endpoints is https://app.zivver.com/api, en alle verzoeken gebruiken de GET-methode.
/exports/mailbox
Met dit endpoint kun je een lijst ophalen van alle mailboxen binnen je organisatie. Dit endpoint is het startpunt van het exportproces, omdat je moet weten welke mailboxen je wilt exporteren.
Neem de volgende headers op in je verzoek:
Authorization: Bearer {API_TOKEN}Accept: application/json
/exports/mailbox/{email_address}
Gebruik dit endpoint om een lijst op te halen van maanden waarvoor er conversaties zijn in een specifieke mailbox. Dit helpt je te bepalen voor welke maanden gegevens beschikbaar zijn voor export.
Neem de volgende headers op in je verzoek:
Authorization: Bearer {API_TOKEN}Accept: application/json
/exports/mailbox/{email_address}/{year_month}
Dit endpoint haalt een lijst op van conversaties in een specifieke maand voor een specifieke mailbox. Hiermee kun je bepalen welke conversaties je wilt exporteren.
Neem de volgende headers op in je verzoek:
Authorization: Bearer {API_TOKEN}Accept: application/json
Dit is het enige lijst-endpoint met paginering. De andere lijst-endpoints geven alle items in één respons terug. Een respons bevat maximaal 100 conversaties in items. Als er meer conversaties zijn, bevat de respons ook een cursor-waarde:
- Om de volgende pagina op te halen, geef je de
cursor-waarde ongewijzigd mee alscursor-queryparameter in het volgende verzoek. De waarde is ondoorzichtig, dus probeer deze niet te interpreteren of aan te passen. - Als een respons geen
cursor-waarde bevat, heb je de laatste pagina bereikt. - De paginagrootte is vast op 100 conversaties en kan niet worden aangepast.
- Een ongeldige
cursor-waarde geeft status400terug metInvalid cursor parameter. - Een maand in een geldig
yyyyMM-formaat zonder conversaties geeft{"items": []}terug.
Het eerste verzoek geeft bijvoorbeeld 100 conversaties en een cursor-waarde terug. Het tweede verzoek, met die waarde, geeft de resterende conversaties terug en geen cursor, dus dit is de laatste pagina:
GET /exports/mailbox/jan@example.com/202603
GET /exports/mailbox/jan@example.com/202603?cursor=7f3e9c2a-...
/exports/mailbox/{email_address}/{year_month}/{conversationNameKey}
Gebruik dit endpoint om een lijst op te halen van berichten in een conversatie voor een specifieke maand en mailbox. Hiermee kun je de individuele berichten bekijken die onderdeel zijn van de conversatie.
Neem de volgende headers op in je verzoek:
Authorization: Bearer {API_TOKEN}Accept: application/json
/exports/mailbox/{email_address}/{year_month}/{conversationNameKey}/{messageNameKey}
Met dit endpoint kun je een specifiek bericht in een conversatie downloaden voor een specifieke maand en mailbox. Het bericht wordt gedownload in EML-formaat, dat geopend kan worden met e-mailclients of geïmporteerd kan worden in andere systemen.
Neem de volgende headers op in je verzoek:
Authorization: Bearer {API_TOKEN}Accept: application/octet-stream
Afleveringsbewijzen
Je kunt ook het afleveringsbewijs van elk bericht exporteren als PDF. Het rapport toont wanneer een bericht is verzonden, naar wie het is verzonden en wat er per ontvanger mee is gebeurd, zoals of het is afgeleverd en geopend. Gebruik het rapport om bewijs van aflevering samen met het bericht te archiveren, bijvoorbeeld in een documentbeheersysteem.
Vereisten voor afleveringsbewijzen
Zorg ervoor dat je aan de volgende vereisten voldoet voordat je begint:
- API-toegang is ingeschakeld voor je organisatie (zie API-overzicht)
- Het afleveringsbewijs is ingeschakeld voor je organisatie. Dit gebeurt apart van de API-endpoints, dus maak een supportticket aan om het voor je organisatie te laten inschakelen.
- Het API-token heeft de
export:read-permissie. Alle export-endpoints vereisen deze permissie en het/pod-endpoint heeft geen extra tokenpermissie nodig.
/exports/mailbox/{email_address}/{year_month}/{conversationNameKey}/{messageNameKey}/pod
Met dit endpoint download je het afleveringsbewijs van een specifiek bericht als PDF-bestand. Het endpoint gebruikt hetzelfde pad als het endpoint waarmee je het bericht downloadt, gevolgd door /pod. Gebruik voor elk deel van het pad de waarden die de andere export-endpoints teruggeven:
| Padparameter | Waarde | Teruggegeven door |
|---|---|---|
email_address | Te exporteren mailbox | /exports/mailbox |
year_month | Maand in yyyyMM-formaat | /exports/mailbox/{email_address} |
conversationNameKey | Naam van de conversatie | /exports/mailbox/{email_address}/{year_month} |
messageNameKey | Naam van het bericht, bijvoorbeeld 0001_20260115T093000Z.eml | /exports/mailbox/{email_address}/{year_month}/{conversationNameKey} |
Neem de volgende headers op in je verzoek:
Authorization: Bearer {API_TOKEN}Accept: application/pdfAccept-Language: {language}(optioneel, zie Taal van het rapport)
Alleen het berichtnummer aan het begin van messageNameKey wordt gebruikt om het bericht te vinden: minimaal vier cijfers gevolgd door een underscore, zoals 0001_. De rest van de naam kan veranderen nadat je de lijst hebt opgehaald, bijvoorbeeld wanneer een bericht wordt ingetrokken. Een berichtnaam die je eerder hebt opgeslagen, blijft geldig.
Taal van het rapport
De taal van het rapport volgt de Accept-Language-header. De volgende talen worden ondersteund:
| Taal | Code |
|---|---|
| Nederlands | nl |
| Engels | en |
| Frans | fr |
| Duits | de |
| Italiaans | it |
| Pools | pl |
| Portugees | pt |
| Spaans | es |
| Zweeds | sv |
Regionale varianten worden ondersteund, bijvoorbeeld de-DE geeft een Duits rapport. Als de header ontbreekt of geen ondersteunde taal bevat, is het rapport in het Engels.
Leveringsrapporten en ontvangstbewijzen
Het type rapport hangt af van de rol van de eigenaar van de mailbox voor het opgevraagde bericht. Je kunt het type niet zelf kiezen.
| Eigenaar van de mailbox | Rapport | Inhoud |
|---|---|---|
| Heeft het bericht verzonden | Leveringsrapport (delivery_report) | Berichtgegevens en, voor elke ontvanger, de afleverstatus, of het bericht is geopend en een tijdlijn van gebeurtenissen |
| Heeft het bericht ontvangen | Ontvangstbewijs (receipt_report) | Berichtgegevens en dezelfde informatie voor alleen de eigenaar van de mailbox. Andere ontvangers zijn niet opgenomen. |
De berichtgegevens in beide rapporten zijn het bericht-ID, de afzender, de ontvangers, het onderwerp, de namen van de bijlagen en het tijdstip van verzending. De header van het rapport toont het adres van de mailbox en het tijdstip waarop het rapport is gegenereerd.
Het type wordt per bericht bepaald. In een conversatie waarin de eigenaar van de mailbox het eerste bericht verzond en een antwoord ontving, heeft het eerste bericht een leveringsrapport en het antwoord een ontvangstbewijs.
Om te bewijzen dat een bericht is verzonden en afgeleverd, vraag je het rapport op vanuit de mailbox van de afzender. Om te bewijzen dat een bericht is ontvangen, vraag je het rapport op vanuit de mailbox van de ontvanger.
Respons
Een geslaagd verzoek geeft status 200 terug met het rapport als PDF-bestand (Content-Type: application/pdf). De bestandsnaam staat in de Content-Disposition-header:
Content-Disposition: attachment; filename="delivery_report_0001_20260115T093000Z_Quarterly_report.pdf"
De bestandsnaam bestaat uit:
- Het type rapport:
delivery_reportofreceipt_report(zie Leveringsrapporten en ontvangstbewijzen) - De berichtnaam zonder
.emlen zonder markeringen zoalsREVOKED - Het onderwerp van de conversatie. Andere tekens dan
A-Z,a-z,0-9,.,_en-worden vervangen door_, en het onderwerp wordt ingekort tot 30 tekens. Het onderwerp wordt weggelaten als er geen bruikbare tekens overblijven.
Het rapport wordt gegenereerd op het moment dat je het opvraagt en is gebaseerd op de afleverinformatie die op dat moment beschikbaar is. Als je hetzelfde rapport later opnieuw opvraagt, kan het nieuwe gebeurtenissen bevatten, bijvoorbeeld een ontvanger die het bericht inmiddels heeft geopend. Sla de gedownloade PDF op als je een vaste kopie nodig hebt.
Bijzondere situaties
Ingetrokken en verwijderde berichten
Het rapport blijft beschikbaar nadat een bericht is ingetrokken of verwijderd.
- Wanneer de eigenaar van de mailbox geen toegang meer heeft tot het bericht, bevat de berichtnaam in de lijst
REVOKEDofDELETED, bijvoorbeeld0001_REVOKED_20260115T093000Z.eml. Berichten die de eigenaar van de mailbox zelf heeft ingetrokken of verwijderd, behouden hun oorspronkelijke naam. - Zowel de nieuwe naam als de naam die je eerder hebt opgeslagen, geven hetzelfde rapport terug, met dezelfde bestandsnaam.
- Het rapport toont nog steeds de namen van de bijlagen, ook al kan het bericht zelf niet meer worden geëxporteerd.
Doorgestuurde berichten
Wanneer een bericht wordt doorgestuurd, wordt een kopie van het oorspronkelijke bericht toegevoegd aan de nieuwe conversatie. In de lijst met berichten is de kopie gemarkeerd met FORWARDED, bijvoorbeeld 0001_FORWARDED_20260114T080000Z.eml.
- Een doorgestuurde kopie heeft geen eigen rapport. Een verzoek geeft status
404terug metNo delivery events are recorded for this message. - Om het rapport van het doorsturen zelf op te halen, vraag je het bericht op zonder de markering
FORWARDED, bijvoorbeeld0002_20260115T093000Z.eml. - Om het rapport van het oorspronkelijke bericht op te halen, vraag je het op in de conversatie waarin het oorspronkelijk is verzonden.
Ontoegankelijke conversaties
Een conversatie is ontoegankelijk wanneer de inhoud niet meer kan worden ontsleuteld voor de eigenaar van de mailbox, bijvoorbeeld na een wachtwoordreset zonder herstelcode. De naam van de conversatie eindigt op _INACCESSIBLE en de lijst met berichten is leeg. Een verzoek om een rapport in deze conversatie geeft status 404 terug met Conversation not found.
Fouten
Als een verzoek mislukt, bevat de body van de respons een korte foutmelding in platte tekst. De Content-Type-header van een foutrespons is nog steeds application/pdf, controleer daarom altijd de statuscode voordat je de respons als PDF-bestand verwerkt.
| Status | Melding | Oorzaak |
|---|---|---|
400 | Invalid email address: {email_address} | Het e-mailadres is niet geldig |
401 | {"reason":"INVALID_CREDENTIALS"} | Het API-token ontbreekt of is ongeldig |
403 | Export API is not enabled | De export-API is niet ingeschakeld voor je organisatie |
403 | Proof of Delivery is not enabled | Het afleveringsbewijs is niet ingeschakeld voor je organisatie |
404 | Email address not found: {email_address} | De mailbox bestaat niet in je organisatie |
404 | Year month not found: {year_month} | De maand heeft niet het formaat yyyyMM |
404 | Conversation not found: {conversationNameKey} | De conversatie bestaat niet in deze mailbox en maand, of is ontoegankelijk |
404 | Message not found: {messageNameKey} | De berichtnaam begint niet met een berichtnummer, of de conversatie heeft geen bericht met dit nummer |
404 | No delivery events are recorded for this message | Er is geen afleverinformatie voor dit bericht, bijvoorbeeld een doorgestuurde kopie |
500 | Internal server error | Er is een onverwachte fout opgetreden. Je kunt het verzoek opnieuw proberen. |
503 | - | De exportservice is bezet. Probeer het opnieuw na het aantal seconden in de Retry-After-header. |
Rapporten exporteren met een script
Om de rapporten van alle berichten te exporteren, volg je dezelfde stappen als voor de berichtexport (zie API-overzicht) en vraag je het rapport van elk bericht op met het /pod-endpoint.
Houd rekening met het volgende:
- Status
404metNo delivery events are recorded for this messagewordt verwacht voor doorgestuurde berichten. Behandel dit als “geen rapport beschikbaar” in plaats van een mislukte download. - Dit endpoint deelt zijn capaciteit met het endpoint voor het downloaden van berichten. Wacht bij status
503het aantal seconden in deRetry-After-header af voordat je het opnieuw probeert.
Python exportscript
Om het exportproces te vereenvoudigen, bieden we een Python-script dat de API-calls automatiseert en de exportlogica afhandelt. Het script ondersteunt functies zoals filteren op e-mailadres of domein, het exporteren van afleveringsbewijzen, het hervatten van onderbroken exports en het opnieuw proberen van mislukte downloads. Het script is opgenomen in het exportpakket dat je via de onderstaande link kunt downloaden. Het is ontworpen om via de command line te worden uitgevoerd en kan worden geconfigureerd met een configuratiebestand of command line-argumenten.
Vereisten
Zorg ervoor dat je aan de volgende vereisten voldoet voordat je begint:
- Python 3.9 of hoger is geïnstalleerd
- Poetry is geïnstalleerd (aanbevolen)
- API-toegang is ingeschakeld voor je organisatie
Download
Download het exportpakket, dat het Python-script, een README-bestand en een voorbeeldconfiguratiebestand bevat:
Configuratie
API-token (vereist)
Stel je API-token in als omgevingsvariabele:
export ZIVVER_API_TOKEN="your-token-here"
ZIVVER_API_TOKEN-omgevingsvariabele en deze niet op te slaan in het configuratiebestand.Optie 1: Configuratiebestand
Gebruik een configuratiebestand als je alle instellingen op één plek wilt beheren.
Maak een config.json-bestand (zie het voorbeeld in de download):
{
"api_token": "Please use environment variable ZIVVER_API_TOKEN to set your API token.",
"output_dir": "./exports",
"allowed_emails": ["user1@example.com"],
"allowed_domains": ["example.com"],
"exclude_emails": ["noreply@example.com"],
"max_workers": 10,
"debug": false,
"content": ["eml", "pod"],
"language": "nl"
}
Kies met content wat het script per bericht downloadt: eml voor het bericht, pod voor het afleveringsbewijs, of eml,pod voor beide. De standaardwaarde is ["eml"]. Stel met language de taal van de rapporten in. Zie Rapporten exporteren met het Python-script.
Deze aanpak wordt aanbevolen wanneer:
- Je een herbruikbare configuratie wilt
- Je meerdere exports met dezelfde instellingen uitvoert
Optie 2: Command line-argumenten
Gebruik command line-argumenten als je snel eenmalige exports wilt uitvoeren zonder een configuratiebestand te maken.
organization-data-export \
--output-dir ./my-exports \
--allowed-emails user1@example.com,user2@example.com \
--allowed-domains example.com
Deze aanpak is handig wanneer:
- Je specifieke instellingen wilt overschrijven
- Je aan het testen bent of ad-hoc exports uitvoert
allowed_emails als allowed_domains gebruikt, worden e-mailadressen die aan één van beide voorwaarden voldoen opgenomen (OR-logica).Installatie
Met Poetry (aanbevolen)
Gebruik deze methode als je het script wilt uitvoeren in een beheerde Python-omgeving waarbij alle afhankelijkheden automatisch worden afgehandeld.
poetry install
poetry run organization-data-export --help
Dit zal:
- Alle benodigde afhankelijkheden installeren
- Je in staat stellen het script uit te voeren met
poetry run
Met een buildpakket (wheel)
Gebruik deze methode als je een standaardinstallatie wilt waarbij het commando globaal beschikbaar wordt.
poetry build
pip install dist/organization_data_export-*.whl
organization-data-export --help
Dit zal:
- Het pakket bouwen
- Het installeren zodat je
organization-data-exportdirect kunt uitvoeren
Gebruik
Volledige export
Gebruik dit commando om alle beschikbare gegevens te exporteren met een configuratiebestand:
organization-data-export export --config config.json
Specifieke e-mailadressen exporteren
Gebruik dit als je alleen gegevens van geselecteerde gebruikers wilt exporteren:
organization-data-export export --allowed-emails user1@example.com,user2@example.com
Specifieke domeinen exporteren
Gebruik dit als je alle gebruikers binnen één of meerdere domeinen wilt exporteren:
organization-data-export export --allowed-domains example.com
Afleveringsbewijzen exporteren
Gebruik dit als je het afleveringsbewijs van elk bericht wilt exporteren, met of zonder de berichten:
organization-data-export export --content eml,pod --language nl
Zie Rapporten exporteren met het Python-script voor meer informatie.
Onderbroken export hervatten
Als een export is onderbroken (bijvoorbeeld door een netwerkprobleem of handmatig stoppen), kun je deze hervatten:
organization-data-export export --resume
Dit gaat verder waar de vorige run is gestopt zonder bestaande gegevens opnieuw te downloaden.
Mislukte downloads opnieuw proberen
Als sommige bestanden niet zijn gedownload, kun je alleen die bestanden opnieuw proberen:
organization-data-export retry-failed
Het log houdt per mislukt bestand bij of het een bericht of een afleveringsbewijs is, en de taal van een rapport, zodat het script hetzelfde type bestand in dezelfde taal opnieuw probeert. Gebruik --language om de rapporten in een andere taal opnieuw te downloaden:
organization-data-export retry-failed --language nl
retry-failed probeert alleen losse bestanden opnieuw. Als het script de gesprekken van een maand of de berichten van een gesprek niet kan ophalen, gaat het verder met de rest en markeert het die maand niet als voltooid. De samenvatting toont hoeveel lijsten niet zijn opgehaald. Voer dezelfde export opnieuw uit met --resume om die maanden af te ronden. Een gesprek dat tijdens de export is verwijderd, telt niet als mislukte lijst: het script slaat het over, markeert de maand toch als voltooid en toont het aantal verwijderde gesprekken in de samenvatting. Als een lijst niet kan worden opgehaald door een fout die opnieuw proberen niet oplost, bijvoorbeeld voor een mailbox die tijdens de export is verwijderd, toont de samenvatting die lijst apart met de fout. --resume rondt die maanden pas af als de oorzaak van de fout is opgelost, en slaat een mailbox die niet meer bestaat over.
Outputstructuur
Geëxporteerde bestanden worden opgeslagen in de volgende structuur:
exports
└── user@example.com
└── 202601
└── conversation-id
├── 0001_20260115T093000Z.eml
├── 0001_20260115T093000Z.pod.pdf
├── 0002_20260116T101500Z.eml
└── 0002_20260116T101500Z.pod.pdf
De .pod.pdf-bestanden worden alleen gedownload als content de waarde pod bevat.
Rapporten exporteren met het Python-script
Het script kan ook het afleveringsbewijs van elk bericht exporteren. Proof of Delivery moet zijn ingeschakeld voor je organisatie. Kies met --content wat het script per bericht downloadt en stel met --language de taal van de rapporten in:
| Commando | Resultaat |
|---|---|
organization-data-export export --content eml,pod --language nl | Berichten en hun rapporten in het Nederlands |
organization-data-export export --content pod --language de-DE --allowed-emails user@example.com | Alleen de rapporten van één mailbox, in het Duits |
organization-data-export export --content pod | Alleen de rapporten, in het Engels |
Zonder --content exporteert het script alleen de berichten, zoals voorheen. Bestaande commando’s en configuratiebestanden blijven zonder wijzigingen werken.
Je kunt content en language ook in het configuratiebestand instellen. Het script stopt voordat het begint als de taal niet wordt ondersteund.
Het script slaat elk rapport op naast het bijbehorende bericht, met .pod.pdf in plaats van .eml. Het rapport van 0001_20260115T093000Z.eml wordt bijvoorbeeld opgeslagen als 0001_20260115T093000Z.pod.pdf. Daarnaast doet het script het volgende:
- Het slaat doorgestuurde kopieën over, omdat die geen rapport hebben, en telt ze apart in de samenvatting. Ze worden niet gelogd als mislukte downloads.
- Het stopt met een foutmelding als de API een verzoek weigert met status
403, bijvoorbeeld als Proof of Delivery of de export-API niet is ingeschakeld voor je organisatie. Voer na het inschakelen hetzelfde commando opnieuw uit met--resumeom verder te gaan. - Het verdeelt de rate limit van het API-token over de gelijktijdige downloads, en vertraagt voordat de limiet op is. Het wacht het aantal seconden in de
Retry-After-header af als de API daarom vraagt. - Het downloadt een rapport niet opnieuw als het al bestaat, ook niet als het bericht in de tussentijd is ingetrokken of verwijderd en een andere naam heeft gekregen.
- Het voegt de rapporten toe aan een bestaande export van berichten zonder de berichten opnieuw te downloaden.
Bestaande rapporten worden niet opnieuw gedownload, ook niet als je een andere --language gebruikt. Gebruik een nieuwe outputmap om ze opnieuw te downloaden, bijvoorbeeld om nieuwe gebeurtenissen op te nemen.
Belangrijke aandachtspunten
- De voortgang is niet lineair: sommige mailboxen zijn snel klaar, andere duren veel langer
- Het script verwerkt per mailbox één maand tegelijk
- Het kan lijken alsof de export vastloopt, maar deze is nog steeds bezig
- Rate limiting wordt automatisch afgehandeld
Functionaliteiten
- Hervatbare exports met
--resume - Flexibel filteren op e-mailadres en domein
- Afleveringsbewijzen in de taal van je keuze
- Gelijktijdige downloads (instelbaar)
- Automatisch opnieuw proberen bij mislukte downloads
- Logging van mislukte downloads
- Veilige authenticatie via omgevingsvariabelen
Beperkingen
- API-toegang moet door Zivver worden ingeschakeld om veiligheidsredenen
- Als je het exportscript van Zivver wilt gebruiken, is een Python-installatie vereist
- Het API-token moet per sessie opnieuw worden ingesteld (tenzij permanent geconfigureerd)
Veelgestelde vragen
Hoe schakel je de API-endpoints in?
De API-endpoints zijn standaard uitgeschakeld. Maak een supportticket aan om deze voor je organisatie te laten inschakelen.Wat te doen als het script halverwege stopt?
Voer hetzelfde commando opnieuw uit en gebruik de--resume-flag om verder te gaan waar het was gebleven.Sommige bestanden zijn niet gedownload. Hoe probeer je dit opnieuw?
Gebruik het volgende commando om alleen de mislukte downloads opnieuw te proberen:organization-data-export retry-failed
Hoe exporteer je gegevens voor alleen specifieke gebruikers?
Gebruikallowed_emails om specifieke gebruikers op te nemen, of allowed_domains om volledige domeinen op te nemen. Je kunt ook exclude_emails gebruiken om specifieke adressen over te slaan.