Update a webhook

Overview

Change a subscription's URL, label, event filter, or settings. Send only what changes.

Use this when you move your endpoint or want different events.

You'll need the subscription id.

The subscription is updated. The secret is unchanged; to replace it, use Rotate the signing secret.

Prerequisites

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

POST /api/v1/partner/webhooks/{webhookSubscriptionId}/update

Authentication

Partner token

  • Only partner users can call it; other tokens get 403.
  • Only your own partner's subscriptions: any other id, including another partner's, gets 404.

Rate limit

This endpoint has no rate limit.

Request parameters

ParameterInTypeRequiredDescription
webhookSubscriptionIdpathintegerYesThe subscription's id, from List your webhooks.

Request body

FieldTypeRequiredDescription
labelstringNoYour name for the subscription. Up to 255 characters; can't be empty when sent.
webhook_urlstringNoYour endpoint's HTTPS URL. Up to 2048 characters.
is_activebooleanNofalse pauses deliveries; true turns them back on.
delivery_kindstringNoimmediate or batch. You can have one of each, so switching to the kind you already have elsewhere gets 422.
batch_interval_hoursintegerNoHours between batches: 1, 2, 4, 6 or 12. Required when you switch delivery_kind to batch.
eventsarray of stringsNoReplaces the event filter (immediate only), by value from the events catalogue; only immediate events can be picked. [] or null: all immediate events. Ignored on a batch subscription (stored as null).
payload_modestringNoImmediate only: full or minimal. A batch subscription is always full.

Request payload

{
  "label": "Updated webhook label",
  "webhook_url": "https://partner.example.com/hooks/sau-v2",
  "is_active": true,
  "payload_mode": "minimal"
}

Response body

The payload is inside data.

FieldTypeDescription
dataobjectThe updated subscription.
data.idintegerThe subscription's id (webhookSubscriptionId).
data.partner_company_idintegerYour partner id.
data.labelstringYour name for the subscription.
data.webhook_urlstringWhere deliveries are sent.
data.eventsarray of strings or nullThe event filter. null: all immediate events. Always null on a batch subscription.
data.payload_modestringfull (the review, who did it, and the history entry) or minimal (event name and ids only). Always full on a batch subscription.
data.delivery_kindstringimmediate (each event as it happens) or batch (one cache_invalidation ping per location per interval).
data.batch_interval_hoursinteger or nullHours between batches: 1, 2, 4, 6 or 12. null on an immediate subscription.
data.delivery_labelstringThe delivery type in words: immediate, hourly batch or every N hours.
data.last_batch_dispatched_atstring or nullWhen the last batch was sent (ISO 8601). Set to the creation time for a new batch subscription; null on an immediate one.
data.is_activebooleanWhether deliveries are being sent.
data.hmac_secret_fingerprintstringThe first 16 characters of the SHA-256 hash of the signing secret, so you can tell which secret is current. The secret itself is never returned here.
data.last_succeeded_atstring or nullWhen a delivery last succeeded (ISO 8601), or null.
data.last_failed_atstring or nullWhen a delivery last failed (ISO 8601), or null.
data.last_failure_reasonstring or nullWhy the last delivery failed, or null.
data.consecutive_failure_countintegerFailed deliveries in a row since the last success.
data.created_atstringWhen the subscription was created (ISO 8601).
data.updated_atstringWhen it last changed (ISO 8601).

Response payload

{
  "data": {
    "data": {
      "id": 3,
      "partner_company_id": 5,
      "label": "Updated webhook label",
      "webhook_url": "https://partner.example.com/hooks/sau-v2",
      "events": null,
      "payload_mode": "minimal",
      "delivery_kind": "immediate",
      "batch_interval_hours": null,
      "delivery_label": "immediate",
      "last_batch_dispatched_at": null,
      "is_active": true,
      "hmac_secret_fingerprint": "335b947fe611b6b2",
      "last_succeeded_at": null,
      "last_failed_at": null,
      "last_failure_reason": null,
      "consecutive_failure_count": 0,
      "created_at": "2026-06-16T10:25:29+00:00",
      "updated_at": "2026-06-16T10:26:02+00:00"
    }
  }
}

Examples

Success payload

See Response payload.

Error payload

403 Not a Partner token

{
  "message": "Only partner-admin users can manage webhook subscriptions.",
  "status": "error",
  "errors": []
}

404 Subscription not found

{
  "message": "Subscription not found.",
  "status": "error",
  "errors": []
}

422 Invalid values

{
  "message": "The label field is required. (and 1 more error)",
  "errors": {
    "label": [
      "The label field is required."
    ],
    "webhook_url": [
      "The webhook url field must be a valid URL."
    ]
  }
}

422 You already have one of this kind

{
  "message": "A batch webhook already exists for this partner. Switch the other slot first.",
  "errors": {
    "delivery_kind": [
      "A batch webhook already exists for this partner. Switch the other slot first."
    ]
  }
}
StatusMeaning
200The subscription was updated.
401The token is missing, expired or invalid.
403The token isn't a Partner token.
404No subscription with this id belongs to your partner.
422A field is invalid, an event can't be picked, or you already have a subscription of the new kind.
500Unexpected server error.

Example request

curl --request POST \
  --url "https://production-api.shoutaboutus.com/api/v1/partner/webhooks/3/update" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"label": "Updated webhook label", "webhook_url": "https://partner.example.com/hooks/sau-v2", "is_active": true, "payload_mode": "minimal"}'

Did this page help you?