Skip to main content
Incard can notify your systems over HTTPS when activity occurs on the platform. You register endpoints in the Incard dashboard. This guide covers how to receive and verify transaction webhook deliveries.

How it works

Setup
Someone with permission to manage webhooks adds an HTTPS URL in the Incard dashboard, chooses which events to receive, and saves the signing secret when it is shown. That secret is what your server uses to confirm deliveries really came from Incard.
When a webhook event happens
If the event matches what that endpoint subscribed to, Incard sends a signed POST to your URL with a JSON body and X-Incard-* headers. Your server should verify the signature on the raw body, process the event once (using the event id for deduplication), and return 2xx if you accepted it. If verification fails, respond with 4xx. If your server errors or times out, Incard may retry the delivery a limited number of times with incrementally increasing delays.

Configure in the dashboard

Outbound webhooks can be managed in the Incard web app — under Settings → Webhooks. Each endpoint has its own URL, signing secret, and list of subscribed event types.

Endpoint URL rules

  • Must be HTTPS with a normal public hostname.
  • Must be reachable from the public internet (no localhost, private IPs, or internal-only hostnames).
  • Maximum length 2048 characters.
  • Incard does not follow redirects.

Transaction event types

For transaction webhooks, subscribe per endpoint to one or both of: You only receive types you subscribed to. Each POST body includes the event type in JSON and in the X-Incard-Event-Type header.

Transaction webhook request format

Each transaction delivery is a POST with Content-Type: application/json. Headers Body — versioned envelope:
Envelope fields data fields The transaction snapshot is produced by the transactions service. Fields marked Always are present on every delivery; fields marked When set are omitted when they have no value, so treat them as optional. New fields may be added over time — ignore any you don’t recognise.

Verify the signature

Always verify before trusting the body. Use the raw request body exactly as received (before parsing JSON). Signed string:
Expected header value:
Compare to X-Incard-Signature with a constant-time function.
Reject requests whose timestamp is far from your server clock (for example older than five minutes).

Handle transaction webhook deliveries

Recommended handler flow:
  1. Read raw body → verify signature → parse JSON.
  2. Skip or no-op if id was already processed.
  3. Queue or persist work, then return 2xx promptly (within a few seconds).
Do heavy processing asynchronously after responding 2xx.

Go live checklist

  1. Dashboard: create an endpoint with production URL and the transaction event types you need.
  2. Store signing secret securely (environment variable or secrets manager).
  3. Deploy verifier + idempotent handler.
  4. Return 2xx only after the event is safely recorded on your side.
  5. Monitor failures and disable the endpoint from the dashboard if your service is down.