Pilot integration in two steps
Everything on Verifio's side is already live: the PostNL account exists, the API key is issued, and the public profile at verifio.eu/b/postnl is ready. To start the pilot, PostNL implements exactly two things: a set of DNS records and one HTTP call per delivered parcel.
Already set up by Verifio
- PostNL account + public Trustscore profile
- API key for the delivery-events feed
- Invitation e-mail template (PostNL sender name)
- Deliverability safeguards: one-click unsubscribe, bounce & complaint suppression, warm-up schedule
- Regional breakdown per postcode area
Implemented by PostNL
- 1Four DNS records on one sending subdomain (§1)
- 2One POST per delivered parcel in the pilot region (§2)
Typical effort: the DNS change is minutes; the API call is a single hook in the delivery-confirmation flow or a daily batch job.
How it fits together
During the pilot, PostNL only sends events for parcels delivered inside the agreed postcode region — the region filter lives on PostNL's side, so no address data outside the pilot ever reaches Verifio. Include the postalCode field and the dashboard breaks the Trustscore down per postcode area automatically.
E-mail domain — DNS delegation
Feedback invitations are sent from a PostNL subdomain (proposal: feedback.postnl.nl), so recipients see a sender they recognise and mailbox providers see fully authenticated mail carrying PostNL's domain reputation. Verifio never gains control over postnl.nl itself — the delegation is scoped to the subdomain, and removing the records instantly revokes it.
| Type | Host | Value / purpose |
|---|---|---|
| MX | send.feedback.postnl.nl | Mail-routing record for the sending subdomain — exact value provided by Verifio. |
| TXT (SPF) | send.feedback.postnl.nl | v=spf1 include:amazonses.com ~all — authorises Verifio's sending infrastructure for this subdomain only. |
| TXT (DKIM) | resend._domainkey.feedback.postnl.nl | Public DKIM key — exact value provided by Verifio after domain registration. |
| TXT (DMARC) | _dmarc.feedback.postnl.nl | v=DMARC1; p=quarantine; — alignment policy for the subdomain. Recommended. |
The exact record values are generated when Verifio registers the subdomain with its e-mail provider and are delivered as a copy-paste zone-file snippet. After the records resolve, Verifio verifies DKIM/SPF alignment and starts a gradual warm-up before the pilot goes to full volume.
Delivery events — API reference
Authentication
Every request carries the PostNL API key as a Bearer token: Authorization: Bearer vfio_…. The key has been issued and is shared through a secure channel — it is intentionally not printed in this guide. It can be rotated at any time on request.
Request body
| Field | Type | Description | |
|---|---|---|---|
| externalOrderId | string | required | Unique parcel identifier — use the PostNL barcode (e.g. 3SABCD1234567). Max 120 chars. Deduplication key: the same id never produces a second invitation. |
| consumerEmail | string | required | Recipient e-mail address. Max 200 chars, must be a valid address. |
| consumerName | string | optional | Recipient name, used to personalise the invitation. |
| consumerCountry | string | optional | ISO country code, "NL" during the pilot. |
| postalCode | string | optional | Postcode of the delivery address (e.g. "3512 JE"). Powers the regional Trustscore breakdown — strongly recommended during the pilot. |
| delivered | boolean | required | Set true when the parcel is delivered — this is what triggers the feedback invitation. |
| deliveredAt | string | optional | Delivery timestamp, ISO 8601. Defaults to the moment of the API call. |
| test | boolean | optional | true = record the event but send no e-mail. Addresses ending in @example.com are treated as test automatically. |
Responses
Semantics worth knowing
- Idempotent: events are upserted on the parcel barcode. Sending the same delivery twice (retries, replays) never results in a second invitation — one parcel, one interaction, by design.
- The invitation is triggered by delivered: true. Events without it are recorded but stay silent until a follow-up event marks the parcel delivered.
- Recipients who opted out or recently received an invitation are skipped automatically (response says why) — no suppression logic needed on PostNL's side.
- Order of calls is flexible: real-time per delivery scan or a daily batch both work. For batches, POST events sequentially or with modest concurrency and retry 5xx responses with exponential backoff.
- Data minimisation: only the barcode, e-mail address, name and postcode are needed. No street address, no phone number, no order contents.
Examples
curl -X POST https://verifio.eu/api/v1/orders \
-H "Authorization: Bearer vfio_????????????????????????????????" \
-H "Content-Type: application/json" \
-d '{
"externalOrderId": "3SABCD1234567",
"consumerEmail": "recipient@example.com",
"consumerName": "Anna de Vries",
"consumerCountry": "NL",
"postalCode": "3512 JE",
"delivered": true,
"deliveredAt": "2026-07-02T14:31:00Z",
"test": true
}'const res = await fetch("https://verifio.eu/api/v1/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VERIFIO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
externalOrderId: parcel.barcode, // e.g. "3SABCD1234567"
consumerEmail: parcel.recipientEmail,
consumerName: parcel.recipientName,
consumerCountry: "NL",
postalCode: parcel.postalCode, // e.g. "3512 JE"
delivered: true,
deliveredAt: parcel.deliveredAt, // ISO 8601
}),
});
const data = await res.json();
// { ok: true, inviteId: "..." } or { ok: true, skipped: "<reason>" }import os, requests
resp = requests.post(
"https://verifio.eu/api/v1/orders",
headers={"Authorization": f"Bearer {os.environ['VERIFIO_API_KEY']}"},
json={
"externalOrderId": parcel["barcode"],
"consumerEmail": parcel["recipient_email"],
"consumerName": parcel["recipient_name"],
"consumerCountry": "NL",
"postalCode": parcel["postal_code"],
"delivered": True,
"deliveredAt": parcel["delivered_at"], # ISO 8601
},
timeout=10,
)
resp.raise_for_status()
print(resp.json())Testing & go-live
- 1
Dry run
POST an event with test: true (or an @example.com address). It is validated, recorded and visible to Verifio — but no e-mail is sent. Expect { ok: true, skipped: "test event" }.
- 2
First real invitation
POST one event with a PostNL team member's own e-mail address and delivered: true. The invitation arrives from the PostNL sending domain; complete the review flow end-to-end.
- 3
DNS verified
Verifio confirms SPF/DKIM/DMARC alignment on the sending subdomain and starts the warm-up.
- 4
Go live
Enable the feed for all deliveries in the pilot region. Verifio monitors deliverability (opens, bounces, complaints) from day one and shares the dashboard.
Questions during integration?
Direct line to the Verifio engineering team — response within one business day during the pilot.
consultancy@verifio.euSee also the pilot overview and the live profile at verifio.eu/b/postnl.