curl --request PATCH \
--url https://api.0xarchive.io/v1/webhooks/subscriptions/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '{}'import requests
url = "https://api.0xarchive.io/v1/webhooks/subscriptions/{id}"
payload = {}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.0xarchive.io/v1/webhooks/subscriptions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.0xarchive.io/v1/webhooks/subscriptions/{id}"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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))
}{
"success": true,
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"endpoint_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "market.liquidation",
"filters": {
"venue": "hyperliquid",
"symbols": [
"BTC",
"ETH"
],
"addresses": [
"0x6b9e773128f453f5c2c60935ee2de2cbc5390a24"
],
"params": {
"max_age_s": 3600
},
"conditions": [
{
"metric": "notional_usd",
"op": "greater_than_or_equal",
"value": 100000
}
],
"min_notional_usd": 100000
},
"enabled": true,
"created_at": "2023-11-07T05:31:56Z",
"status": "active",
"suppressed_count": 0,
"last_suppressed_count": 0,
"pause_message": "This rule was paused because the account reached its Pro plan limit of 50000 webhook deliveries in a day. The daily allowance resets at 2026-09-21 00:00 UTC, and a paused rule does not restart with it. Resume it with POST /v1/webhooks/subscriptions/resume.",
"paused_at": "2023-11-07T05:31:56Z",
"pause_reason": "deliveries_per_day_cap",
"suppressed_first_at": "2023-11-07T05:31:56Z",
"suppressed_last_at": "2023-11-07T05:31:56Z",
"last_paused_at": "2023-11-07T05:31:56Z",
"last_resumed_at": "2023-11-07T05:31:56Z",
"last_pause_reason": "<string>",
"last_suppressed_first_at": "2023-11-07T05:31:56Z",
"last_suppressed_last_at": "2023-11-07T05:31:56Z"
}
}{
"code": 400,
"error": "Failed to deserialize query string: limit: invalid digit found in string",
"error_code": "invalid_query_params",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}{
"code": 401,
"error": "Missing or invalid API key. Provide X-API-Key header."
}{
"code": 404,
"error": "Resource not found"
}{
"code": 429,
"error": "Rate limit exceeded"
}Update a webhook subscription
0xArchive API reference for Update a webhook subscription. Includes authentication, parameters, response shape, examples, and route-safe implementation notes.
curl --request PATCH \
--url https://api.0xarchive.io/v1/webhooks/subscriptions/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '{}'import requests
url = "https://api.0xarchive.io/v1/webhooks/subscriptions/{id}"
payload = {}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.0xarchive.io/v1/webhooks/subscriptions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.0xarchive.io/v1/webhooks/subscriptions/{id}"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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))
}{
"success": true,
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"endpoint_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "market.liquidation",
"filters": {
"venue": "hyperliquid",
"symbols": [
"BTC",
"ETH"
],
"addresses": [
"0x6b9e773128f453f5c2c60935ee2de2cbc5390a24"
],
"params": {
"max_age_s": 3600
},
"conditions": [
{
"metric": "notional_usd",
"op": "greater_than_or_equal",
"value": 100000
}
],
"min_notional_usd": 100000
},
"enabled": true,
"created_at": "2023-11-07T05:31:56Z",
"status": "active",
"suppressed_count": 0,
"last_suppressed_count": 0,
"pause_message": "This rule was paused because the account reached its Pro plan limit of 50000 webhook deliveries in a day. The daily allowance resets at 2026-09-21 00:00 UTC, and a paused rule does not restart with it. Resume it with POST /v1/webhooks/subscriptions/resume.",
"paused_at": "2023-11-07T05:31:56Z",
"pause_reason": "deliveries_per_day_cap",
"suppressed_first_at": "2023-11-07T05:31:56Z",
"suppressed_last_at": "2023-11-07T05:31:56Z",
"last_paused_at": "2023-11-07T05:31:56Z",
"last_resumed_at": "2023-11-07T05:31:56Z",
"last_pause_reason": "<string>",
"last_suppressed_first_at": "2023-11-07T05:31:56Z",
"last_suppressed_last_at": "2023-11-07T05:31:56Z"
}
}{
"code": 400,
"error": "Failed to deserialize query string: limit: invalid digit found in string",
"error_code": "invalid_query_params",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}{
"code": 401,
"error": "Missing or invalid API key. Provide X-API-Key header."
}{
"code": 404,
"error": "Resource not found"
}{
"code": 429,
"error": "Rate limit exceeded"
}X-API-Key with this request. See REST authentication.Shared request rules
Shared request rules
Machine schema
Machine schema
Authorizations
API key for authentication. Get yours at https://0xarchive.io/dashboard
Path Parameters
Subscription identifier.
"3c1f0a52-8d6b-4f0e-9b1a-6f2c4d8e9a10"
Body
Edit a rule in place. Send either field or both; a field you leave out is left alone. Changing the configuration never requires deleting and recreating the rule.
What a subscription matches on. Every key is checked against the event type's catalog declaration, so an unknown key, an undeclared parameter or a condition on an undeclared metric is refused rather than ignored. The stored config is the normalised form: venues and addresses lowercased, declared parameters filled in at their defaults, and operators written in their canonical spelling.
Hide child attributes
Hide child attributes
Venue or venues to match, from the event type's venues list. Accepts a single string, a pipe separated string or a list. Omit to match every covered venue.
"hyperliquid"
Instrument symbols to match. Omit to match every symbol.
["BTC", "ETH"]
Wallets to match, for an address scoped event type. Every address must already be on your watched list. Omit to match all of them.
[ "0x6b9e773128f453f5c2c60935ee2de2cbc5390a24" ]
Parameter values for the event type, keyed by the parameter names it declares. A declared parameter you leave out is stored at its default. A declared parameter may also be written at the top level of the config.
{ "max_age_s": 3600 }
Conditions on the event's metrics, all of which must hold for a delivery. At most 16 per subscription.
Hide child attributes
Hide child attributes
A metric declared by the event type.
"notional_usd"
Comparison to apply. Symbol spellings such as >= are accepted on the way in and stored in the canonical spelling shown here.
greater_than, greater_than_or_equal, less_than, less_than_or_equal, equal, not_equal, between, not_between, in, not_in, contains, not_contains, starts_with, ends_with, before, after, is_empty, is_not_empty "greater_than_or_equal"
What to compare against. A number, string, boolean or RFC 3339 timestamp for a single value comparison; a two entry [low, high] list for between and not_between; a non-empty list for in and not_in. Omitted for is_empty and is_not_empty.
100000
Shorthand for a notional_usd at-or-above condition, kept for compatibility. It is stored as a condition, and it is mirrored back here as the loosest notional lower bound the config carries.
100000
Your own on and off switch for the rule.
true
Response
The updated subscription
API response containing one webhook subscription.
true
A rule: one event type, one configuration, delivered to one endpoint.
Hide child attributes
Hide child attributes
Subscription identifier.
Endpoint that receives this rule's deliveries.
Event type this rule subscribes to.
"market.liquidation"
What a subscription matches on. Every key is checked against the event type's catalog declaration, so an unknown key, an undeclared parameter or a condition on an undeclared metric is refused rather than ignored. The stored config is the normalised form: venues and addresses lowercased, declared parameters filled in at their defaults, and operators written in their canonical spelling.
Hide child attributes
Hide child attributes
Venue or venues to match, from the event type's venues list. Accepts a single string, a pipe separated string or a list. Omit to match every covered venue.
"hyperliquid"
Instrument symbols to match. Omit to match every symbol.
["BTC", "ETH"]
Wallets to match, for an address scoped event type. Every address must already be on your watched list. Omit to match all of them.
[ "0x6b9e773128f453f5c2c60935ee2de2cbc5390a24" ]
Parameter values for the event type, keyed by the parameter names it declares. A declared parameter you leave out is stored at its default. A declared parameter may also be written at the top level of the config.
{ "max_age_s": 3600 }
Conditions on the event's metrics, all of which must hold for a delivery. At most 16 per subscription.
Hide child attributes
Hide child attributes
A metric declared by the event type.
"notional_usd"
Comparison to apply. Symbol spellings such as >= are accepted on the way in and stored in the canonical spelling shown here.
greater_than, greater_than_or_equal, less_than, less_than_or_equal, equal, not_equal, between, not_between, in, not_in, contains, not_contains, starts_with, ends_with, before, after, is_empty, is_not_empty "greater_than_or_equal"
What to compare against. A number, string, boolean or RFC 3339 timestamp for a single value comparison; a two entry [low, high] list for between and not_between; a non-empty list for in and not_in. Omitted for is_empty and is_not_empty.
100000
Shorthand for a notional_usd at-or-above condition, kept for compatibility. It is stored as a condition, and it is mirrored back here as the loosest notional lower bound the config carries.
100000
Your own on and off switch. Resuming a paused rule never changes it.
true
When the rule was created.
active is serving. auto_paused means delivery was paused for you and nothing is being sent; it stays paused until you resume it.
active, auto_paused "active"
Matches observed but not delivered since the current pause began. A lower bound, not a total: occurrences no active rule asked for are never looked at.
0
Matches suppressed during the last pause that has already ended.
0
Why this rule is paused and what clears it, in plain words. Present only while the rule is paused.
"This rule was paused because the account reached its Pro plan limit of 50000 webhook deliveries in a day. The daily allowance resets at 2026-09-21 00:00 UTC, and a paused rule does not restart with it. Resume it with POST /v1/webhooks/subscriptions/resume."
Start of the current gap. Null while the rule is serving.
Machine readable cause of the current pause, either deliveries_per_day_cap (the account reached its daily delivery limit) or plan_no_webhooks (the plan does not include webhook delivery). Null while the rule is serving. Render pause_message for people.
"deliveries_per_day_cap"
First suppressed match of the current pause.
Most recent suppressed match of the current pause.
Start of the last pause that has already ended.
When that pause ended.
Cause of the last pause that has already ended, in the same vocabulary as pause_reason.
First suppressed match of that pause.
Most recent suppressed match of that pause.
Was this page helpful?