curl --request PATCH \
--url https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id} \
--header 'Content-Type: application/json' \
--data '
{
"name": "Production events (v2 receiver)",
"url": "https://api.example.com/webhooks/bachs/v2",
"event_types": [
"checkout.completed",
"collection.succeeded",
"collection.failed",
"payout.paid",
"refund.paid"
],
"event_source": "all",
"enabled": true
}
'const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Production events (v2 receiver)',
url: 'https://api.example.com/webhooks/bachs/v2',
event_types: [
'checkout.completed',
'collection.succeeded',
'collection.failed',
'payout.paid',
'refund.paid'
],
event_source: 'all',
enabled: true
})
};
fetch('https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}"
payload = {
"name": "Production events (v2 receiver)",
"url": "https://api.example.com/webhooks/bachs/v2",
"event_types": ["checkout.completed", "collection.succeeded", "collection.failed", "payout.paid", "refund.paid"],
"event_source": "all",
"enabled": True
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}"
payload := strings.NewReader("{\n \"name\": \"Production events (v2 receiver)\",\n \"url\": \"https://api.example.com/webhooks/bachs/v2\",\n \"event_types\": [\n \"checkout.completed\",\n \"collection.succeeded\",\n \"collection.failed\",\n \"payout.paid\",\n \"refund.paid\"\n ],\n \"event_source\": \"all\",\n \"enabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"endpoint_id": "whe_a1e823c073ab743ce5969ceef2db4d42",
"name": "Production events (v2 receiver)",
"url": "https://api.example.com/webhooks/bachs/v2",
"enabled": true,
"disabled_at": null,
"disabled_reason": null,
"event_types": [
"checkout.completed",
"collection.succeeded",
"collection.failed",
"payout.paid",
"refund.paid"
],
"event_source": "all",
"created_at": "2026-03-09T10:00:00.000Z",
"updated_at": "2026-03-11T09:22:04.000Z"
}{
"detail": "Invalid request parameters",
"error_code": "VALIDATION_ERROR",
"errors": [
{
"field": "amount",
"message": "Amount must be a positive decimal string",
"type": "value_error"
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Validation failed for one or more fields",
"error_code": "VALIDATION_ERROR",
"doc_url": "https://docs.bachs.io/api-reference/error-reference#general",
"errors": [
{
"field": "name",
"message": "This field is required",
"type": "missing"
}
]
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}Update a webhook endpoint
Update an endpoint’s name, URL, or subscribed events, or turn it on or off. Only the fields you send are changed. Send {"enabled": true} to turn back on an endpoint we turned off after repeated failures; see When an endpoint keeps failing. Requires the webhooks:write scope.
curl --request PATCH \
--url https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id} \
--header 'Content-Type: application/json' \
--data '
{
"name": "Production events (v2 receiver)",
"url": "https://api.example.com/webhooks/bachs/v2",
"event_types": [
"checkout.completed",
"collection.succeeded",
"collection.failed",
"payout.paid",
"refund.paid"
],
"event_source": "all",
"enabled": true
}
'const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Production events (v2 receiver)',
url: 'https://api.example.com/webhooks/bachs/v2',
event_types: [
'checkout.completed',
'collection.succeeded',
'collection.failed',
'payout.paid',
'refund.paid'
],
event_source: 'all',
enabled: true
})
};
fetch('https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}"
payload = {
"name": "Production events (v2 receiver)",
"url": "https://api.example.com/webhooks/bachs/v2",
"event_types": ["checkout.completed", "collection.succeeded", "collection.failed", "payout.paid", "refund.paid"],
"event_source": "all",
"enabled": True
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}"
payload := strings.NewReader("{\n \"name\": \"Production events (v2 receiver)\",\n \"url\": \"https://api.example.com/webhooks/bachs/v2\",\n \"event_types\": [\n \"checkout.completed\",\n \"collection.succeeded\",\n \"collection.failed\",\n \"payout.paid\",\n \"refund.paid\"\n ],\n \"event_source\": \"all\",\n \"enabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"endpoint_id": "whe_a1e823c073ab743ce5969ceef2db4d42",
"name": "Production events (v2 receiver)",
"url": "https://api.example.com/webhooks/bachs/v2",
"enabled": true,
"disabled_at": null,
"disabled_reason": null,
"event_types": [
"checkout.completed",
"collection.succeeded",
"collection.failed",
"payout.paid",
"refund.paid"
],
"event_source": "all",
"created_at": "2026-03-09T10:00:00.000Z",
"updated_at": "2026-03-11T09:22:04.000Z"
}{
"detail": "Invalid request parameters",
"error_code": "VALIDATION_ERROR",
"errors": [
{
"field": "amount",
"message": "Amount must be a positive decimal string",
"type": "value_error"
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Validation failed for one or more fields",
"error_code": "VALIDATION_ERROR",
"doc_url": "https://docs.bachs.io/api-reference/error-reference#general",
"errors": [
{
"field": "name",
"message": "This field is required",
"type": "missing"
}
]
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}Path Parameters
The webhook endpoint's ID.
Body
Fields to update on a webhook endpoint. Only the fields you send are changed.
Replaces the endpoint's label. Omit it to leave the current label unchanged.
"Production events (v2 receiver)"
Moves delivery to a different HTTPS URL. Events already queued for the old URL are retried against the new one, so cut over only once the new receiver is live.
"https://api.example.com/webhooks/bachs/v2"
Replaces the whole subscription list rather than adding to it, so send every type you still want. Omit the field to leave the current list untouched; sending an empty array is rejected.
collection.succeeded, collection.failed, collection.underpaid, checkout.completed, checkout.expired, payout.created, payout.paid, payout.failed, refund.created, refund.paid, refund.failed, conversion.completed, conversion.failed, customer.created, customer.updated, dispute.created, dispute.updated, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, invoice.created, invoice.paid, invoice.payment_failed ["collection.succeeded"]
Changes which account's events reach this endpoint. account: only your own account's events. connect: only the events of accounts you own. all: both. Omit it to leave the current setting unchanged.
account, connect, all "all"
Send false to stop all deliveries to this endpoint, or true to turn it back on. Turning it on clears its failure history, disabled_at and disabled_reason, but events from while it was off are not sent; resend them if you need them. Omit it to leave the endpoint as it is.
true
Response
The updated endpoint.
A webhook endpoint: a URL Bachs delivers events to, and the events it is subscribed to.
Use this identifier to fetch, update, delete, or rotate the secret on this endpoint, and to scope event listings to it.
"whe_a1e823c073ab743ce5969ceef2db4d42"
The label you gave the endpoint. It is never sent to the endpoint itself.
"Production events"
When true, matching events are delivered here. When false, nothing is sent to this URL, not even retries that were already queued, and events from while it was off are not sent later. We set it to false ourselves when deliveries keep failing; see disabled_reason and When an endpoint keeps failing.
true
The event types this endpoint receives, stored lowercase. Anything not listed is never delivered here, so add a type before you rely on it.
collection.succeeded, collection.failed, collection.underpaid, checkout.completed, checkout.expired, payout.created, payout.paid, payout.failed, refund.created, refund.paid, refund.failed, conversion.completed, conversion.failed, customer.created, customer.updated, dispute.created, dispute.updated, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, invoice.created, invoice.paid, invoice.payment_failed ["collection.succeeded", "collection.failed"]
When the endpoint was created, as an ISO 8601 timestamp in UTC.
"2026-03-09T10:00:00.000Z"
When the endpoint was last changed, as an ISO 8601 timestamp in UTC. Rotating the signing secret updates this.
"2026-03-09T10:00:00.000Z"
When we turned this endpoint off because its deliveries kept failing, as an ISO 8601 timestamp in UTC. null while the endpoint is enabled, and when you turned it off yourself. See When an endpoint keeps failing.
"2026-03-12T14:05:00.000Z"
Why we turned this endpoint off. consecutive_failures: every delivery to it failed for at least 72 hours, with no success in between, and we emailed a warning at least 48 hours earlier. null while the endpoint is enabled, and when you turned it off yourself.
consecutive_failures, null "consecutive_failures"
Which account's events reach this endpoint. account: only events that happened on your own account. connect: only events that happened on accounts you own. all: both.
account, connect, all "account"

