Seismic delivers real-time events to your server as signed HTTPS POST requests. Every webhook covers something you would otherwise have to poll for: KYC approvals, cardholder status changes, new card authorizations, and settlements. Every request is signed with HMAC-SHA256 so you can verify its origin before doing any work.Documentation Index
Fetch the complete documentation index at: https://docs.seismic-cards.systems/llms.txt
Use this file to discover all available pages before exploring further.
Events reference
| Event | When it fires | What to do |
|---|---|---|
KYC.UPDATED | A KYC decision is returned | Mark the user approved or rejected. If approved, call POST /v1/accounts/{accountId}/init. |
KYB.UPDATED | A business KYB decision is returned | Same as KYC.UPDATED — for B2B programs. |
CARDHOLDER.CREATED | A new cardholder is created | Optional — record the creation in your system of record. |
CARDHOLDER.UPDATED | A cardholder transitions state (e.g. PENDING → APPROVED) | Sync cardholder status in your database. |
CARD.CREATED | A new card is issued | Optional — the card is also returned synchronously by POST /v1/budget-card. |
CARD.UPDATED | A card’s status changes (frozen, closed, expired) | Sync card status in your database. |
CARD_TRANSACTION.CREATED | A new authorization arrives at the network | Lock funds in your accounting system; show a pending charge in your UI. |
CARD_TRANSACTION.UPDATED | An auth is settled, reversed, or refunded | Update the transaction status; release the funds lock if reversed. |
Configuring your endpoint
Register your URL in the dashboard
In your Seismic dashboard, set your webhook URL — for example
https://api.your-app.com/webhooks/seismic. This is where Seismic will send all events.Generate and save your webhook secret
Generate a
webhookSecret in the dashboard and copy it into your secret manager (e.g. AWS Secrets Manager, HashiCorp Vault, or an environment variable). You will use it to verify every incoming request.Make your endpoint ready to receive events
Your endpoint must:
- Be reachable from the public internet over HTTPS.
- Respond within 10 seconds.
- Return a
2xxstatus on success. Any other status triggers a retry.
Seismic retries failed deliveries with exponential backoff for up to 24 hours. Design your handler to be idempotent — see best practices below.
Webhook payload shape
Every webhook is a JSON POST with the same envelope:Unique event ID. Store this and use it for idempotency checks in your handler.
One of the eight event types listed in the events table above.
ISO-8601 timestamp of when Seismic generated the event.
The API version that produced the event, e.g.
v1.A JSON-encoded string containing the event-specific payload. You must call
JSON.parse(resource) before reading any fields from it.Verifying the signature
Every request includes aSignature header containing a Base64-encoded HMAC-SHA256(webhookSecret, resource). Verify it before doing any work.
Example signed request
Reference handler
A complete Fastify handler that verifies the signature and dispatches to event-specific functions:Event payloads
CARD_TRANSACTION.CREATED and CARD_TRANSACTION.UPDATED
Fired on authorization, settlement, reversal, and refund. The samecardTransactionId can appear in both a CREATED and an UPDATED event — always upsert by cardTransactionId.
status | Meaning | Action |
|---|---|---|
PENDING | Authorization placed at the network | Lock funds in your ledger. |
CLOSED | Authorization settled | Convert the pending lock into a permanent debit. |
FAIL | Authorization declined | Release the lock; surface a notification to the user. |
REVERSED | Authorization reversed before settlement | Release the lock; mark the transaction reversed. |
REFUNDED | Settled charge has been refunded | Credit the user’s balance. |
KYC.UPDATED
status | Action |
|---|---|
APPROVED, PASS, or COMPLETED | Mark the user as KYC-verified; call POST /v1/accounts/{accountId}/init if you haven’t already. |
REJECTED | Surface the result to the user; allow them to submit new documents and retry. |
PENDING | No action — wait for the next event. |
CARDHOLDER.CREATED and CARDHOLDER.UPDATED
PENDING to APPROVED within seconds of creation.
CARD.CREATED and CARD.UPDATED
reasonCode to understand why the card’s status changed:
| Code | Meaning |
|---|---|
7001 | Created via merchant portal |
7002 | Created via API |
1001 | Closed via API |
1002 | Closed via merchant portal |
1003 | Closed due to risk policy violation |
2001 | Activated via API |
3001 | Suspended via API |
3002 | Suspended via merchant portal |
5001 | Restricted by administrator |
6001 | Unrestricted by administrator |
Best practices
- Verify the signature first. Reject any request that fails signature verification before doing any work at all.
- Be idempotent. Look up the event
id(orcardTransactionId) in your database before processing. If you’ve already handled it, return200and skip. - Respond fast. Return a
2xximmediately, then process asynchronously by pushing the event to a queue or job runner. - Log everything. Keep at least 30 days of raw webhook logs for reconciliation and debugging.
- Never block on slow downstream calls. Your handler must complete within 10 seconds — any longer triggers a retry.
- Allowlist Seismic’s IPs. Production webhooks originate from
47.88.0.0/16and47.89.0.0/16. IP allowlisting is an optional defense-in-depth layer on top of HMAC verification.