curl -sS \
-X PATCH \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"name":"Updated webhook","enabled":true}' \
'https://api.0xinsider.com/api/v1/webhooks/{id}'import requests
url = "https://api.0xinsider.com/api/v1/webhooks/{id}"
payload = {
"name": "Updated webhook",
"enabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Updated webhook', enabled: true})
};
fetch('https://api.0xinsider.com/api/v1/webhooks/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.0xinsider.com/api/v1/webhooks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Updated webhook',
'enabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.0xinsider.com/api/v1/webhooks/{id}"
payload := strings.NewReader("{\n \"name\": \"Updated webhook\",\n \"enabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}HttpResponse<String> response = Unirest.patch("https://api.0xinsider.com/api/v1/webhooks/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Updated webhook\",\n \"enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/webhooks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Updated webhook\",\n \"enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"created_at": "2026-09-22T03:14:42.182366Z",
"event_types": [
"whale_trades_inserted"
],
"trade_filters": {},
"failure_count": 0,
"id": 1,
"name": "Production webhook (paused)",
"object": "webhook",
"retry_policy": {
"disable_after_consecutive_failures": 8,
"max_attempts": 8,
"retry_horizon_seconds": 7380,
"terminal_status": "dead_letter"
},
"secret_rotation": {
"status": "idle",
"overlap_expires_at": null
},
"status": "disabled",
"updated_at": "2026-09-22T03:14:46.963773Z",
"url": "https://example.com/0xinsider/webhook",
"verification_token_expires_at": "2026-09-23T03:14:44.903437Z",
"verified_at": null
},
"meta": {
"cached": false,
"cost": 1,
"request_id": "req_example"
},
"object": "webhook"
}Update a webhook
Update one webhook endpoint’s name, URL, event types, or paused state, and get the updated endpoint back.
curl -sS \
-X PATCH \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"name":"Updated webhook","enabled":true}' \
'https://api.0xinsider.com/api/v1/webhooks/{id}'import requests
url = "https://api.0xinsider.com/api/v1/webhooks/{id}"
payload = {
"name": "Updated webhook",
"enabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Updated webhook', enabled: true})
};
fetch('https://api.0xinsider.com/api/v1/webhooks/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.0xinsider.com/api/v1/webhooks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Updated webhook',
'enabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.0xinsider.com/api/v1/webhooks/{id}"
payload := strings.NewReader("{\n \"name\": \"Updated webhook\",\n \"enabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}HttpResponse<String> response = Unirest.patch("https://api.0xinsider.com/api/v1/webhooks/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Updated webhook\",\n \"enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/webhooks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Updated webhook\",\n \"enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"created_at": "2026-09-22T03:14:42.182366Z",
"event_types": [
"whale_trades_inserted"
],
"trade_filters": {},
"failure_count": 0,
"id": 1,
"name": "Production webhook (paused)",
"object": "webhook",
"retry_policy": {
"disable_after_consecutive_failures": 8,
"max_attempts": 8,
"retry_horizon_seconds": 7380,
"terminal_status": "dead_letter"
},
"secret_rotation": {
"status": "idle",
"overlap_expires_at": null
},
"status": "disabled",
"updated_at": "2026-09-22T03:14:46.963773Z",
"url": "https://example.com/0xinsider/webhook",
"verification_token_expires_at": "2026-09-23T03:14:44.903437Z",
"verified_at": null
},
"meta": {
"cached": false,
"cost": 1,
"request_id": "req_example"
},
"object": "webhook"
}Parameters
| Parameter | Description |
|---|---|
id | The endpoint to change. |
name | A new label, 1 to 100 characters. |
url | A new delivery URL, under the same rules as Create a webhook: public HTTPS on port 443, and unique on your account. A change sets status back to pending_verification, clears verified_at, and returns a fresh verification.token that is good for 24 hours. |
event_types | The complete list of event types to subscribe to, which replaces the current list. Send at least one value from Webhook events. |
enabled | false sets status to disabled and stops deliveries. true sets active when the endpoint is verified and the URL is unchanged, and pending_verification otherwise. |
Idempotency-Key header | Optional, and up to 255 characters. Reuse it only when you are retrying this exact request, on this same id. |
:443 is not a change, so it does not reset verification. Every successful PATCH sets failure_count back to 0.
A URL change that does take effect also cancels a staged secret rotation. Any prepared secret is dropped, and any overlap ends at once, so the endpoint returns to secret_rotation.status idle.
enabled: false moves every delivery still queued for this endpoint to dead_letter, and enabled: true resends none of them. Requeue each one with Redeliver a webhook delivery, or catch up from Event replay.Example
curl -X PATCH \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H "Idempotency-Key: webhook-update-2026-09-22" \
-H "Content-Type: application/json" \
-d '{"enabled": true}' \
"https://api.0xinsider.com/api/v1/webhooks/42"
Handle a 409 or a 422
| Answer | What it means | What to do |
|---|---|---|
409, error.reason webhook_delivery_in_progress | A delivery to this endpoint is in flight, so its URL cannot change yet. | Send the same request again once that delivery finishes. |
409, error.reason idempotency_in_progress | Your first request with this Idempotency-Key is still running. | Wait a few seconds, then send the same key and the same body again. |
422, error.param Idempotency-Key | The key was already used for a different request. | Pick a new key. One key belongs to one request. |
What it does not do
- Change the signing secret. Rotate a webhook secret swaps it at once, and Prepare a staged webhook secret followed by Activate a staged webhook secret hands over with a 1-hour overlap.
- Activate a new URL on its own. The new destination has to pass Verify a webhook before deliveries resume.
- Accept a URL another endpoint on your account already holds. That is
400witherror.paramurl. - Resend anything. Re-enabling an endpoint replays nothing that was dead-lettered while it was off.
Authorizations
Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).
Headers
Opt into strict query-name validation. The default is compatible: unknown names are ignored and reported in X-Query-Ignored. With strict, an unknown name returns 400 bad_request with error.reason unknown_query_parameter before the handler runs, including when its percent escape is incomplete.
strict Optional safe-retry key. Reuse the same value only when retrying the exact same mutation request body; a different body returns 422 and an in-flight matching request returns 409.
1 - 255Path Parameters
Webhook endpoint id owned by the authenticated API key user.
Body
Webhook fields to replace or preserve.
100Replacement public HTTPS callback URL on the default port 443, validated and checked for uniqueness exactly like the create url. HTTPS scheme/host case, trailing DNS dots and port 443 normalize; path/query case is preserved. Changing it resets status to pending_verification and returns a new verification token; the new destination must pass the verification challenge before deliveries resume.
1large_trade_inserted_v2, large_trades_inserted, whale_trades_inserted, live_sports_updated, trader_synced, whale_trader_synced, large_positions_updated, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, sharp_money_flow_detected, smart_money_flow_detected, export_job_ready, export_job_failed, export_job_expired, export_job_cancelled All present fields narrow large_trade_inserted_v2 delivery. Grade is observed at publication; ungraded trades do not match min_grade. An empty object matches every large trade.
Show child attributes
Show child attributes
Was this page helpful?