API-documentatie

Plof API voor verzenders

Lever post programmatisch aan bij Plof. Je hebt een API-sleutel nodig — die maak je aan in je verzendportaal onder “API & developers”. Bouw je de koppeling namens een bedrijf? Dan nodigt dat bedrijf je uit als medewerker met het recht “API & developers”; zo krijg je toegang tot de sleutels zonder inzage in hun post.

Snelstart met de SDK

Post wordt op jouw server versleuteld voordat het naar Plof gaat — Plof ziet de inhoud van je documenten nooit. De versleuteling is post-quantum en gebeurt automatisch met de Plof-SDK. Je hoeft er zelf niets ingewikkelds voor te doen: adres + document erin, versturen.

# 1. installeren npm install @plof/sdk
// 2. initialiseren import { Plof } from '@plof/sdk'; const plof = new Plof({ basisUrl: 'https://plof.app', apiSleutel: process.env.PLOF_KEY // nooit hardcoderen });
// 3a. één stuk versturen await plof.verstuur( { pc: '3701EP', nr: '4' }, pdfBytes, { referentie: 'F-2026-001' } ); // 3b. of een grote batch (SDK versleutelt elk stuk lokaal) const res = await plof.verstuurBatch(items); console.log(`${res.gelukt} van ${res.aangeboden} verstuurd`);
De SDK regelt het versleutelen, het opknippen van grote batches en het opnieuw proberen. Wil je zelf tegen de rauwe REST-API werken (bijv. zonder Node.js), lees dan verder — je levert dan zelf cipher, nonce en wikkels aan.

Authenticatie

Elk verzoek stuurt je API-sleutel mee in de header X-Plof-Key (of als Authorization: Bearer …). De sleutel hoort bij één verzender; Plof bewaart alleen een hash. Verlies je hem, maak dan een nieuwe aan en trek de oude in.

# Test of je sleutel werkt curl https://plof.app/wp-json/plof/v1/stukken/../ping \ -H "X-Plof-Key: JOUW_SLEUTEL"
Deel je sleutel nooit publiek (niet in frontend-code of een repo). Wie de sleutel heeft, kan post aanleveren namens de verzender.

Eén poststuk aanleveren

POST https://plof.app/wp-json/plof/v1/stukken/e2e

Werk je met de SDK, dan doet plof.verstuur(…) dit voor je (zie Snelstart). Wil je het zelf doen, dan versleutel je het document eerst client-side en stuur je het versleutelde pakket: cipher + nonce (het versleutelde document), wikkels (de leesrechten) en document_sha256 (voor het verzendbewijs). Plof ontvangt nooit de kale PDF.

curl -X POST https://plof.app/wp-json/plof/v1/stukken/e2e \ -H "X-Plof-Key: JOUW_SLEUTEL" \ -H "Content-Type: application/json" \ -d '{ "adres_pc": "1234AB", "adres_nr": "1", "adres_toev": "A", "document_sha256": "<64 hex>", "cipher": "<base64>", "nonce": "<base64>", "wikkels": [ { "ref": "…", "wikkel": "…" } ], "referentie": "dossier-2026-000123", "idempotency_key": "factuur-2026-000123" }'

Antwoord

{ "ok": true, "stuk_id": 4213, "e2e": true }

Voor een privépersoon geef je in plaats van een adres een plof_id mee. Een kaal adres bereikt alleen een zakelijke postbus — nooit een privépersoon.

Batch: meerdere stukken tegelijk

POST https://plof.app/wp-json/plof/v1/stukken/e2e/batch

Lever tot 5000 stukken per verzoek aan, elk client-side versleuteld (met de SDK gaat dit vanzelf). Elk stuk wordt apart verwerkt: gaat er één mis, dan worden de andere gewoon verstuurd en krijg je het gefaalde stuk terug met de reden. Je hoeft nooit de hele batch opnieuw te sturen.

curl -X POST https://plof.app/wp-json/plof/v1/stukken/e2e/batch \ -H "X-Plof-Key: JOUW_SLEUTEL" \ -H "Content-Type: application/json" \ -d '{ "stukken": [ { "adres_pc": "1234AB", "adres_nr": "1", "referentie": "F-001", "document_sha256": "…", "cipher": "…", "nonce": "…", "wikkels": [ … ] }, { "adres_pc": "5678CD", "adres_nr": "9", "referentie": "F-002", "cipher": "…", "nonce": "…", "document_sha256": "…", "wikkels": [ … ] } ] }'

Antwoord

{ "ok": false, "aangeboden": 2, "gelukt": 1, "gefaald": 1, "resultaten": [ { "index": 0, "referentie": "F-001", "ok": true, "stuk_id": 4213 }, { "index": 1, "referentie": "F-002", "ok": false, "code": "postcode_ongeldig", "fout": "Ongeldige postcode." } ] }

De HTTP-status is 201 als alles lukte, 207 (Multi-Status) bij een mix, en 422 als niets lukte. Lees per stuk het veld ok in resultaten; gefaalde stukken herken je aan je eigen referentie en corrigeer je apart.

Status van een stuk opvragen

GET https://plof.app/wp-json/plof/v1/stukken/{stuk_id}

Vraag de actuele status op van een stuk dat je eerder aanleverde. Je ziet alleen je eigen stukken.

{ "ok": true, "stuk_id": 4213, "status": "bezorgd" }

Mogelijke statussen: nieuw, bezig, bezorgd, geopend, wacht_op_anker (ontvanger gebruikt Plof nog niet), retour, verwijderd.

Reacties ontvangen

Zet je bij een stuk reactie_toegestaan op 1, dan kan de ontvanger binnen Plof digitaal terugsturen (een bericht met eventueel een bijlage, bijvoorbeeld een ondertekende PDF) — versleuteld, zodat alleen jouw organisatie de reactie kan lezen. Geen losse e-mail meer die je moet terugzoeken.

Elke reactie draagt de referentie die je bij het originele stuk meegaf, zodat je hem direct aan het juiste dossier in je CRM koppelt. Reacties verschijnen in je verzendportaal onder Reacties, en zijn op te halen via de API. Je kunt ook een webhook instellen zodat Plof elke nieuwe reactie naar je eigen systeem duwt.

De inhoud van een reactie is end-to-end versleuteld naar de sleutel van je organisatie. Plof kan de reactie niet meelezen; ontsleutelen gebeurt in je portaal.

Reacties ophalen

Haal reacties op met je API-sleutel. De metadata (referentie, poststuk, tijd) is direct bruikbaar; de versleuteld-blob kun je archiveren, maar alleen een verzegelde lezer in je portaal kan die openen.

GET plof/v1/reacties?sinds=2026-08-01
X-Plof-Key: jouw_sleutel

Parameters: sinds (ISO-datum, alleen nieuwere), status, per (max 200), blz. Eén reactie: GET /reacties/{id}.

Elk item bevat: id, poststuk_id, referentie, heeft_bijlage, status, ontvangen, en versleuteld (met iv, inhoud, sleutel_wikkel).

Webhook (Plof duwt naar jou)

Stel een https-endpoint in; Plof stuurt bij elke nieuwe reactie een POST met metadata (geen inhoud) en een ophalen-link.

POST plof/v1/reacties/webhook
X-Plof-Key: jouw_sleutel
{ "url": "https://jouw-crm.nl/plof-webhook", "actief": true }

Je krijgt een geheim terug. Elke webhook draagt de header X-Plof-Signature = hmac_sha256(geheim, body). Verifieer die vóór je de melding vertrouwt. De payload bevat o.a. reactie_id, referentie en een ophalen-URL.

Velden

VeldVerplichtOmschrijving
adres_pcja*Postcode van de ontvanger, bv. 1234AB. *Voor een zakelijke postbus. Voor een privépersoon gebruik je in plaats daarvan plof_id.
adres_nrja*Huisnummer (bij een zakelijk adres).
adres_toevneeToevoeging (bv. A, bis).
plof_idja*Plof-ID van een privé-ontvanger, in plaats van een adres.
cipherjaHet versleutelde document (base64). De SDK vult dit; zelf versleutelen kan ook.
noncejaDe nonce bij het versleutelde document (base64).
wikkelsjaDe leesrecht-wikkels (X-Wing) naar de ontvanger. De SDK maakt deze.
document_sha256jaVingerafdruk (64 hex) van het originele document, voor het verzendbewijs.
idempotency_keyaanbevolenEigen unieke sleutel; voorkomt dubbele bezorging bij opnieuw versturen.
typeneegewoon (standaard) of aangetekend.
referentieneeEigen kenmerk (dossier-, klant- of zaaknummer). Reist mee en komt terug bij een reactie van de ontvanger — handig om reacties aan je CRM te koppelen.
onderwerpneeOnderwerp van het stuk (bv. Factuur). Bepaalt mede of reageren mag (zie reactie-toestemming).
reactie_toegestaanneeMag de ontvanger digitaal terugsturen? 1 = ja, 0 = nee. Laat je het weg, dan erft het stuk de instelling van ontvanger → onderwerp → bedrijfsstandaard.

Foutcodes

HTTPBetekenisWat te doen
401API-sleutel ontbreektVoeg de header X-Plof-Key toe.
403Ongeldige of ingetrokken sleutel, of account geschorstControleer de sleutel of maak een nieuwe aan in het portaal.
400Verzoek onbruikbaarVerplicht veld ontbreekt, of de batch is leeg of groter dan 5000 stukken; splits de batch.
201Alles geluktGeen fout: het stuk of de hele batch is aangenomen.
207Batch deels geslaagdGeen fout: lees per stuk het veld ok in resultaten.
422Niets geluktAlle stukken geweigerd (bijv. onbekende ontvanger of ongeldige postcode). Zie code/fout per stuk.
503Dienst tijdelijk niet beschikbaarProbeer het later opnieuw.

Veelgestelde vragen

Ik ben developer en bouw voor een bedrijf. Hoe krijg ik toegang?

Het bedrijf (de verzender) nodigt je uit als medewerker en vinkt het recht “API & developers” aan. Je logt in met je eigen Plof-identiteit en ziet dan alleen het API-scherm en deze documentatie — je hebt géén inzage in de post van het bedrijf.

Kan één verzender meerdere sleutels hebben?

Ja. Je maakt losse sleutels aan met een eigen naam, bijvoorbeeld Productie en Test. Elke sleutel kun je apart intrekken zonder de andere te breken — handig bij een sleutelwissel of als een koppeling wegvalt.

Wat gebeurt er als ik een sleutel intrek?

Die sleutel werkt direct niet meer: verzoeken ermee krijgen een 403. Bestaande sleutels blijven werken. Maak eerst de nieuwe sleutel aan en zet die in je systeem, en trek de oude daarna pas in.

Hoe voorkom ik dat een brief dubbel bezorgd wordt?

Stuur een eigen idempotency_key mee (bijvoorbeeld je factuurnummer). Lever je hetzelfde stuk per ongeluk twee keer aan, dan herkent Plof de sleutel en bezorgt het maar één keer.

Wat is het verschil tussen los aanleveren en een batch?

Bij /stukken/e2e lever je één brief aan. Bij /stukken/e2e/batch lever je er tot 5000 tegelijk aan; die worden op de achtergrond bezorgd. Grote stromen (loonstroken, jaaropgaven) horen in een batch. Met de SDK gebruik je verstuur of verstuurBatch en hoef je je hier niet druk over te maken.

Moet ik zelf versleutelen?

Nee, de SDK doet dat. Elk document wordt op jouw server versleuteld vóór verzending — Plof ziet de inhoud nooit. Werk je zonder de SDK, dan lever je zelf cipher, nonce en wikkels aan; de kale routes voor onversleutelde PDF's zijn uitgeschakeld.

Hoe zie ik of er brieven vastlopen?

In het verzendportaal verschijnt bij “Verzonden” een melding “Aandacht nodig” zodra brieven langer dan een paar dagen onderweg zijn zonder opgehaald te worden, of op retour staan — verzameld over al je verzendingen. Zo zie je in één oogopslag of er iets misging.

Gaat er iets mis met mijn hele batch als één brief faalt?

Nee. Een batch geeft HTTP 207 terug: de goede stukken worden verwerkt, de foute niet. Controleer per stuk het veld ok in resultaten om te zien welke opnieuw moeten.