PUThttps://api.veriko.mx/v1/webhooks/{id}

Update a webhook endpoint

Audience
public
Auth
API key
Permission
webhooks:update
How-to guide →

Updates the receiving address, the subscribed events, or the status of an already registered endpoint. Only what arrives in the body changes: an absent field stays as it was, and a body with no editable field responds with an HTTP 422 status (with no_valid_fields in the body).

The signing secret does not change here. Changing the address leaves the same secret on the new endpoint, so a receiver that already validated signatures keeps validating them. To rotate it there is POST /v1/webhooks/{id}/regenerate-secret.

Setting the status to disabled stops deliveries without losing the history; that is the move while a downed receiver is being fixed, rather than deleting the endpoint and creating it again.

Parameters
ParameterInTypeRequiredDescription
id*pathstring (uuid)required

Unique identifier of the webhook endpoint (UUID v4).

e.g. f47ac10b-58cc-4372-a567-0e02b2c3d479
Parameters
ParameterTypeRequiredDescription
urlstring (uri) (?–2048)optional

New receiver URL. It is rejected if it does not resolve to a public address or is longer than 2048 characters and, in production, also if it does not use HTTPS.

e.g. https://example.com/webhooks/entregas
eventsarray<string> (items: 1–10)optional

New events the endpoint subscribes to. They replace the previous list. Between 1 and 10.

descriptionstring | nullnullable (?–255)optional

New free-form label to tell this endpoint apart from the others. null clears it; more than 255 characters responds 422 webhook_description_too_long.

e.g. Alta de pagos en el ERP
statusstring (enum)optional

Webhook status. active receives deliveries; disabled stops them.

e.g. active
Request
curl -X PUT 'https://api.veriko.mx/v1/webhooks/{id}' \
  -H 'Authorization: Bearer veriko_••••' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://webhook.example.com/platform",
    "events": [
      "validation.completed"
    ],
    "status": "active"
  }'

Python example — coming soon.

JavaScript example — coming soon.

PHP example — coming soon.

Response 200WebhookEndpoint — Webhook endpoint updated.
FieldTypeDescription
type*string

JSON:API resource type. Always webhook_endpoint.

e.g. webhook_endpoint
id*string (uuid)

Unique identifier of the webhook endpoint (UUID v4).

e.g. a1b2c3d4-e5f6-7890-abcd-ef0123456789
attributes*object

Webhook endpoint data (receiver URL, subscribed events, status, and secret).

url*string (uri)

URL that receives the webhook. In production it is rejected if it does not use HTTPS, if it resolves to a private address, or if it is longer than 2048 characters.

e.g. https://example.com/webhooks/entregas
events*array (items: 1–10, unique items)

Events the endpoint subscribes to, from 1 to 10.

description*string | nullnullable

Free-form label to tell this endpoint apart from the others.

e.g. Alta de pagos en el ERP
status*string

active receives deliveries. disabled was manually turned off. auto_disabled was turned off by the platform after exceeding the consecutive-failure threshold.

e.g. active
consecutive_failures*integer

Number of consecutive failures. Resets on the first success.

e.g. 0
last_delivery_at*TimestampUTC | null

Date and time of the last successful delivery, in ISO 8601 UTC. null when the endpoint has not completed a delivery yet.

secretstring

Shared secret for signature verification. Only present in the create and rotate-secret responses; omitted from every other response. It is used to validate the X-Webhook-Signature and X-Webhook-Signature-Timestamped headers on each delivery.

e.g. a0b1c2d3e4f5061728394a5b6c7d8e9f00112233445566778899aabbccddeeff
secret_hintstring

Last 4 characters of the secret, prefixed with .... Present on any response where the full secret is hidden.

e.g. ...4f2a
created_at*string (date-time)

ISO 8601 timestamp in UTC with an explicit Z suffix; for example, "2026-05-01T05:14:38Z". The *_at, *_end, *_start, and *_date fields follow this format. meta.datetime describes the same contract in the response.

e.g. 2026-05-01T05:14:38Z
updated_at*string (date-time)

ISO 8601 timestamp in UTC with an explicit Z suffix; for example, "2026-05-01T05:14:38Z". The *_at, *_end, *_start, and *_date fields follow this format. meta.datetime describes the same contract in the response.

e.g. 2026-05-01T05:14:38Z
Response status codesPUT /v1/webhooks/{id}
StatusClassDescriptionBody
2002xxWebhook endpoint updated.WebhookEndpoint
4004xxThe request body is empty or is not valid JSON, or the new URL does not resolve to a public address.ErrorResponse
4014xxAuthentication is required or the provided credentials are invalid.ErrorResponse
4034xxInsufficient permissions.ErrorResponse
4044xxnot_found: Endpoint does not exist or does not belong to the user.ErrorResponse
4134xxThe request body exceeds the maximum accepted size (body_too_large).ErrorResponse
4224xxInvalid data. Possible codes: webhook_url_invalid_type, webhook_url_empty, webhook_url_too_long, webhook_url_invalid_format, webhook_url_not_https, webhook_events_required, webhook_events_too_many, webhook_event_invalid, webhook_description_invalid_type, webhook_description_too_long, webhook_status_invalid, no_valid_fields. A description longer than 255 characters responds webhook_description_too_long. Every field-level error carries source.pointer.ErrorResponse
4294xxRate limit exceededErrorResponse
Errors from PUT /v1/webhooks/{id}
StatusCodeExample
400body_empty

The request body is empty.

Envelope
meta.request_id
c4d5e6f7a8b99b8a7f6e5d4c
400invalid_json

The body is not valid JSON.

Envelope
meta.request_id
d5e6f7a8b9c00c9b8a7f6e5d
400url_dns_failed

The host name could not be resolved.

Envelope
meta.request_id
d4e5f6a1b2c44c2b1a6f5e4d
400url_ssrf_blocked

The given URL resolves to a non-public address.

Envelope
meta.request_id
d4e5f6a1b2c55c2b1a6f5e4d
401unauthorized

Invalid or missing authentication credentials.

Envelope
meta.request_id
c4d5e6f7a8b99b8a7f6e5d4c
403permission_denied

You do not have permission to access this resource.

Envelope
meta.request_id
d5e6f7a8b9c00c9b8a7f6e5d
413body_too_large

The request body is too large.

Envelope
meta.request_id
1a2b3c4d5e6ff6e5d4c3b2a1
429rate_limit_exceeded

Rate limit exceeded. Try again in 45 seconds.

Envelope
meta.request_id
f7a8b9c0d1e22e1d0c9b8a7f
Response headers
  • Retry-After: integer — Seconds to wait before retrying. Matches the endpoint's rate-limit window (typically 60s for list endpoints, 1-5s for in-flight idempotent operations).
  • X-RateLimit-Limit: integer — Configured request cap for this bucket. It is emitted on every 429 and, on the authenticated API, also on successful responses, where it is the per-key cap of the account plan.
  • X-RateLimit-Remaining: integer — Requests remaining in the current window. Always 0 at the moment of the 429; on a successful response of the authenticated API it is what is left of the per-key cap.
  • X-RateLimit-Reset: integer — Absolute Unix epoch (seconds) when the window resets. Emitted on every 429, alongside Retry-After, and on successful responses of the authenticated API. Per-endpoint overrides exist (e.g. `rate_limited_login`).