Last updated

Webhooks

Card transaction events and how to consume them.

Jeeves delivers four webhook event types covering the card-transaction lifecycle. Subscriptions, HMAC-SHA256 signatures, retries, and the circuit breaker are shared infrastructure — this page covers the card events themselves; the Webhooks integration guide covers signature verification, retries, secret rotation, and endpoint architecture in depth.

Event types

Event typeFires when
transaction.auth.approvedA card authorization was approved.
transaction.auth.declinedA card authorization was declined.
transaction.settledA card transaction settled (posted to the account).
transaction.failedA card transaction failed after the authorization stage.

Typical event sequences

ScenarioEvents in order
Normal purchasetransaction.auth.approved → transaction.settled
Declined purchasetransaction.auth.declined
Reversed / voidedtransaction.auth.approved → transaction.failed
Force post (no prior auth)transaction.settled only

A single purchase may emit several events over hours or days. Key your handling off the event type and relatedTransactionId — never assume a one-to-one mapping between authorizations and settlements.

The envelope

Every delivery is a POST with Content-Type: application/json:

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "type": "transaction.auth.approved",
  "version": "v1",
  "occurredAt": "2026-09-29T16:22:51Z",
  "data": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "productType": "credit_line",
    "transactionType": "debit",
    "transactionDate": "2026-09-29 16:22:51",
    "transactionAmount": 127.59,
    "transactionCurrency": "USD",
    "localAmount": 741.33,
    "localCurrency": "BRL",
    "company": { "id": "361c697b-8d82-11ec-a51a-0ea06e4de10b", "name": "Acme Corporation" },
    "user": { "id": "d5d5c940-3c58-4ecc-b772-fe20e764ed70", "name": "John Doe", "email": "john.doe@acmecorp.com" },
    "card": {
      "id": "c8ddf33f-6244-4218-af7e-7a6fe0b13528",
      "name": "Travel Card",
      "type": "virtual",
      "lastFourDigits": "9876",
      "metadata": { "reservation_code": "abc123" }
    },
    "merchant": { "name": "STARBUCKS SAO PAULO BRA", "merchantCategoryCode": "5814" }
  }
}

The id identifies the event and stays constant across delivery retries — use it for idempotency. settlementDate appears on transaction.settled; relatedTransactionId links a reversal to its original authorization. Full field tables: Payloads.

Managing subscriptions

The full subscription lifecycle is part of the public API — create, list, inspect, update (including re-activating after the circuit breaker), delete, rotate secrets with a 24-hour grace window, send test deliveries, and browse events with their delivery attempts and manual retries. The flow builder generates the complete sequence, and the Webhooks integration guide covers operational practice:

TaskEndpoint
Create subscription (returns whsec_… secret once)POST /v1/webhooks/subscriptions
List / inspectGET /v1/webhooks/subscriptions, GET /v1/webhooks/subscriptions/{id}
Update / re-enablePATCH /v1/webhooks/subscriptions/{id}
DeleteDELETE /v1/webhooks/subscriptions/{id}
Rotate secret (24 h dual-signature grace)POST /v1/webhooks/subscriptions/{id}/rotate-secret
Test deliveryPOST /v1/webhooks/subscriptions/{id}/test
Browse eventsGET /v1/webhooks/events, GET /v1/webhooks/events/{id}
Delivery attempts / manual retryGET /v1/webhooks/events/{id}/deliveries, POST /v1/webhooks/events/{id}/retry

Scopes: webhooks:read / webhooks:write.

Idempotency & retries

Delivery is at-least-once. Deduplicate by the envelope id (also sent as the X-Webhook-Event-Id header), acknowledge fast with a 2xx, and do your business logic in a background worker. Repeated failures trip a circuit breaker that pauses the subscription — re-enable it with PATCH … {"status": "active"} once your endpoint recovers. Details: Retries & reliability.