Skip to main content
Webhooks are how OpenCard talks to your app. Every transaction, receipt, and lifecycle event gets POSTed to your URL.

Create webhook

Response includes secret — save it. You need it for challenge verification.

Challenge handshake 🔐

Immediately after create (or URL change), OpenCard verifies you own the endpoint:
Your server must respond 200 with header:
Node.js example:
If HMAC matches → active=true. If not → active=false, no events delivered.

Receiving events

Events come as POST to your URL:
Plus auth headers if configured: Always respond 200 quickly. Process async if needed. OpenCard retries on failure.

Custom headers

Add extra headers OpenCard includes on every delivery:

Webhook groups (buyer-party filter)

Filter events by card issuer buyer party:
Only transactions matching that buyer party hit this webhook.

Test an event

Sends a test payload to your endpoint. Good for verifying your handler works.

Delivery log

Paginated log of every delivery attempt — status code, payload, timestamp. Use for debugging.

Checklist ✅

  • HTTPS endpoint deployed
  • Challenge handler implemented (GET with ?challenge=)
  • Event handler implemented (POST with X-Event header)
  • Respond 200 fast, process async
  • secret stored securely
  • Subscribed to the right event flags
  • Test event sent and received