curl -sS -D - -o /dev/null \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Accept: text/event-stream' \
'https://api.0xinsider.com/api/v1/mcp'import requests
url = "https://api.0xinsider.com/api/v1/mcp"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.0xinsider.com/api/v1/mcp', 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/mcp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.0xinsider.com/api/v1/mcp"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.0xinsider.com/api/v1/mcp")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"jsonrpc": "2.0",
"id": null,
"error": {
"code": -32004,
"message": "This server offers no server-to-client stream: it sends no notifications, so there is nothing to listen for on GET. Send JSON-RPC requests with POST."
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}Remote MCP GET
A GET on the remote MCP endpoint answers 405 Method Not Allowed, because the server sends no stream. Send every request as a POST.
curl -sS -D - -o /dev/null \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Accept: text/event-stream' \
'https://api.0xinsider.com/api/v1/mcp'import requests
url = "https://api.0xinsider.com/api/v1/mcp"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.0xinsider.com/api/v1/mcp', 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/mcp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.0xinsider.com/api/v1/mcp"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.0xinsider.com/api/v1/mcp")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"jsonrpc": "2.0",
"id": null,
"error": {
"code": -32004,
"message": "This server offers no server-to-client stream: it sends no notifications, so there is nothing to listen for on GET. Send JSON-RPC requests with POST."
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}405 with Allow: POST. Every JSON-RPC request goes over Remote MCP POST instead.
Headers
| Header | Rule |
|---|---|
Origin | Checked first, and only when the request carries one. It has to be a 0xinsider host, or the request answers 403 with JSON-RPC -32000. |
MCP-Protocol-Version | One of 2025-11-25, 2025-06-18, 2025-03-26, or 2024-11-05. Any other value answers 400 with JSON-RPC -32600, before the credential is checked. Leave it out and the request is served as 2025-03-26. |
Authorization: Bearer | Required. The same API key or OAuth token as tools/call. Without it you get 401 and the WWW-Authenticate challenge, which is where a client that has only run the public handshake learns to start the OAuth flow. |
Mcp-Session-Id | The id from initialize. The server echoes it on the response when you send it. |
Response
| Part | Value |
|---|---|
| Status | 405 Method Not Allowed |
Allow | POST, the one method this endpoint serves. |
X-Mcp-Error-Code | -32004 |
| Body | A JSON-RPC error object with code -32004, saying this server offers no stream and that requests go over POST. |
405 is the expected answer, not a failure. A conforming client, the reference @modelcontextprotocol/sdk included, reads it as “no stream at this endpoint” and does not ask again. Until September 22, 2026 the same GET answered 200 with text/event-stream and closed the body at once, which clients treated as a dropped connection and reopened about once a second.
Example
curl -i \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H "Mcp-Session-Id: $SESSION_ID" \
"https://api.0xinsider.com/api/v1/mcp"
What it does not return
- A stream. The body is one JSON-RPC error object, not
text/event-stream. - A tool result. Read that from the POST response.
- A notification. The server sends none, which is why this method answers
405. - An answer for a key in
?token=. That answers401witherror.reasonapi_key_in_query, the same as POST. - A public handshake.
initialize,ping, andtools/listneed no credential, but they are POST methods, and this GET always needs one.
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 Session ID minted by the server on initialize.
The negotiated MCP protocol revision, sent on every request after initialize (MCP Streamable HTTP transport). Accepted values: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Any other value answers HTTP 400 with JSON-RPC error -32600. Absent, the request is served as 2025-03-26.
2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 Was this page helpful?