https://api.veriko.mx/v1/webhooksCreate a webhook endpoint
How-to guide →Registers an HTTPS endpoint that will receive the subscribed events. The URL must resolve to a public address: localhost and private ranges are rejected.
That secret verifies every delivery: the HMAC-SHA256 of the received body must match the X-{Brand}-Signature: sha256=<hex> header. Signing, retries and automatic deactivation are described in the webhooks architecture.
Each endpoint accepts between 1 and 10 events. The validation.* ones produce deliveries from the moment of subscription; billing.* are accepted as a valid subscription but do not produce deliveries yet.
The number of endpoints allowed depends on the account role. Once the cap is reached, creation responds webhook_limit_reached with the applied limit in meta.limit.
POST /v1/webhooks/{id}/test sends a synthetic delivery to the newly created endpoint; confirming that the receiver returns 2xx before directing real traffic to it is recommended.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string (uri) (?–2048) | required | HTTPS URL that receives the webhook. Must be HTTPS. e.g.https://example.com/webhooks/entregas |
events | array<string> (items: 1–10) | required | Events the endpoint subscribes to (1–10). |
description | string (?–255) | optional | Descriptive label for the endpoint. e.g.Alta de pagos en el ERP |
curl -X POST 'https://api.veriko.mx/v1/webhooks' \
-H 'Authorization: Bearer veriko_••••' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://webhook.example.com/platform",
"events": [
"validation.completed",
"validation.failed",
"validation.error",
"billing.payment_succeeded",
"billing.payment_failed"
],
"description": "Webhook plataforma completo"
}'Python example — coming soon.
JavaScript example — coming soon.
PHP example — coming soon.
| Field | Type | Description |
|---|---|---|
type* | string | Resource type, fixed for this operation. Part of the resource identity in the JSON:API envelope. Always webhook_endpoint |
id* | string (uuid) | Endpoint identifier. e.g.a1b2c3d4-e5f6-7890-abcd-ef0123456789 |
attributes* | object | Canonical webhook endpoint attributes (receiver URL, subscribed events, status, and secret). |
url | string (uri) | HTTPS receiver URL. Production rejects plain HTTP, URLs resolving to private IPs (SSRF), and URLs https://example.com/webhooks/entregas |
events | array | List of subscribed events. Maximum 10. |
description | string | nullnullable | Free-form endpoint label. e.g.Alta de pagos en el ERP |
status | string |
active |
consecutive_failures | integer | Consecutive failures counter. Resets on a success. e.g.0 |
last_delivery_at | TimestampUTC | null | UTC timestamp of the last delivery attempt (any status). |
secret | string | Shared secret for signature verification. Only present in the create and rotate-secret responses; omitted from every other response. e.g.whsec_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 |
secret_hint | string | Last 4 chars of the secret prefixed with ...4f2a |
created_at | string (date-time) | ISO 8601 timestamp in UTC with explicit 2026-05-01T05:14:38Z |
updated_at | string (date-time) | ISO 8601 timestamp in UTC with explicit 2026-05-01T05:14:38Z |
| Status | Class | Description | Body |
|---|---|---|---|
| 201 | 2xx | Endpoint created. The secret field appears in this response only and cannot be read again: it is what verifies the X-{Brand}-Signature: sha256=<hex> signature carried by every delivery. | No body |
| 400 | 4xx | The request body is empty or is not valid JSON. | ErrorResponse |
| 401 | 4xx | Authentication is required or the provided credentials are invalid. | ErrorResponse |
| 403 | 4xx | Insufficient permissions. | ErrorResponse |
| 413 | 4xx | The request body exceeds the maximum accepted size (body_too_large). | ErrorResponse |
| 422 | 4xx | The URL or the event list failed validation, or the account has reached its endpoint cap. | ErrorResponse |
| 429 | 4xx | Rate limit exceeded | ErrorResponse |
| Status | Code | Example |
|---|---|---|
| 400 | body_empty | The request body is empty. Envelope
|
| 400 | invalid_json | The body is not valid JSON. Envelope
|
| 401 | unauthorized | Invalid or missing authentication credentials. Envelope
|
| 403 | forbidden | You do not have permission to access this resource. Envelope
|
| 413 | body_too_large | The request body is too large. Envelope
|
| 422 | url_dns_failed | The host name could not be resolved. Envelope
|
| 422 | url_ssrf_blocked | The given URL resolves to a non-public address. Envelope
|
| 422 | validation_error | The url field is required. Envelope
|
| 422 | webhook_event_invalid | The given event does not exist. The rejected event is in meta.event. Envelope
|
| 422 | webhook_events_required | The endpoint must subscribe to at least one event. Envelope
|
| 422 | webhook_events_too_many | An endpoint accepts at most 10 events. Envelope
|
| 422 | webhook_limit_reached | The maximum number of allowed endpoints has been reached. The applied cap is in meta.limit. Envelope
|
| 422 | webhook_url_invalid_format | The URL is not a valid URL. Envelope
|
| 422 | webhook_url_not_https | The URL must use HTTPS. Envelope
|
| 422 | webhook_url_required | The url field is required. Envelope
|
| 422 | webhook_url_too_long | The URL cannot exceed 2,048 characters. Envelope
|
| 429 | rate_limit_exceeded | Rate limit exceeded. Try again in 45 seconds. Envelope
Response headers
|