Webhooks
update_webhook_subscription
writeUpdate webhook subscription
Move a subscription to another endpoint, or point it at a different event topic.
Overview
Changes a webhook subscription topic or destination URL. Only the fields sent change. The signing secret is unchanged and is not returned, so moving a destination does not rotate it. A subscription its integration provider manages is refused rather than changed here. It requires the webhooks:write scope and an idempotency_key.
Permission
Requires thewebhooks:writepermission. A connection without it answersinsufficient_scopenaming the permission to approve.
Annotations
Prerequisites
- A subscription id from list_webhook_subscriptions.
- At least one of topic or url.
- A merchant has connected this store and approved the webhooks:write scope.
Side effects
- Changes where future events of that topic are delivered, as outbound HTTPS requests to the new URL.
- Leaves the signing secret as it was.
- Claims the idempotency_key for at least 24 hours.
Arguments
The subscription id, from list_webhook_subscriptions. An integer, not an opaque string.
The event topic to deliver, from list_webhook_event_types. Expected to grow: tolerate unknown values.
One of: product:created, order:created, form:submitted
The destination, which must be a public HTTPS address Sign Customiser can reach. A private, loopback or plain-HTTP address is refused.
A client-generated key unique to this logical write, such as a UUID. Required: repeating the call with the same key and the same arguments replays the original result instead of writing twice, and the same key with different arguments is an idempotency_key_conflict. A dry run claims no key.
Result
The subscription as it now stands, without its secret. There is no changed-field list: /api/v3 reports none.
The subscription as it now stands. Never carries the signing secret: the secret is readable only when the subscription is created.
Error cases
The connection was approved without webhooks:write.
Send idempotency_key. It is required for this write.
The subscription belongs to an integration provider and has to be changed there, not through this connector.
No subscription with that id belongs to this store. Call list_webhook_subscriptions.
An unknown topic, whose allowed_values the problem repeats, or a URL that is not a public HTTPS address.
Move a subscription to a new endpoint
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_webhook_subscription",
"arguments": {
"webhook_id": 42,
"url": "https://example.com/webhooks/sign-customiser-v2",
"idempotency_key": "293a4b5c-6d7e-4f01-8c6d-7e8f90123456"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
"store": {
"id": 12,
"name": "Demo Signs"
},
"subscription": {
"id": 42,
"topic": "order:created",
"url": "https://example.com/webhooks/sign-customiser-v2",
"created_at": "2026-07-22T00:00:00Z",
"updated_at": "2026-07-22T00:05:00Z"
}
}
}
}A provider-managed subscription is refused (error)
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_webhook_subscription",
"arguments": {
"webhook_id": 43,
"url": "https://example.com/webhooks/elsewhere",
"idempotency_key": "293a4b5c-6d7e-4f01-8c6d-7e8f90123456"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"isError": true,
"structuredContent": {
"error": {
"code": "provider_managed_subscription",
"title": "Provider-managed subscription",
"detail": "This subscription is managed by its integration provider and cannot be changed through API v3.",
"recovery": "This subscription belongs to an integration provider. Change it in that provider rather than here."
}
}
}
}