Skip to content
Hardcount
Run it locally
Pre-1.0 · one maintainer · Stripe and cards only · no SDKs (client libraries) yet · no production users yet. Docs describe v0.9.1 (29 Oct 2026) · What’s new →

Receive a Postmark delivery webhook

POST
/v1/webhooks/postmark
curl --request POST \
--url http://localhost:8080/v1/webhooks/postmark \
--header 'Authorization: Basic <credentials>' \
--header 'Content-Type: application/json' \
--data '{}'

Postmark calls this route; your code does not. Hardcount reads Delivery, Bounce and SpamComplaint records and ignores other record types and soft bounces. Without POSTMARK_WEBHOOK_USER and POSTMARK_WEBHOOK_PASS set, every request gets 401. See docs/ops/email-setup.md.

Error bodies are {"error": "<reason>"}, not the usual error object. A body that a retry cannot fix is answered 200, so Postmark stops retrying: over 64 KB, invalid JSON, or no known Hardcount email id in its metadata.

Media typeapplication/json

A Postmark webhook payload.

object
key
additional properties
any

Example generated

{}

Processed, skipped or ignored.

Media typeapplication/json
object
status
required
string
Allowed values: processed skipped ignored
reason
string

Example

{
"status": "processed"
}

Wrong or missing Basic auth, or the credentials are not set on the server.

Media typeapplication/json
object
error
string

Example generated

{
"error": "example"
}

Temporary failure. Postmark retries.

Media typeapplication/json
object
error
string

Example generated

{
"error": "example"
}