Skip to main content
Forte delivers signed webhook events to your backend endpoint whenever a payment status changes. For VDG purchases, deliver the item to the user only after receiving a payment_approved event.

Setup Overview

1

Authenticate

Obtain an access token using your client credentials.
2

Create a subscription

Register your webhook endpoint with Forte via POST /notifications/v1/subscriptions.
3

Receive and verify events

Forte will POST signed events to your endpoint. Verify the signature using your signing_key and respond with 200.

Managing Subscriptions

Create a Subscription

Response:
Store the signing_key securely. It is used to verify the authenticity of all incoming webhook events.
Subscription limitsAttempting to enable a subscription beyond this limit returns 429.

List Subscriptions

Enable / Disable a Subscription

Update a Subscription

Delete a Subscription

Subscription deletion is irreversible.

Test a Subscription

Send a test event to confirm your endpoint is reachable:
Returns 200 if your endpoint responds with 200, otherwise 502.

Receiving Webhooks

Your endpoint must respond with HTTP 200 for every webhook received.
If Forte does not receive a 200, it will retry 3 times before marking the webhook as failed. Subscriptions that repeatedly fail may be automatically disabled.

Verifying Signatures

Forte signs all webhooks with HMAC-SHA256 using the signing_key returned when you created the subscription. The signature is included in the X-Forte-Payments-Webhook-Signature request header. Always verify this signature before processing any payload.

Replaying Webhooks

If your endpoint was unavailable during a period, replay all webhooks from that window:

Webhook Payloads

Payment Status Flow

Approved, Declined, and Expired are terminal states. No further events follow.

Payment Created

Sent when the user initiates a payment session.

Payment Approved

Sent when payment settles. Deliver the item to the user upon receiving this event.

Payment Declined

Sent when the card is declined or a crypto transaction fails.
If a card is declined before a 3DS challenge is presented, payment_declined fires immediately with no preceding payment_created event.

Payment Expired

Sent when the user is inactive for 30 minutes and the session times out.