Delivery method
HTTPS `POST` from Foxpay to the merchant-configured custom webhook URL.
Field-level contract for Foxpay outbound webhooks. Pair this with the webhooks guide for conceptual context, and use this page to verify exact headers, payload shapes, and retry semantics.
HTTPS `POST` from Foxpay to the merchant-configured custom webhook URL.
transaction.status_changed on every status transition.
X-Foxpay-Signature: sha256=<hex> over the exact raw JSON body.
Every delivery includes the headers below. The signature header is the authoritative trust signal; the others are for routing and observability.
| Header | Purpose | Example |
|---|---|---|
Content-Type | Always JSON. | application/json |
User-Agent | Identifies Foxpay as the sender. | Foxpay-Webhooks/1.0 |
X-Foxpay-Signature | HMAC-SHA256 of the raw request body using the shop webhook secret. Format: sha256=<hex>. | sha256=9f8c1b…e2a4 |
X-Foxpay-Event | Event type for routing without parsing the body. | transaction.status_changed |
X-Foxpay-Delivery | Unique delivery identifier (UUIDv4). Use as your idempotency key. | 3a9e7b2c-…-9c1f |
transaction.status_changed payload{
"event": "transaction.status_changed",
"transaction_id": "tx_123",
"order_id": "order_1001",
"status": "completed",
"amount": 12345,
"currency": "EUR",
"timestamp": "2026-04-28T08:31:00.000Z",
"metadata": {
"shop_id": "merchant_fxp_ABC12345",
"shop_name": "Foxpay Demo Merchant GmbH",
"customerId": "cust_42"
}
}amount is integer cents for custom integrations.metadata merges Foxpay context (`shop_id`, `shop_name`) with any merchant metadata you sent at initialization.timestamp is the delivery preparation time in ISO 8601 UTC.pending — initialized, waiting on the buyer.processing — buyer started the flow; Foxpay is in confirmation.completed / paid — final success state.failed — terminal failure surfaced by Foxpay or the provider.cancelled — terminal cancellation.expired — pending timed out (currently 30 days).Treat any status not in this list as opaque additive content; Foxpay reserves the right to expand the set in additive releases per the versioning policy.
Validate X-Foxpay-Signature before you mutate any merchant state. Use a constant-time comparison.
import crypto from 'node:crypto';
export function verifyFoxpaySignature(rawBody: string, headerValue: string, secret: string) {
const received = headerValue.replace(/^sha256=/, '');
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
if (received.length !== expected.length) {
return false;
}
return crypto.timingSafeEqual(
Buffer.from(expected, 'utf8'),
Buffer.from(received, 'utf8'),
);
}401 so Foxpay logs the failure.Foxpay is rolling out a persistent retry queue per merchant. Newly onboarded and migrated shops run on the queue; legacy shops continue on the 3-attempt path until they are flipped over.
30s, 2m, 10m, 30m, 2h, 6h, 24h (hot phase) then +24h, +24h, +36h, +48h (long-tail phase). Each delay carries ±20% jitter.30s, 45s, 60s; backoff between attempts 2s, 4s.400, 401, 403, 404, 410. Fix the failure and trigger redelivery from the panel.X-Foxpay-Delivery and an X-Foxpay-Attempt header (1-indexed). Treat re-arrivals of the same X-Foxpay-Delivery as duplicates.2xx after durable persistence.X-Foxpay-Delivery as the deduplication key for your processing pipeline.Merchants can trigger a webhook redelivery for any transaction from the panel — no support ticket needed.
/transactions (expand via the chevron) and switch to the Technical Info tab.GET /api/transactions/{transaction_id}/webhook/history for merchants who want to surface it in their own ops UI.When a merchant runs Integration Verification in the Foxpay panel, Foxpay sends a one-shot signed foxpay.webhook_verification event. Your endpoint must verify the signature and respond with the canonical handshake JSON below.
POST /your-webhook-url
Content-Type: application/json
X-Foxpay-Event: foxpay.webhook_verification
X-Foxpay-Signature: sha256=<hex>
X-Foxpay-Verification-Challenge: 3f1c4a6b-…
User-Agent: Foxpay-Verification/1.0
{
"event": "foxpay.webhook_verification",
"challenge": "3f1c4a6b-…",
"timestamp": "2026-04-28T08:31:00.000Z",
"merchantId": "merchant_fxp_ABC12345",
"shopId": "shop_ABC12345",
"expectedAuthMode": "bearer_token"
}HTTP/1.1 200 OK
Content-Type: application/json
{
"challenge": "3f1c4a6b-…",
"signatureValid": true
}Foxpay also accepts ok: true or verified: true for backwards compatibility. Standardize new merchant code on signatureValid.
custom_webhook_url on the store.{store-url}/wc-api/wc_gateway_foxpay and should not be reused for custom integrations.webhook_deliveries table for support visibility.