These are observations, not accusations. A band of LOW, MEDIUM or HIGH describes how much of what we check we were able to confirm — it is not a judgement about the operator of an endpoint. Every signal, its weight and its rationale are published on the methodology page, and any operator can claim an endpoint, correct a fact or opt out.
What does this x402 endpoint charge?
0.002000 USDC as served — decoder refused
https://api.hyperextend.xyz/v1/candles/BTC/1m/latestCHALLENGE_MALFORMEDAn x402 challenge was served, but the strict decoder refused it.
Endpoint
| URL | https://api.hyperextend.xyz/v1/candles/BTC/1m/latest |
|---|---|
| Canonical | https://api.hyperextend.xyz/v1/candles/BTC/1m/latest |
| Endpoint id | 0fab13d9325287b2bea2eb8074c6880b |
| HTTP status | 402 |
| Latency | 1132 ms |
| Redirects | 0 |
| TLS | handshake okThe negotiated TLS version is not exposed to a Worker. |
| Wire form | both the v2 header and a v1 body |
| Bytes read | 3200 |
| Strict decoder | refusedInvalid PAYMENT-REQUIRED challenge: upstream-schema-invalid |
Payment
as servedThe decoder refused this challenge. The terms below were parsed out of what the endpoint served, so that whoever maintains it can see what we saw. They are not terms tx402 would pay.
| Price | 0.002000 USDC |
|---|---|
| Amount (atomic) | 2000 |
| Scheme | exact |
| Network | eip155:8453 in manifestRecognized means present in the tx402 signed release manifest. Nothing more is claimed. |
| Asset | USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 in manifestRecognized means present in the tx402 signed release manifest. Nothing more is claimed. |
| Pay to | 0x548fC289526ab2F0391D562a723cdA64Bbf1abc4 |
| Pay to declared dynamic | nox402 v2 has no on-the-wire declaration of a dynamic payTo, so this is usually unobservable. |
| Authorization window | 60s |
| Resource | https://api.hyperextend.xyz/v1/candles/BTC/1m/latest |
| MIME type | application/json |
| Description | The most-recent N OHLCV candles (≤5000). Same per-row pricing as the windowed read ($0.00001 base for main/spot, $0.000025 premium for HIP-3/HIP-4); candles lag ~2 days. |
| Facilitator | not observed |
Risk
Band: MEDIUM 76/100 · v1 · static_onlyA band describes how much of what we check we were able to confirm. It is not a judgement about the operator of an endpoint.
- Result: fail 25 The challenge does not decode under the strict x402 decoder tx402 uses before paying. challenge_decodes
- Result: pass 15 The challenge describes the endpoint that served it. resource_origin_match
- Result: pass 12 The amount is a canonical atomic integer. amount_canonical
- Result: pass 12 The recipient is a well-formed address for the declared network. pay_to_wellformed
- Result: pass 8 The network is in the tx402 signed release manifest. network_recognized
- Result: pass 8 The asset is in the tx402 signed release manifest for this network. asset_recognized
- Result: skip — The challenge named no facilitator. facilitator_known
- Result: pass 6 The payment scheme is one tx402 can route. scheme_known
- Result: pass 5 The endpoint was reached over a valid TLS connection. tls_ok
- Result: pass 4 The authorization window is within the maximum tx402 will sign for. timeout_sane
- Result: pass 3 No redirect downgraded the connection. redirect_scheme_downgrade
- Result: pass 3 The endpoint serves the x402 v2 header form. wire_form
- Result: pass 2 The amount is within the range we see for x402 endpoints. amount_magnitude_band
Security
challenge refused
The strict decoder refused this challenge
(TX402_PAYMENT_REQUIRED_INVALID), which is the finding that
matters most here. The checks below describe what could still be determined from what the endpoint
served.
A check that could not run reports skip, and a skip is never counted as a pass.
- Result: pass wire_form_detected Served as both.
- Result: skip base64_strict The decoder refused the challenge; the framing cannot be reported separately.
- Result: pass json_wellformed
- Result: pass x402_version_known Declared x402Version 2.
- Result: pass accepts_present The challenge offers 3 ways to pay.
- Result: pass size_within_limit Read 3200 bytes, within the probe's cap.
- Result: pass network_caip2_wellformed network: eip155:8453
- Result: pass network_recognized Recognized means present in the tx402 signed release manifest.
- Result: pass asset_recognized Recognized means present in the tx402 signed release manifest.
- Result: pass amount_atomic_canonical
- Result: pass amount_positive
- Result: pass pay_to_wellformed
- Result: pass max_timeout_sane
- Result: pass resource_origin_match
- Result: pass scheme_known
- Result: skip facilitator_known The challenge named no facilitator.
- Result: pass mime_type_wellformed mimeType: application/json
- Result: pass extra_wellformed `extra` carries 2 field(s), preserved verbatim.
- Result: skip amount_within_observed_range needs our data No prior observations of this endpoint.
- Result: skip recipient_matches_observed needs our data No prior observations of this endpoint.
Observed
| First seen | 2026-08-15T04:00:12Z |
|---|---|
| Last seen | 2026-08-15T14:34:39Z |
| Scans recorded | 2 |
| Availability (30d) | not measured yet |
| Latency p50 | not measured yet |
| 2026-08-15T05:30:35Z | first_seen: challenge_hash — → f2ac480d50497882064bf5a9d613cb17bb12f21463de7f803ef2323457ae8aa5 |
|---|
Test with tx402 →
Pre-filled with this endpoint's real terms. Your signer stays in your process — this service never sees a key, never asks for one, and cannot build a payment.
npx tx402 call "https://api.hyperextend.xyz/v1/candles/BTC/1m/latest" \
--max-spend "0.002000 USDC" \
--network "eip155:8453" \
--dry-run
# --dry-run stops after the policy decision. Nothing is signed and nothing is spent.
import { createTx402Client } from "tx402";
// Your signer stays in your process. tools.tx402.io never sees a key,
// never asks for one, and cannot build a payment.
import { signers } from "./signers.js";
const tx402 = createTx402Client({
signers,
policy: {
maxPerRequest: "0.002000 USDC",
allowedDomains: ["api.hyperextend.xyz"],
allowedNetworks: ["eip155:8453"],
},
});
// Policy and budget are committed before the signer is reachable, so a
// refusal here is a payment that was never authorized.
const response = await tx402.fetch("https://api.hyperextend.xyz/v1/candles/BTC/1m/latest");
from tx402 import Tx402Client, Policy
# Your signer stays in your process. tools.tx402.io never sees a key,
# never asks for one, and cannot build a payment.
tx402 = Tx402Client(
evm_signer=evm,
policy=Policy(
max_per_request="0.002000 USDC",
allowed_domains=["api.hyperextend.xyz"],
allowed_networks=["eip155:8453"],
),
)
# Policy and budget are committed before the signer is reachable, so a
# refusal here is a payment that was never authorized.
response = tx402.fetch("https://api.hyperextend.xyz/v1/candles/BTC/1m/latest")
curl -sS 'https://tools.tx402.io/api/v1/inspect?url=https%3A%2F%2Fapi.hyperextend.xyz%2Fv1%2Fcandles%2FBTC%2F1m%2Flatest'
# The same result as Markdown, for a terminal or an agent:
curl -sS -H 'Accept: text/markdown' 'https://tools.tx402.io/inspect?url=https%3A%2F%2Fapi.hyperextend.xyz%2Fv1%2Fcandles%2FBTC%2F1m%2Flatest'
The challenge, as served
Public data: the endpoint serves this to anyone who asks. It is shown exactly as it arrived, truncated to the documented cap.
eyJ4NDAyVmVyc2lvbiI6IDIsICJlcnJvciI6ICJwYXltZW50IHJlcXVpcmVkIiwgInJlc291cmNlIjogeyJ1cmwiOiAiaHR0cHM6Ly9hcGkuaHlwZXJleHRlbmQueHl6L3YxL2NhbmRsZXMvQlRDLzFtL2xhdGVzdCIsICJkZXNjcmlwdGlvbiI6ICJUaGUgbW9zdC1yZWNlbnQgTiBPSExDViBjYW5kbGVzIChcdTIyNjQ1MDAwKS4gU2FtZSBwZXItcm93IHByaWNpbmcgYXMgdGhlIHdpbmRvd2VkIHJlYWQgKCQwLjAwMDAxIGJhc2UgZm9yIG1haW4vc3BvdCwgJDAuMDAwMDI1IHByZW1pdW0gZm9yIEhJUC0zL0hJUC00KTsgY2FuZGxlcyBsYWcgfjIgZGF5cy4iLCAibWltZVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsICJzZXJ2aWNlTmFtZSI6ICJoeXBlcmV4dGVuZCIsICJ0YWdzIjogWyJoeXBlcmxpcXVpZCIsICJtYXJrZXQtZGF0YSIsICJjYW5kbGVzIiwgIm9wZW4taW50ZXJlc3QiLCAiaGlwLTMiLCAiaGlwLTQiLCAidHJhZGVzIiwgImxpcXVpZGF0aW9ucyJdLCAiaWNvblVybCI6ICJodHRwczovL2h5cGVyZXh0ZW5kLnh5ei9mYXZpY29uLnN2ZyJ9LCAiYWNjZXB0cyI6IFt7InNjaGVtZSI6ICJleGFjdCIsICJuZXR3b3JrIjogImVpcDE1NTo4NDUzIiwgImFzc2V0IjogIjB4ODMzNTg5ZkNENmVEYjZFMDhmNGM3QzMyRDRmNzFiNTRiZEEwMjkxMyIsICJhbW91bnQiOiAiMjAwMCIsICJwYXlUbyI6ICIweDU0OGZDMjg5NTI2YWIyRjAzOTFENTYyYTcyM2NkQTY0QmJmMWFiYzQiLCAibWF4VGltZW91dFNlY29uZHMiOiA2MCwgImV4dHJhIjogeyJuYW1lIjogIlVTRCBDb2luIiwgInZlcnNpb24iOiAiMiJ9fSwgeyJzY2hlbWUiOiAiZXhhY3QiLCAibmV0d29yayI6ICJoeXBlcmxpcXVpZDptYWlubmV0IiwgImFzc2V0IjogIlVTREM6MHg2ZDFlN2NkZTUzYmE5NDY3Yjc4M2NiN2M1MzBjZTA1NCIsICJhbW91bnQiOiAiMC4wMDIiLCAicGF5VG8iOiAiMHg1NDhmQzI4OTUyNmFiMkYwMzkxRDU2MmE3MjNjZEE2NEJiZjFhYmM0IiwgIm1heFRpbWVvdXRTZWNvbmRzIjogNjAsICJleHRyYSI6IHsiZGVzdGluYXRpb25EZXgiOiAic3BvdCJ9fSwgeyJzY2hlbWUiOiAiYmF0Y2gtc2V0dGxlbWVudCIsICJuZXR3b3JrIjogImVpcDE1NTo4NDUzIiwgImFzc2V0IjogIjB4ODMzNTg5ZkNENmVEYjZFMDhmNGM3QzMyRDRmNzFiNTRiZEEwMjkxMyIsICJhbW91bnQiOiAiMjAwMCIsICJwYXlUbyI6ICIweDU0OGZDMjg5NTI2YWIyRjAzOTFENTYyYTcyM2NkQTY0QmJmMWFiYzQiLCAibWF4VGltZW91dFNlY29uZHMiOiAzMDAsICJleHRyYSI6IHsicmVjZWl2ZXJBdXRob3JpemVyIjogIjB4MzcyMTgyNGEzMTE5N2RjREQyOTg0Y0Y0M2I5MkI2Y2M4QTg3YzBGYiIsICJ3aXRoZHJhd0RlbGF5IjogODY0MDAsICJuYW1lIjogIlVTRCBDb2luIiwgInZlcnNpb24iOiAiMiJ9fV0sICJleHRlbnNpb25zIjogeyJiYXphYXIiOiB7ImluZm8iOiB7ImlucHV0IjogeyJ0eXBlIjogImh0dHAiLCAicXVlcnlQYXJhbXMiOiB7Im4iOiAxMDAsICJkZXgiOiAibWFpbiJ9LCAibWV0aG9kIjogIkdFVCJ9LCAib3V0cHV0IjogeyJ0eXBlIjogImpzb24iLCAiZXhhbXBsZSI6IHsiaW50ZXJ2YWwiOiAiMW0iLCAib3Blbl90aW1lIjogMTcwMDAwMDAwMDAwMCwgImNsb3NlX3RpbWUiOiAxNzAwMDAwMDU5OTk5LCAibyI6ICI0MjAwMC4wIiwgImgiOiAiNDIxMDAuMCIsICJsIjogIjQxOTUwLjAiLCAiYyI6ICI0MjA4MC4wIiwgInYiOiAiMTIuNSIsICJuIjogMzQwfX19LCAic2NoZW1hIjogeyIkc2NoZW1hIjogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIiwgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ImlucHV0IjogeyJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyJ0eXBlIjogeyJ0eXBlIjogInN0cmluZyIsICJjb25zdCI6ICJodHRwIn0sICJtZXRob2QiOiB7InR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbIkdFVCIsICJIRUFEIiwgIkRFTEVURSJdfSwgInF1ZXJ5UGFyYW1zIjogeyJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyJuIjogeyJ0eXBlIjogImludGVnZXIifSwgImRleCI6IHsidHlwZSI6ICJzdHJpbmcifX0sICJyZXF1aXJlZCI6IFtdfSwgInBhdGhQYXJhbXMiOiB7InR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ImNvaW4iOiB7InR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIkFzc2V0IHN5bWJvbCwgZS5nLiBCVEMifSwgImludGVydmFsIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJDYW5kbGUgaW50ZXJ2YWwsIGUuZy4gMW0ifX0sICJyZXF1aXJlZCI6IFsiY29pbiIsICJpbnRlcnZhbCJdfX0sICJyZXF1aXJlZCI6IFsidHlwZSIsICJtZXRob2QiXSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2V9LCAib3V0cHV0IjogeyJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyJ0eXBlIjogeyJ0eXBlIjogInN0cmluZyJ9LCAiZXhhbXBsZSI6IHsidHlwZSI6ICJvYmplY3QifX0sICJyZXF1aXJlZCI6IFsidHlwZSJdfX0sICJyZXF1aXJlZCI6IFsiaW5wdXQiXX19fSwgImluc3RydWN0aW9ucyI6IHsic3VtbWFyeSI6ICJQYXltZW50IGlzIHJlcXVpcmVkIHZpYSB0aGUgeDQwMiBwcm90b2NvbCAodjIpLiBUaGUgNDAyIGBhY2NlcHRzYCBsaXN0cyB0aGUgYXZhaWxhYmxlIHBheW1lbnQgcmFpbHMgXHUyMDE0IHBheSB3aXRoIGFueSBPTkUgb2YgdGhlbTogcmVhZCB0aGUgUEFZTUVOVC1SRVFVSVJFRCBoZWFkZXIsIHNpZ24sIGFuZCByZXRyeSB3aXRoIGEgUEFZTUVOVC1TSUdOQVRVUkUgaGVhZGVyLiAoMSkgQmFzZSAoRVZNKTogdXNlIENvaW5iYXNlJ3Mgb2ZmaWNpYWwgeDQwMiBjbGllbnQgKGBwaXAgaW5zdGFsbCBcIng0MDJbZXZtXVwiYCkgZnJvbSBhIEJhc2UtbWFpbm5ldCBVU0RDIHdhbGxldCBcdTIwMTQgYSBwbGFpbiBFT0EsIG5vdCBhIHNtYXJ0IHdhbGxldC4gSXQgc2lnbnMgYW4gRUlQLTMwMDkgVVNEQyBhdXRob3Jpc2F0aW9uOyB5b3UgbmVlZCBVU0RDLCBub3QgRVRIICh0aGUgZmFjaWxpdGF0b3IgYnJvYWRjYXN0cyBhbmQgcGF5cyB0aGUgZ2FzKS4gKDIpIEh5cGVybGlxdWlkIChIeXBlckNvcmUpOiBwYXkgZGlyZWN0bHkgd2l0aCB0aGUgU0FNRSBVU0RDIHlvdSB0cmFkZSBhbmQgb3BlbiBwb3NpdGlvbnMgd2l0aCBvbiBIeXBlcmxpcXVpZCBcdTIwMTQgbm8gYnJpZGdpbmcsIG5vIHNlcGFyYXRlIHdhbGxldC4gU2lnbiBhIEh5cGVybGlxdWlkVHJhbnNhY3Rpb246U2VuZEFzc2V0IGFjdGlvbiAoZ2FzbGVzcywgbm8gZmFjaWxpdGF0b3IpIGFuZCB0aGUgc2VydmVyIHNldHRsZXMgaXQgb24tY2hhaW4uIiwgImNsaWVudCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29pbmJhc2UveDQwMiIsICJkb2NzIjogImh0dHBzOi8vaHlwZXJleHRlbmQueHl6L2RvY3MifX0=
SHA-256 of the canonicalized challenge: f2ac480d50497882064bf5a9d613cb17bb12f21463de7f803ef2323457ae8aa5
Raw signals
The exact input the scoring function was given. A signal we could not determine has
observed: false and contributes nothing to the score — it is never counted as a failure.
[
{
"id": "probe_ok",
"value": true,
"observed": true,
"detail": null
},
{
"id": "challenge_served",
"value": true,
"observed": true,
"detail": null
},
{
"id": "challenge_decodes",
"value": false,
"observed": true,
"detail": "Invalid PAYMENT-REQUIRED challenge: upstream-schema-invalid"
},
{
"id": "wire_form",
"value": "both",
"observed": true,
"detail": null
},
{
"id": "x402_version",
"value": 2,
"observed": true,
"detail": null
},
{
"id": "tls_ok",
"value": true,
"observed": true,
"detail": null
},
{
"id": "tls_protocol",
"value": null,
"observed": false,
"detail": "The negotiated TLS version is not exposed to the probe."
},
{
"id": "redirect_count",
"value": 0,
"observed": true,
"detail": null
},
{
"id": "redirect_scheme_downgrade",
"value": false,
"observed": true,
"detail": "Cross-scheme redirects are refused."
},
{
"id": "resource_origin_match",
"value": true,
"observed": true,
"detail": null
},
{
"id": "network_recognized",
"value": true,
"observed": true,
"detail": "Recognized means present in the tx402 signed release manifest."
},
{
"id": "asset_recognized",
"value": true,
"observed": true,
"detail": "Recognized means present in the tx402 signed release manifest."
},
{
"id": "facilitator_known",
"value": null,
"observed": false,
"detail": "The challenge named no facilitator."
},
{
"id": "amount_canonical",
"value": true,
"observed": true,
"detail": null
},
{
"id": "amount_magnitude_band",
"value": "micro",
"observed": true,
"detail": null
},
{
"id": "pay_to_wellformed",
"value": true,
"observed": true,
"detail": null
},
{
"id": "pay_to_declared_dynamic",
"value": false,
"observed": true,
"detail": null
},
{
"id": "timeout_sane",
"value": true,
"observed": true,
"detail": null
},
{
"id": "scheme_known",
"value": true,
"observed": true,
"detail": null
},
{
"id": "requirement_count",
"value": 3,
"observed": true,
"detail": null
},
{
"id": "challenge_size_bytes",
"value": 3200,
"observed": true,
"detail": null
},
{
"id": "first_seen_age_days",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "scan_count",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "availability_30d",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "latency_p50_ms",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "price_changes_90d",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "recipient_changes_90d",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "recipient_unstable_undeclared",
"value": null,
"observed": false,
"detail": "No history yet."
},
{
"id": "terms_changed_within_24h",
"value": null,
"observed": false,
"detail": "No history yet."
}
]