Proof of Sending
Verify the integrity of a Proof-of-Sending certificate without an account.
A Proof-of-Sending certificate is a signed, timestamped record of a message and its delivery hand-off. It proves what wemail sent and whether the recipient mail server accepted it; it does not prove that the recipient read the message.
Verify by certificate ID (API)
curl -X POST https://api.wemail.io/v3/verify \
-H "Content-Type: application/json" \
-d '{ "certificate": "pod_0123456789abcdef0123456789abcdef" }'| Parameter | Type | Required | Description |
|---|---|---|---|
certificate | string | Required | Proof-of-Sending Document ID in the format pod_ followed by 32 lowercase hexadecimal characters. |
This endpoint is public and requires no API key — it sits outside the authenticated /v3 customer surface, so no Authorization header is needed. It returns integrity facts only: whether the certificate is registered, whether its signature is valid, whether its content fingerprint matches, and when it was issued. Recipient PII is not returned.
Verify a PDF by SHA-256
curl -X POST https://api.wemail.io/verify/proof \
-H "Content-Type: application/json" \
-d '{ "sha256": "64-character-lowercase-hex-sha256-of-the-pdf" }'Hash the original PDF locally and submit only its SHA-256 fingerprint. The PDF itself is never uploaded. A successful match returns the certificate details and a verificationId that can be used to request a verification receipt.
Verification receipt
curl -X POST https://api.wemail.io/verify/proof/receipt \
-H "Content-Type: application/json" \
-d '{ "verificationId": "pvf_0123456789abcdef0123456789abcdef", "requestedBy": "auditor@example.com" }'After a successful verification, this endpoint returns a signed PDF receipt. requestedBy is optional and is printed on the receipt when supplied.
Check a Document ID
curl https://api.wemail.io/verify/proof/pod_0123456789abcdef0123456789abcdefReturns a minimal, PII-free confirmation that a Document ID is registered. Upload the original PDF and use POST /verify/proof to verify that its contents are unaltered.
Code examples
curl -G https://api.wemail.io/v3/events \
-H "Authorization: Bearer afn_live_…" \
--data-urlencode "tag=welcome" \
--data-urlencode "event=delivered" \
--data-urlencode "since=2026-05-01"const events = await wemail.events.list({
tag: "welcome",
event: "delivered",
since: "2026-05-01",
});
for (const e of events) console.log(e.recipient, e.timestamp);events = wemail.events.list(tag="welcome", event="delivered", since="2026-05-01")$events = $wemail->events->list(['tag' => 'welcome', 'event' => 'delivered']);events = wemail.events.list(tag: "welcome", event: "delivered")events, _ := client.Events.List(ctx, &wemail.EventParams{Tag: "welcome", Event: "delivered"})wemail.events().list(EventParams.builder().tag("welcome").event("delivered").build());var events = await wemail.Events.ListAsync(new EventParams { Tag = "welcome", Event = "delivered" });{
"items": [
{
"id": "evt_01HBYE7Q…",
"type": "delivered",
"message_id": "msg_01HBYE7K9Z4PMQDR3W",
"recipient": "alex@example.com",
"timestamp": "2026-05-10T09:42:21.000Z",
"tags": ["welcome", "v2"],
"metadata": null,
"created_at": "2026-05-10T09:42:21.412Z"
}
],
"has_more": true,
"next_cursor": "2026-05-10T09:42:21.000Z|evt_01HBYE7Q…",
"total_count": 1842
}