Appearance
Create a webhook​
POST
/v1/webhooks
Requires WEBHOOKS_MANAGE, granted by WEBHOOKS_WRITE (bundles)
Creates a webhook that sends the chosen event types to your URL. The response includes the webhook's signing secret, which you need to verify deliveries: it's shown only once and can't be retrieved later, so store it securely. The URL must use HTTPS and resolve to a public IP address, and a key restricted to sub-accounts can't manage webhooks.
Request Body​
application/json
JSON
{
"url": "https://hooks.example.com/valr",
"eventTypes": [
"FIAT_DEPOSIT_CREDITED",
"FIAT_WITHDRAWAL_STATUS_UPDATE"
],
"description": "Treasury reconciliation"
}
Responses​
Created
application/json
JSON
{
"subscription": {
"identifier": "0b8f5d2e-7a41-4c3b-9e6d-2f1a8c7b5e90",
"scopeKind": "ENTITY",
"scopeLabel": "Entity",
"url": "https://hooks.example.com/valr",
"eventTypes": [
"FIAT_DEPOSIT_CREDITED",
"FIAT_WITHDRAWAL_STATUS_UPDATE"
],
"active": true,
"description": "Treasury reconciliation",
"signingSecretFingerprint": "7477002c",
"createdAt": "2026-10-23T08:00:00.214367Z",
"updatedAt": "2026-10-23T08:00:00.214367Z"
},
"signingSecret": "EXAMPLE-SIGNING-SECRET-do-not-use-000000000"
}
Samples​
Errors
| HTTP | Error | When |
|---|---|---|
| 400 | -113INVALID_JSON | The body isn't valid JSON. |
| 400 | -11INVALID_REQUEST | The body is empty or a field fails validation; validationErrors lists each failing field. |
| 400 | -18122WEBHOOK_SUBSCRIPTION_LIMIT_REACHED | Your business already has the maximum number of webhooks. Delete one you no longer need, then try again. |
Plus the errors common to all signed endpoints.