data has the same shape for every event in this group — only status/timing fields (and the differences noted below) vary.payment_link.attempt_failed — Fired when a payment attempt against the link fails or is abandoned. The link returns to PENDING and can be retried.payment_link.cancelled — Fired when the link is cancelled via POST .../cancel. Any charge still open is closed.payment_link.completed — Fired when a payment attempt succeeds. The link is now spent — pay_amount, pay_currency, completed_at and chain_id are populated.payment_link.created — Fired when a payment link is created, in PENDING status.payment_link.expired — Fired when expires_at passes with no successful payment.payment_link.processing — Fired when a customer starts a payment attempt against the link — a charge is now in flight.curl --location 'https://your-api-server.com' \
--header 'X-Woldy-Signature: MEUCIQD3v...' \
--header 'X-Woldy-Signature-Version: ed25519-v1' \
--header 'X-Woldy-Event-ID: wev_VQ6EA4np...' \
--header 'X-Woldy-Event-Type;' \
--header 'X-Woldy-Timestamp: 1737720000' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"id": "wev_VQ6EA4np...",
"branch_id": "cb_VQ6EA4np...",
"webhook_id": "wh_VQ6EA4np...",
"type": "payment_link.attempt_failed",
"api_version": "2024-01-01",
"created_at": 1737720000,
"data": {
"id": "pl_VQ6EA4np...",
"reference_type": "PAYMENT_LINK",
"status": "PENDING",
"source": "API",
"type": "FIXED",
"price_amount": "10.00",
"price_currency": "USD",
"external_id": "order_123",
"pay_amount": null,
"pay_currency": null,
"completed_at": null,
"chain_id": null,
"created_at": "2026-07-20T14:15:22Z"
}
}'